아두이노프로세싱 프로그래밍

Processing sound.cipher 그래픽 건반 예제

coding art 2018. 7. 17. 19:43
728x90

______________________________________________________________________________________________________________________________


sound.cipher examples에서 Bing 과 playNote, playPhrase, PianoPhrase 명령을 사용해 동요 연주를 해보았다. 이에 추가하여 그래픽 건반 예제를 다루어보자. 그래픽 건반 예제인 keyTrigger를 살펴보자.

예제를 불러내면 제대로된 코드가 나오지 않으므로 반드시 사이트에 첨부한 코드를 가져다 사용하기 바란다.

keyTrigger 예제를 실행하면 위와 같이 1옥타브 건반이 나타난다. 프로그래머의 속성 상 마우스를 가져가보게 되는데 그렇게 해서는 소리가 나지 않는다. 반드시 코드 내용을 훓어 보도록 하자. 아래 그림과 같이 소문자 문자 키가 건반과 매핑이 되어 있음을 알 수 잇다.



문자 ‘a’는 pitch 59에 해당하는 소리이다. 1씩 증가시켜 가면서 70에 해당하는 ‘u’키를 사용하게끔 코딩하였다. 아울러 검은 색 건반은 키보드에서 한줄 위인 w부터 시작된다. 물론 이 건반을 순서대로 누른다고 해서 도레미파... 소리가 나는 것은 아니며 단지 어떻게 피아노 건반을 그래픽하며 어떻게 키보드와 pitch를 대응시키느냐는 방법론을 제시하는 수준이다.

아울러 검은색 건반 소리를 내려면 반음 차이를 주어야 하는데 sound,cipher 동요 연주를 해보면 도레미파... 즉 반음이 들어가는 파가 나오는데 경험적으로 보면 소숫점 이하의 값을 가지는 pitch를 사용해야 할 필요가 있다. 하지만 이 예제에서는 정수형 pitch 값만 허용되고 있을 따름이며 완전히 그래픽 건반의 원리를 데모해 주는 수준의 코드임에 유의하자.

아무래도 비쥬얼라이제이션 목적으로 코딩을 하려면 keysNoteMap[문자] 명령 대신 playNote 명령을 사용해서 코딩해야 할 듯싶다. 아쉽기는 하지만 코드가 실행된다는 것으로 만족하고 그냥 소리만 들어 본 후 넘어 가도록 한다.

//keyTrigger

/**

  • Create a music keyboard from the qwerty keyboard.
  • Capture key presses and map the ascii key number
  • to a MIDI pitch number and play a note immediatly.
  • A SoundCipher example by Andrew R. Brown
    */

import arb.soundcipher.*;
SoundCipher sc;
//SoundCipher sc = new SoundCipher(this);
boolean[] keysNotePlay;
int[] keysNoteMap;

void setup(){
sc = new SoundCipher(this);
keysNotePlay = new boolean[127];
keysNoteMap = new int[127];
keysNoteMap['a'] = 59;
keysNoteMap['s'] = 60;
keysNoteMap['d'] = 62;
keysNoteMap['f'] = 64;
keysNoteMap['g'] = 65;
keysNoteMap['h'] = 67;
keysNoteMap['j'] = 69;
keysNoteMap['w'] = 61;
keysNoteMap['e'] = 63;
keysNoteMap['t'] = 66;
keysNoteMap['y'] = 68;
keysNoteMap['u'] = 70;
size (250,150);
}

void keyReleased(){
keysNotePlay[key] = false;
}

// keep processing 'alive'
void draw() {
//white tut
fill(255);
if( keyPressed && keysNotePlay['a'] == true){
fill(204);
}
rect (10, 10, 30, 100);

fill(255);
if( keyPressed && keysNotePlay['s'] == true){
fill(204);
}
rect (40, 10, 30, 100);
fill(255);
if( keyPressed && keysNotePlay['d'] == true){
fill(204);
}
rect (70, 10, 30, 100);
fill(255);
if( keyPressed && keysNotePlay['f'] == true){
fill(204);
}
rect (100, 10, 30, 100);
fill(255);
if( keyPressed && keysNotePlay['g'] == true){
fill(204);
}

rect (130, 10, 30, 100);
fill(255);
if( keyPressed && keysNotePlay['h'] == true){
fill(204);
}

rect (160, 10, 30, 100);
fill(255);
if( keyPressed && keysNotePlay['j'] == true){
fill(204);
}

rect (190, 10, 30, 100);

//black tut
fill(0);
if( keyPressed && keysNotePlay['w'] == true){
fill(204);
}
rect (32,10,15,60);
fill(0);
if( keyPressed && keysNotePlay['e'] == true){
fill(204);
}
rect (62,10,15,60);
fill(0);
if( keyPressed && keysNotePlay['t'] == true){
fill(204);
}
rect (122,10,15,60);
fill(0);
if( keyPressed && keysNotePlay['y'] == true){
fill(204);
}
rect (152,10,15,60);
fill(0);
if( keyPressed && keysNotePlay['u'] == true){
fill(204);
}
rect (182,10,15,60);
if( keyPressed && keysNotePlay[key] == false){
sc.playNote(keysNoteMap[key], 100, 1);
keysNotePlay[key] = true;
}
}//End