아두이노 코딩-104: Processing sound.cipher에 의한 “카페에서” 편곡 연주

codingart(66)
Published in
#kr
Words
546
Reading
3 min
Listen
Play
8y

noname01.png
“카페에서” 편곡 과정에서 마디를 시작할 때에 나타나는 쉼표 처리를 위한 코딩을 고려해 보자. 음악 연주 코딩은 계명(pitch), 소리크기(dynamics:loudness), 박자(duration) 세가지로 구성이 된다. 쉼표는 계명 자체가 부여되지 않으며, 숨쉬는 소리는 소리 크기를 0으로 처리하도록 하고 박자는 당연히 부여해야 한다.

noname02.png

Processing의 sound.cipher 라이브러리는 여러 면에서 특성이 있다. setup()에서 playPhrase를 실행하면 지정된 템포로 음악이 연주가 되며 아울러 draw() 도 함께 실행이 되는데 playPhrase 와 draw() 에서의 명령들 간에 싱크로나이징은 곤란한 듯하다. 따라서 아두이노와 HTTP 통신에 의해 LED ON OFF 로 비쥬얼라이제이션은 곤란하며 대신 템포에 맞춰서 난수 발생기에 의해 생성되는 간단한 도형들을 그래픽화면에 비춰주는 독립적이면서도 템포는 맞춰주는 비쥬얼라이제이션이 가능한 듯하다.
노래 제목 “카페에서” 의 분위기를 조금 맞춰보기위해서 그래픽 화면을 약간 어두운 청색에 난수를 이용한 별모양을 디스플레이 해 보았다.

동영상을 통해 sound.cipher에 의한 연주와 비쥬얼라이제이션을 감상해 보자.

사이트에 첨부한 편곡 코딩을 실행시켜 보기 바란다.
//Caffeteseu_01

import arb.soundcipher.*;
SoundCipher part = new SoundCipher(this);

void setup() {
size(600,600);
background(0,65,255);
part.tempo(60);
part.repeat(2);
// preliminary
// -- re mi re si ra sl ra mi mi sl ra sl si re si ra sl mi mi re mi ra sl re si ra sl re re re re re re re re mi re si ra
float[] pitches = { 72, 72, 74, 72, 69, 67, 65, 67, 62, 62, 65, 67, 65, 69, 72, 69, 67, 65, 62, 62, 60, 62, 67, 65, 72, 69, 67, 65, 60, 60, 60, 60, 60, 60, 60, 60, 74, 72, 69, 67,
// -- re mi re si ra sl si si ra sl mi- -- re re mi sl re si ra re mi re ra re mi fa
72, 72, 74, 72, 69, 67, 65, 69, 69, 67, 65, 62, 72, 60, 60, 62, 65, 72, 69, 67, 72,74, 72, 67, 60, 62, 64,
// -- si si ra si re mi sl mi re si -- ra ra si ra sl mi sl sl re si ra sl sl ra si si re re mi
72, 69, 69, 67, 69, 72, 74, 77, 74, 72, 69, 67,67,67,69,67,65,62,65,65, 72, 69, 67, 65, 65, 67, 69, 69, 72, 72, 74,
// -- mi mi re mi sl -- ra sl mi re si re -- mi sl ra sl sl mi re re mi re ra re
74, 74, 74, 72, 74, 77, 79, 79, 77, 74, 72, 69, 72, 74, 74, 77, 79, 77, 77, 74, 72, 72, 74, 72, 67, 72,
// mi sl sl sl sl mi sl si si re re re re mi re -- mi sl ra sl ra si sl
74,77,77,77,77,74,77,69, 69,72,72,72,72,74,72, 74,74,77,79, 77,79, 81,79,
// sl mi sl mi re si re mi re -- ra ra si ra sl mi sl sl re si ra sl
77,74,77,74,72, 69,72,74,72, 67,67,67,69,67,65,62,65,65,60,69,67,65};
float[] dynamics ={ 0,100,100,100,100, 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
0,100,100,100,100, 100,100,100,100,100,100,100, 0,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
0,100,100,100,100, 100,100,100,100,100,100, 0,100,100,100,100,100, 100,100,100,100,100,100,100,100, 100,100,100,100,100,100,
0,100,100,100,100, 100,100,0,100,100,100,100,100,100,0,100,100,100,100,100,100.0,100,100,100,100,100,
100,100,100,100,100, 100,100,100,100,100,100,100,100,100,100,
0,100,100,100,100, 100,100,100, 100,100,100,100,100, 100,100,100,100,
0,100,100,100,100, 100,100,100,100,100,100,100,100};
float[] durations={.25,.25,.25,.25,0.5, .13,.12,.25,1.5,.13,.12,.13,.12,1.5,.13,.12,.13,.12,1.5,.13,.12,.13,.12, 1,.25,.25,.25,.25,.25,0.5,.25, 1,.25,0.5,.25, 1,.13,.12,.13,.12,
.25,.25,.25,.25,.50, .25,.25,.25,.25,.25,.12, 1.13, .25,.25,.25,.25,.25, .5,.25,.25,.13,.12,.25,.25,.25,.25,.25,.25,
.25,.25,.25,.25,.25, .75,.25, .5,.12,.13,1, .25,.25,.25,.25,.25,.25,.25,.25,.25,.25,.25,.13,.12,.13,.12,.13,.12,.13,.12,
.25,.25,.25,.25,.25, .5, .25,.25,.25,.25, 1,.25,.25, .25,0.5,.25,.25,.25,.25,.25, .25,.13,.12,.25,.25, 1,
.13,.12,.13,.12,.25,.25,.75,.25,.13,.12,.13,.12,.25,.25, 1,
.25,0.5,.25,0.5,0.5,1.5,.25,.25,
.75,.25,0.5,.25,.25,.75,.13,.12, 1,
.25,.25,.25,.25,.25,.25,.25,.25,.25,.25,.25,.25, 1};
part.playPhrase(pitches, dynamics, durations);
}

void draw() {
fill(color(random(256), random (256), random(256)));
star(random(600), random(600), random(30), random(10),5);
delay(1000);
}

void star(float x, float y, float radius1, float radius2, int npoints) {
float angle = TWO_PI / npoints;
float halfAngle = angle/2.0;
beginShape();
for (float a = 0; a < TWO_PI; a += angle) {
float sx = x + cos(a) * radius2;
float sy = y + sin(a) * radius2;
vertex(sx, sy);
sx = x + cos(a+halfAngle) * radius1;
sy = y + sin(a+halfAngle) * radius1;
vertex(sx, sy);
}
endShape(CLOSE);
}//End