Plug-In‎ > ‎

MIDI2CV

MIDI 신호를 Control Voltage로 바꾸어 컴퓨터나 미디 악기로 아날로그 사운드를 구현할 수 있다.
 
Attachment : Circuit
 

또 다른 예제 사이트
 
LM358는 Single Supply로 GND와 +12V로 입력하면 됨
이 때의 CV out의 범위는 0V ~ 12V가 아니라  -> 0V ~(12 - offset voltage) V
 
 
 
MIDI IN -> PWM -> CV out
 
MIDI 신호를 마이크로 컨트롤러에서 처리하여 원하는 음의 높이와 길이의 PWM신호로 내보내면 위의 PWM-CVout회로를 거쳐서 CV로 출력이 된다.
 
 
 
많은 사람들이 헷갈려하는 점)
 
Q. PWM는 아날로그 신호를 흉내내는 것으로 알고 있는데 그냥 CV로 사용하면  안되나요?
A. PWM(Pulse Width Modulation)은 고저의 두가지 신호를 교차하여 출력하는데 이 과정에서 두 신호의 비율을 조정하여 비슷한 효과를 낼 뿐 실제로 아날로그 신호는 아닙니다. 
 
 우리가 쓰는 
 Arduino to CV Schematic

클릭해서 크게보고
MIDI connector 는 앞에서 본 모습입니다.
주의 하시길!!
Original MIDI to CV 회로에 보면 PWM frequency가 19.53kHz로 나온다.
이는 PIC칩의 External Xtal이 20MHz으로 사용하고 분해능을 2^10(1024)로 설정하였기 때문이다.
 
같은 방법으로 하면 아뒤이노의 Xtal인 16MHz을 같은 분해능으로 쪼개면 약 16kHz로 거의 흡사한 PWM frequency를 만들 수 있다.
 
타이머 설정과 관련한 상세한 설명은 다음 페이지를 참조 




Arduino MIDI to CV to be updated

사용법:
Arduino.cc 에서 Arduino IDE 다운로드하고
밑에 프로그램 복사하여 프로그래밍한다.
연결 법은 왼쪽 회로도 참조
byte incomingByte;
byte note;
byte velocity;

int pwm = 6;
int statusLed = 13;   // select the pin for the LED
int action = 2; //0 =note off ; 1=note on ; 2= nada

//setup: declaring iputs and outputs and begin serial
void setup() {
  pinMode(pwm, OUTPUT);  
  analogWrite(pwm, 0);

  setPwmFrequency(pwm, 8);
  
  pinMode(statusLed, OUTPUT);   // declare the LED's pin as output

  //start serial with midi baudrate 31250 or 38400 for debugging
  Serial.begin(31250);        
  //digitalWrite(statusLed, HIGH);  
}

//loop: wait for serial data, and interpret the message
void loop () {
  
  if (Serial.available() > 0) {
    
    // read the incoming byte:
    incomingByte = Serial.read();
    
    //Serial.print(incomingByte); Serial.println('///');
  
    // wait for as status-byte, channel 1, note on or off
    if (incomingByte== 144){ // note on message starting starting
      action=1;
    }else if (incomingByte== 128){ // note off message starting
      action=0;
    }else if (incomingByte== 208){ // aftertouch message starting
       //not implemented yet
    }else if (incomingByte== 160){ // polypressure message starting
       //not implemented yet
    }else if ( (action==0)&&(note==0) ){ // if we received a "note off", we wait for which note (databyte)
      note=incomingByte;
      playNote(note, 0);
      note=0;
      velocity=0;
      action=2;
    }else if ( (action==1)&&(note==0) ){ // if we received a "note on", we wait for the note (databyte)
      note=incomingByte;
    }else if ( (action==1)&&(note!=0) ){ // ...and then the velocity
      velocity=incomingByte;
      playNote(note, velocity);
      note=0;
      velocity=0;
      action=0;
    }else{
      //nada
    }
  }
}


////////////////////////////////////////수정된 부분
void playNote(byte note, byte velocity){
  int value;

  //since we don't want to "play" all notes we wait for a note between 36 & 44
  value = (note - 20.6) * 0.083 / 5 * 255;
  if(velocity == 0) value = 0;
  analogWrite(pwm, value);
  
  Blink();
}


void setPwmFrequency(int pin, int divisor) 
  {
    byte mode;
    if(pin == 5 || pin == 6 || pin == 9 || pin == 10) 
      {
        switch(divisor) 
        {
          case 1: mode = 0x01; break;
          case 8: mode = 0x02; break;
          case 64: mode = 0x03; break;
          case 256: mode = 0x04; break;
          case 1024: mode = 0x05; break;
          default: return;
        }
      
        if(pin == 5 || pin == 6) 
        {
          TCCR0B = TCCR0B & 0b11111000 | mode;
        } 
        else 
        {
          TCCR1B = TCCR1B & 0b11111000 | mode;
        }
      } 
      else if(pin == 3 || pin == 11) 
      {
        switch(divisor) 
        {
          case 1: mode = 0x01; break;
          case 8: mode = 0x02; break;
          case 32: mode = 0x03; break;
          case 64: mode = 0x04; break;
          case 128: mode = 0x05; break;
          case 256: mode = 0x06; break;
          case 1024: mode = 0x7; break;
          default: return;
        }
        
        TCCR2B = TCCR2B & 0b11111000 | mode;
      }
  }

void Blink()
{
  digitalWrite(statusLed, HIGH);
  delay(50);
  digitalWrite(statusLed, LOW);
  delay(50);
}
ą
fakebookhouse,
2009. 12. 19. 오전 4:46
Ċ
fakebookhouse,
2009. 12. 28. 오전 7:47
Comments