______________________________________________________________________________________________________________________________
Processing 라이브러리 중에서 음악 연주를 가능하게 하는 sound.cipher 라이브러리를 이미 소개하였다. 그대로 설치가 되었으면 UltimateSong 과 Bing 에제를 체크해 보자. 이 에제들은 결국 sound.cipher 라이브러리를 사용하여 어떻게 음악 연주곡으로 편곡하는 방법을 대표적으로 제시하고 있다.
sound.cipher 라이브러리를 사용하여 어떻게 단 10분 만에 오픈소스 음악을 준비하는지 예를 들어 설명 하도록 한다.
헤더 영역에서 라이브러리를 불러들임과 동시에 new 선언을 가져간다.
import arb.soundcipher.*;
SoundCipher sc = new SoundCipher(this);
setup()에서 두 가지를 준비한다. 하나는 음악과 동시에 눈을 즐겁게 해주는 visulaization 을 위한 그래픽 화면을 사각형 형태로 설정하자.
아울러 두번째로는 실수형 어레이 형태로 노래 한곡 전체의 계명(pitches), 소리크기(dynamics), 지속시간(durations)를 입력한다. 이는 아두이노에서 melodyTone 명령 사용을 위한 준비 작업과 거의 동일하다.
// Mi Ra Sol Ra Sol Ra
float[] pitches = { 62, 67, 65, 67, 65, ∙∙∙ };
float[] dynamics ={100,120,100,100,100,∙∙∙ };
float[] durations ={ 1,0.5,0.5,1, 0.5,0.5,∙∙∙ };
이 작업 후 다음 명령에 의해 노래 연주가 이루어진다.
sc.playPhrase(pitches, dynamics, durations);
sound.ciper에는 3가지 음악 연주 기능이 있다. 음 하나를 내는 playNote, 음악 한 소저이나 한곡 전체를 연주하는 playPhrase, 동시에 여러 음을 합성해서 내는 playChord 명령이 있다. 동요 수준의 간단한 연주로는 playPhrase 가 적절하다.
음악 한곡을 다 연주하기 위해서는 어느 정도 시간이 필요한데 이 시간 동안에 draw()에서 동시 멀티 태스킹이 가능하며 setup()에서 준비한 그래픽 화면에 난수명령 즉 random(숫자)을 사용하여 0에서 숫자 사이의 난수를 발생시켜 사각형의 마주보는 대각선 위치의 좌표를 생성한다. 사각형의 색상도 난수를 사용한다. 아울러 음악의 템포에 맞춰 적절한 시간 지연을 주도록 한다.
void draw() {
fill(color(random(256), random (256), random(256)));
rect(random(300), random(300), random(80), random(80));
delay(700);
}
만약 아두이노와 합주를 한다면 아두이노가 난수를 생성하여 Processing의 HTTP 클라이언트 통신으로 받아 와 사용하고 아울러 아두이노가 LED 비쥴얼라이제이션을 담당하면 좋을 듯하다.
이상의 노력으로 동영상에서 동요 연주와 visulaization을 유튜브에서 감상해 보자.
자신의 PC에 스피커나 헤드폰이 설치되었는지 확인해 보고 첨부된 코드를 Processing 편집기에서 실행해 보자.
//Mother_Sister_Song_Draw_01
import arb.soundcipher.*;
SoundCipher sc = new SoundCipher(this);
void setup() {
size(200,200);
// Mi Ra Sol Ra Sol Ra Mi Mi Re Mi Sol Re Mi Ra Do Si Ra HRe DO Si Ra Sol Mi Sol Ra Ra LRa Mi Mi Re Ra Mi Ra Si Do Si Ra Sol Ra Mi Ra Re Do Si Ra Sol Mi Sol Si Sol Ra
float[] pitches = { 62, 67, 65, 67, 65, 67, 62, 62, 60, 62, 65, 60, 62, 67, 70, 69, 67, 72, 70, 69, 67, 65, 62, 65, 67, 67, 55, 62, 62, 60, 67, 62, 67, 69, 70, 69, 67, 65, 67, 62, 67, 72, 70, 69,67, 65, 62, 65, 69, 65, 67};
float[] dynamics ={100,120,100,100,100,120,100,100,100,120,100,100,100,120,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};
float[] durations={ 1,0.5,0.5, 1,0.5,0.5, 1, 1,1.5,0.5,0.5,0.5, 3, 1,0.5,0.5, 1,0.5,0.5, 1, 1,1.5,0.5,0.5,0.5, 3, 1, 1, 1, 1, 1, 1,0.5,0.5,0.5,0.5,0.33,0.33,0.33, 3, 1, 1, 1, 1, 1, 1,1.5,0.5, 0.5,0.5, 3};
sc.playPhrase(pitches, dynamics, durations);
}
void draw() {
fill(color(random(256), random (256), random(256)));
rect(random(200), random(200), random(100), random(100));
delay(700);
}
'아두이노프로세싱 프로그래밍' 카테고리의 다른 글
Processing sound.cipher 그래픽 건반 예제 (0) | 2018.07.17 |
---|---|
Processing sound.cipher PlayPhase 연주효과 코딩 (0) | 2018.07.15 |
Processing 클라이언트에 의한 Ethernet 웹서버 Red & Blue LED analogWrite 밝기 제어 (0) | 2018.07.12 |
Processing 클라이언트에 의한 Ethernet 웹서버 Red & Green LED ON OFF (0) | 2018.07.11 |
아두이노 코딩에 의한 RC 저주파 필터 회로 실험 (0) | 2018.07.09 |