heretic

ZOOM MS-CDR70 컨트롤러 제작

heretic

​​

ZOOM MS-CDR70

공간계 페달중에 이만한 물건이 없다. 수십가지 코러스 ,리버브, 딜레이는 물론이고 노이즈게이트, 인벨롭필터, 이퀄라이저, 부스터 등등이 없는 기능이 없다. 사용법도 매우 직관적이라 꾹꾹이 대여섯개를 늘어놓고 조합하듯 쓸 수 있다.

옛날에는 저가이펙터 이미지가 강해 별 관심이 없었던 브랜드였지만, 이 물건은 대체로 평가가 좋아 구입했고 매우 만족스럽다. 앞으로 몇년간은 바꾸지 않을 것같다.

조합된 이펙트체인은 자동으로 저장되는데, 이를 패치라 하며 1번에서 50번까지이다. 즉 50가지 패치를 미리 만들어놓고 골라서 쓸 수가 있다.

하지만 패치를 이동하는 것이 매우 불편하다. 하나뿐인 풋스위치는 현재 화면에 보이는 단일 이펙트를 켜고 끄는 용도이다. 패치를 바꾸려면 손으로 노브를 누르고, 돌리고, 다시 눌러야한다. 유일한 단점이면서 정말 불편하다.

인기제품이니까 패치컨트롤러는 별도로 만들어서 팔아먹겠지 하는 생각에 찾아봤는데 없다. 이 회사 장사할 줄도 모른다...

대신 컨트롤러를 직접 만들어 쓰는 양덕들이 있다는 것을 알게되었다. 따라쟁이인 나도 한번 만들어보자 해서 아두이노라는 것을 배우게되었는데 이런 신세계를 이제야.... ㄷㄷㄷ
​​

아두이노 미니, 호스트쉴드, 모멘터리스위치, FND로 회로를 구성했다. 간단하지만 사실 여기까지가 가장 힘들었다. 아두이노가 뭔지부터 배워야했으니ㅠㅠ

직접 코딩해서 보드에 업로드해야한다. 처음에 안맞는 보드를 사서 꽤 오랫동안 삽질을 지속했다. 한동안 포기하고있다가 보드를 바꾸니 그냥 되더라... 얕은 지식이 문제다.

인클로저는 폴리카보네이트 재질을 써야 안깨진다.

반투명 검정으로 도색

조립이 완료된 모습

이왕 만드는거 페달보드도 간지나게 새로 만들었다.


패치는 1에서 10번까지 바꿀 수 있다. 많이 써봐야 5개 정도이니 충분하고도 남는다. 기능이 워낙 단순해서 오류 여지가 없다. 양덕들 컨트롤러는 스위치도 많고 여러 모드가 가능하던데......

동작 영상


참고하실분 보시라고 소스코드를 공개한다. 아두이노프로미니는 3.3V 보드와 5V 보드가 있는데 모양이 완전히 같다. 호스트쉴드가 3.3V만 지원하기 때문에 반드시 확인하고 구입해야한다. 

#include <Usb.h>

#include <usbh_midi.h>

USB  Usb;

USBH_MIDI Midi(&Usb);

byte fnd[10][7] = {{0,0,0,0,1,1,0}, {1,1,0,1,1,0,1}, {1,0,0,1,1,1,1}, {0,0,1,0,1,1,1}, {1,0,1,1,0,1,1},

                  {1,1,1,1,0,1,1}, {0,0,0,1,1,1,0}, {1,1,1,1,1,1,1}, {1,0,1,1,1,1,1}, {1,1,1,1,1,1,0}};

byte patch = 0;

boolean btn = false;


void setup() {

  for( byte i=2; i<9; i++ ) pinMode(i, OUTPUT);           // fnd

  pinMode(A0, INPUT_PULLUP);                              // 업버튼

  pinMode(A1, INPUT_PULLUP);                              // 다운버튼

  Usb.Init();

}


void loop() {

  while( digitalRead(5)==0 && digitalRead(6)==0 ) SendMIDI(patch);    // 부팅후 fnd 안켜진상태에서 패치 1번 입력

  byte u = digitalRead(A0);                 // 업버튼

  byte d = digitalRead(A1);                 // 다운버튼

  if( u*d==0 && btn==false) {               // 버튼 눌렀을때

    patch = (patch-u+d+10)%10;              // 번호 0 ~ 9 순환

    SendMIDI(patch);

    btn=true;                               // 버튼이 눌려있는동안 한번만 실행

    delay(50);

  }

  if( u*d==1 ) {

    btn=false;

    delay(50);

  }

}


void SendMIDI(byte num) {

  Usb.Task();

  if( Usb.getUsbTaskState()==USB_STATE_RUNNING ) {

    byte Message[2]={0xC0, num};

    Midi.SendData(Message);

    for(byte i=2; i<9; i++) digitalWrite(i, fnd[num][i-2]);

    delay(50);

  }

}