The GEN Routines
Csound의 서브루틴 발생기능을 GENS라고 부른다. 이 서브루틴 각각(20개가 넘는)은 컴퓨터를 기능의 세밀한 부분과 웨이브 테이블로 최대한으로 활용한다. 예를 들어 GEN5와 GEN7의 서브루틴은 함수곡선이나 직선의 부분으로부터 기능을 세우고 ; GEN9와 GEN10의 서브루틴은 사인곡선의 가중된 총양의 구성으로 된 합성파형을 만들고 ;GEN20의 서브루틴은 전형적인 스펙트럼 분석과 미량 포장에 쓰였던 Hamming윈도우와 Kaiser윈도우와 같이 표준윈도우 기능을 실행하고, GEN21의 서브루틴은 Gaussian, Cauchy와 Poison과 같이 임의의 구별과 다른 것들을 계산하고 ; GEN1의 서브루틴은 미리 녹음되어있는 사운드 파일로부터 looping-oscillator loscil처럼 Csound의 어떤 부호에 의한 처리를 위하여 f-table로 데이터를 옮길 것이다.
어떤 f-table을 요구하거나 당신의 오케스트라에서 악기가 어떻게 쓰이느냐는 완전히 당신에게 달려있다. 이것은 일반 상식의 재료나 취미가 될 수 있다. instr 106에서 루핑 looping-oscillator의 샘플파일에 근거한 loscil에서 나는 오케스트라로 하나의 샘플을 읽기를 원한다. 나는 GEN1을 택할 것이다. instr 102에서 내가 어떤 두개의 웨이브에 frequency modulate 하기 위하여 선택된 foscil opcode를 사용한 후에 전통적인 접근에 의해 결정하고 GEN10에 의해 정의된 두개의 sinewaves를 modulate할 것이다.
The Score Syntax
F-statement
스코어 파일에서 Csound의 f-statement의 문법은 :
f number loadtime table-size GEN parameter1 parameter… ; COMMENT
만약 우리가 16 point 사인곡선을 generate하기를 원한다면 우리는 다음과 같은 f-statement를 사용해야 한다. :
f 111 16 10 1 ; A SINEWAVE
보다시피 사인곡선은 부분적으로 부드럽지 못한 결과의 16포인트를 그린다. 대부분의 기능은 길이에서 2의 자승 이어야 한다. (64,128, 256, 512, 1024, 2048, 4096, 8192) 그리고 곡선테이블에서 우리는 전형적으로 512와 8192사이에서 f-table의 크기를 기입한다. 첫 번째 스코어 (etude 1 .sco)에서 우리는 figure 1.6에서 보여주는 GEN10, GEN20, GEN1을 정의한다.
모든 네 개의 기능은 0시간에서 로딩 한다. f1 과 f2 둘 다, sinewave(f3)의 한 주기와, sawtooth wave(f 2)의 첫 번째 16배음으로 4k table (4096값)를 채우기 위하여 GEN10을 사용하였고 GEN20은 4k table(f3)를 grain부호에 의한 사용을 위해 Hanning window로 채우기 위해 쓰였다. 결국, f4 는 남자 보컬리스트가 A음을 440피치로 3초 동안 노래하는 44.1k mono 16-bit AIFF 포맷 사운드 파일로 테이블을 채우기 위해 GEN1을 썼다. 이 샘플은 loscil부호로 썼다. (f4 의 길이는 0으로 기입했다. 이는 GEN1 서브루틴이 “sing.aif” 사운드 파일의 헤더로부터 파일의 정확한 길이를 읽기 위한 것이다. 이 길이의 분명한 경우는 초당132300샘플-44100 샘플*3초가 된다.)
The Note List
Csound 스코어 파일의 두 번째 부분에서 우리는 음표를 쓴다. 오케스트라 파일에서와 마찬가지로 스코어 파일의 각각 note-statement는 한 줄을 차지한다. note-statement(또는 i-statement)는 분명한 시간에 활동하게 되는 instrument와 분명한 길이를 요구한다. 게다가 각각 note-statement는 악기에 유일한 매개변수 세팅의 무한한 양이 쓰이고 이들이 음표 대 음표의 기본에서 매개변수들이 변할 수 있도록 사용된다.
소리를 한줄, 한줄 만드는 오케스트라처럼 스코어 파일도 한줄 한줄 씩, 음표 대 음표로 읽힌다. 그러나 음표는 시작 시간이 같을 수 있고 그런 경우 동시에 연주된다. Csound에서 두 개 이상의 음들이 동시에 연주될 때나 오버랩 될 때나 그 진폭이 증가한다는 사실은 꼭 항상 알고 있어야 한다. 이것은 종종 샘플의 범위를 벗어나거나 clipping의 결과를 낳는다. (우리는 이것을 세부적으로 짧게 논의할 것이다.)
당신은 오케스트라에서 opcode의 argument는 콤마로 분리되어있는 것을 알아차렸는지도 모른다. 여기 스코어에서 두 f-table argument와 i-statement parameter 분야 (또는 p-field)는 어떤 숫자나 공간이나 탭들로 분리되어있고 콤마는 쓰이지 않는다.
일을 정리하고 깨끗하게 유지하기 위해 사운드 디자이너들은 p-field를 분리하기 위해 종종 tab-stop을 쓴다. 이 연습은 p-field를 곧은 기둥에 정렬시켜주고 읽기와 디버깅을 용이하게 한다.
The First Three P-Fields
모든 음표 제시에는 처음 세 개의 p-fields가 의미하는 것은 보류한다. 처음 세 개의 p-fields(p.15의 표 1.7에서 처럼)는 instrument넘버와 시작 시간과 길이를 말한다.
; p1 p2 p3
i instrument # Start-time Duration
모든 다른 p-fields기능은 당신이 결정한다. 일반적으로 p4는 진폭을 위해 남겨두고 p5는 진동수를 위해 남겨둔다. 이 약속은 이번 장과 이 책의 다음 장까지 적용된다. figure1.7에서 보여주듯이 처음 스코어, etude 1.sco에서 3초 길이의 노트가 연속적으로 instr 101~ instr 106에서 연주된다. 각 음의 시작시간이 4초 간격으로 있기 때문에 각 소리사이에 1초 동안 간격이 있을 것이다.
Express for Etude 1
? Csound 오케스트라와 스코어 파일을 만들어라. etude. orc & etude.sco
? 각 악기의 사운드 질의 차이를 연주하고 들어보아라.
? 스코어 파일을 변경하고 각 음의 길이를 바꾸어라
? 모든 음들이 동시에 시작하도록 하여라.
? 몇 음들을 전부 연주하지 않도록 설명하여라.
? 음들의 복합적인 카피를 자르고 붙여라. 그러고 나서 같은 악기들이 다른 시간에 나오도록 카피들의 시작시간 (p2)과 길이 (p3)를 바꾸어라.
? instr 106을 유니즌으로 캐논을 만들어라
? Csound참조 매뉴얼의 instr 101~106부호들을 전부 보고 읽어라.
? 오케스트라 파일에서 각 악기의 진동수와 진ㅍ폭 독립변수를 변형하라.
? foscil악기의 carrier와 modulation의 진동 율을 바꾸어라.
? buzz의 harmonics숫자를 바꾸어라.
? pluck악기의 처음 기능을 바꾸어라.
? grain의 밀도와 시간을 바꾸어라.
? f4 복사본 세 개를 만들어 f5, f6, f7로 번호를 다시 매기어라. 당신의 샘플 (“yoursound1.aif”, “yoursound2.aif”, “yoursound3.aif”)로 로딩 하여라. instr 106의 copy를 많이 만들고 instr 66, instr 76, instr 68로 번호를 매겨라. 각자 다른 pitch에서 다른 sound file을 읽을 수 있도록 편집해라. 다른 샘플들을 동시에 연주시키라.
? etude 1.orc파일을 복사하고 복사된 악기들의 번호를 새로 매겨라. 복사된 악기의 각 버전에 다른 매개변수 값을 주어라. 모든 12악기를 동시에 연주하여라. 한계범위 이외의 샘플이 없도록 진폭을 조정해라.
Theory : Sound, Signals, and Samplings
Csound감상을 더 좋게 하려면, Sound의 어쿠스틱적인 것과 컴퓨터상에서 사운드가 어떻게 나타나는지를 확신하는 것이 좋을 것이다.
sound의 경험은 진동의 근원으로부터 모든 방향으로 나아가는 공기 분자의 희박성과 압축에 반응하는 우리 고막의 공명으로부터 나온다. 이 압력 변화의 진동 패턴을 파형(waveform)이라 한다. figure 1.8a를 보면, 파형이 x축 위에서 +일 때 공기분자가 압축되고 – 일 때 희박해 지는 것을 볼 수 있다. 사실상 figure 1.8b는 시간과 주기 두 분야에서 네모진 파형의 한 주기를 보여준다.
시간 축은 (a)에서 x축엔 시간을, y 축엔 진폭을 보여준다. 주기 축은 (b)에서 x축엔 주기를, y축엔 진폭을 보여준다.
우리는 시간 축에서 압축의 변화로 사운드를 느끼지만 주기 축에선 희미한 변화로 자각한다. 귀는 변환기로서 고막(소골과 추골과 침골과 금골을 통하는)의 기계적 운동을 와우 각의 유체에서 움직이는 wave를 일으키는 타원형 세포막으로 변환하여 작동하고 두개골 밑 부분의 hair cell을 자극한다. 이 hair cell은 그것의 각각에 덮는 신경을 통해 뇌에 주기정보의 복잡한 세트를 옮기는 주기분석기와 같다. 이 센서, 변환기, 신경전달물질의 극도로 예민함으로 우리는 활발하고 지속적으로 분석하고 성문화하고 분류하고 우리 주변의 공명하는 음파의 복잡한 주기의 특성을 지각한다.
일반적으로 우리는 소리의 파형들을 우리가 시각화 할 수 있고, 컴퓨터에서 조작할 수 있는 신호로 바꾸기 위해 다른 변환기를 사용한다. 그 과정은 견본으로 소개되고 figure 1.9에 그려졌다.
파형의 견본을 뽑을 때 우리는 소리의 압력 파를 유사한 전기의 압력 파. 또는 아날로그 신호로 첫 번째를 바꾸기 위해 마이크로폰을 사용한다. 그러고 나서 우리는 이 신호를 샘플링은 1/2보다 많은 주파수 구성요소들을 삭제 하는 필터를 저통과 하는 anti-aliasing 에 보낸다. 디지털 시스템은 sampling rate 1/2보다 정확히 신호를 표현할 수 없다. ( 이 반사하는 주파수 차단기는 Nyquist 주파수로서 알려진다). 우리는 우리가 정확히 표현할 수 없는 음고를 필터를 밖으로 저 통과하고 난 후에 아날로그 디지털 변환기로 신호의 진폭을 견본으로 만들고 조정하는 것을 계속한다.
만일 당신이 16비트와 근접한 시스템을 가지면 당신은 16비트의 지각(32768에서 35767 또는 2의 16승의 범위) sampling rate(우리 default header에 의해 정의되는 것에 따라 초당 sampling rate 44100번)의 새로운 측정의 정밀도로 아날로그 파형의 샘플을 뽑을 것이다. 본질적으로 우리는 연속의 아날로그 신호를 일련의 작은 스냅 사진들로 양자화 했었다. 당신은 확실히 표 1.5에서 사인곡선의 양자활ㄹ 볼 수 있다. 각 데이터의 기억된 장소를 나타내는 주소는 그 시점에서 시간 내에 신호의 진폭과 일치한다. 우리 컴퓨터에서 소리를 듣기 위해, 디지털 신호를 DAC를 사용해서 아날로그 신호로 다시 바꾸어야 한다.
Sound Design Etude 2 : Parameter Fields in the Orchestra and Score
우리의 두 번째 오케스트라에서 우리는 update 될 수 있고 스코어 파일에서 바뀔 수 있도록 instr 101~106을 수정해야 한다. 오케스트라의 고정된 opcode들의 argument들의 각각을 설정하기 보다는 오히려 우리가 etude 1.orc 에서 했던 것처럼 스코어에서 p-field에 대응하는 “p”가치를 두는 것이 낫다. 그러므로 각각 argument는 음표표기와는 완전히 다른 세팅으로 보내질 수 있다.
예를 들어 instr 107의 p-field는 oscil argument: 진폭(p4) 주기 (p5)와 파장(p6)의 각각에 적용되는 것이 figure 1.10에 보인다. 그러므로 표 1.12의 스코어 파일에서 우리는 A Major의 아르페지오 다음에 세 옥타브 아래의 시퀀스를 같은 instrument로 다시 쓸 수 있다.
figure 1.13, 1.14, 1.15에서 보이는 다음 p-field예에서 우리는 약간 제한된 instr 102는 더욱 음악적으로 다재다능한 instr 108(톤 컬러의 다양하고 풍부한 설정을 연주 할 수 있는 악기)로 변화되었다.
figure 1.15의 스코어에서 각각 foscil독립변수는 유일한 p-field로 할당됐고, 이로 인해 음표 대 음표 토대에서 변할 수 있었다. p4=진폭, p5=주기, p6=carrier ratio, p7=modulator ratio, p8=modulation index, p9=wavetable의 경우에서 , 그러므로 etude 2.sco 를 7초 동안 시작하면 instr 108이 여섯 개의 연속되는 음표를 연주한다. 모든 여섯 음표들은 f1(p9의 싸인 곡선)을 사용한다. 첫 두 음표는 분리된 옥타브(p5=440과 220)지만 다른 c; m ratio (p7=2와5)를 가진다. 분명히, 오케스트라의 p-field는 우리에게 가장 단순한 instrument조차도 피치와 음색의 많은 다양성을 준다.
Exercises for Etude 2
? Csound오케스트라와 스코어를 만들어라 : etude2.orc & etude2.sco
? 다른 음과 악기의 다른 사운드 질의 차이를 연주하고 들어보아라.
? 스코어 파일을 수정하고 시작시간, 시간, 진폭과 주기를 바꾸어라.
? Csound 참고 매뉴얼에 있는 instr 107-112에 쓰인 부호를 읽고 보고 동시에 어떤 통합 기술에 당신의 연구와 지각의 초점을 맞추어라.
? instr 108의 다른 c;m율의 효과를 알아보아라.
? 사인(f1)과 톱니(f2)로 조절할 때 음색의 차이를 비교하여라.
? instr 109를 사용해서 알토와 소프라노보다 테너와 베이스가 더 화성적인 4성부 코드진행을 작곡해라.
? instr 109와 112를 동시에 사용해서 당신이 작곡한 같은 스코어를 instr 9를 더블링해서 연주시켜라.
? instr 110을 사용해서 다양한 pluck 방법으로 실험해라.
? instr 110을 사용해서 다른 기능(f1, f2)의 초기설정으로 실험해라. 또, noise로 초기화를 시도하고 음색을 비교하라.
? grain 부호의 다양한 매개변수를 실험하라.
? 악기만 가지고 짧은 연습곡을 만들어라.
? 몇몇 악기들을 가지고 짧은 연습곡을 조화롭게 만들어라. 한계 밖의 샘플이 없도록 당신의 진폭정도에 맞게 조정하는 것을 기억하라.
? 헤더의 sampling rate와 control rate를 낮추어라. 수정된 악기들을 다시 편집하여라. 사운드 질과 밝기와 인공노이즈의 차이를 알겠습니까?
Amplitude and Clipping
전에 말했듯이 당신이 16비트의 컴퓨터를 가지고 있으면 2의 16승의 amplitude값을 표현할 수 있다(-32768에서 +32767의 벙위 까지 65536). 이것은 90dB 이상의 진폭을 변활 시킬 수 있다. 만일 당신이 exercises를 해왔더라면 당신은 아마 Csound의 음 진폭들이 부가적이라고 알아차렸을 것이다. 이는 한 악기가 20000의 진폭을 가지고 있다면 당신은 동시에 그 악기로 두 음을 연주 할 수 있는 것을 의미하고, 당신은 컴퓨터에게 ± 40000의 진폭으로 신호를 만들라고 요구 할 것이다. 문제는 당신의 16비트 변환기가 최고 약 32000정도의 값만을 표현할 수 있고, 그러므로 당신의 Csound일은 한계 밖의 샘플이 있다고 기록 할 것이고 figure 1.6에서 보는 바와 같이 사운드 파일의 끝이 깎일 것이다.
진폭을 다루는 것은 Csound를 하는데 가장 문제점 중의 하나이다. 여기엔 쉬운 대답은 없다. 문제는 Csound진폭은 signal의 단순한 수학적인 표현이라는 점에 있다. 이 측정들은 사운드의 종합적이거나 지각적 성격을 지니고 있지 않다.
단순히 입력해라. 두 번 진폭의 직선이동은 물론 크기만큼 두 번으로 인식되지 않을 것이다. 어쿠스틱의 좋은 책은 당신이 문제의 복잡성을 식별하는데 도움을 줄 것이다. Csound의 세계에서 두개 혹은 그 이상의 음이 그것들의 진폭이 증가되어 들릴 때마다 기억해야 한다. 당신의 signal이 32000보다 더 큰 어떤 것으로 숫자가 오르고 있다면 clip이 될 것이다. Csound는 당신이 이런 샘플 범위 밖의 문제로 고민하는 것을 도울 옵코드와 툴을 몇 가지 갖고 있지만 현재의 옵코드나 컨버터 값은 진실로 그것을 해결해 주진 못한다. 당신의 시간의 대부분이 단시 더 낮은 레벨로 set해야 하고 파일을 다시 (그리고 또 다시)render해야 한다. 당신의 두 귀가 원하는 것과 함께 당신의 시스템이 조정될 수 있는 범위 안에서 진폭을 얻어낼 때 까지.
Data Rates
첫 번째 연습 오케스트라에서 봤듯이 오케스트라에 직접 하든 p-field를 통해 하든,우리는 소수점으로 parameter를 정하거나 업데이트 시킬 수 있다. 그러나 Csound의 진짜 파워는 세 개(i-rate k-rate, a-rate)의 다양성으로 매개변수를 업데이트 할 수 있다는 것이다.
? i-rate변수는 note-rate에서 변화되고 업데이트 된다.
? k-rate변수는 control-rate에서 변화되고 업데이트 된다.
? a-rate변수는 audio-rate에서 변화되고 업데이트 된다.
I와 k-rate변수는 스칼라와 같다. 본질적으로 그들은 주어진 시간에 한 값만 취한다. i-rate변수는 첫째로 parameter값과 음가를 정할 때 쓰였다. 이것들은 초기-시간으로 없어졌고 음표의 길이로 남아 있다.
k-rate변수는 첫째로 envelope과 sub-audio 컨트롤 시그널을 저장하고 업데이트 하는데 쓰였다. 이 변수는 우리의 오케스트라 헤더의 kr로 정의된 control-rate에서 다시 계산된다. a-rate변수는 정보의 기억장치나 벡터다. 이는 오케스트라 헤더에서 sr로 정의된 오디오 sampling rate에서 발진기와 필터의 옵코드가 변화되도록 데이터를 저장하고 업데이트 하는데 쓰였다.
우리는 이 변수의 첫 글자로 업데이트 된 rate를 정할 수 있다. 예를 들어 figure 1.7에서 보여주는 두 부호간의 차이점만이 오디오 rate와 다른 control rate를 계산할 수 있다. 둘 다 같이 oscil이라는 부호를 쓰고 둘 다 같은 독립변수를 갖는다. 둘의 차이는 출력 시그널의 결과이다.
default헤더에 sr=44100, kr=4410을 정해주면 ksig의 출력은 4k의 sample rate에서 만들어 질 것이다. 1000hz 사인곡선을 정확히 계산하기 위한 충분한 샘플 결과를 갖기 때문에, 사운드의 결과는 둘이 꽤 비슷할 것이다. 그러나 만약에 독립변수가 다르고 파형이 figure 1.18의 f 2에서 정의된 톱니 곡선처럼 하모니가 첨가되든지 한다면 1초에 44100으로 정해진 k-rate는 파형을 정확히 계산하지 못할 것이고 aliasing(가상본)의 결과를 초래할 것이다.
당신은 그것이 사운드 디자이너인 당신에게 당신의 옵코드를 render하기에 대부분 적당하고 능률적이고 효과적인 비율로 결정하기 위하여 당신에게 맡겨지도록 기록할 것이다. 예를 들어 당신이 당신의 low frequency oscillator와 audio rate envelope의 모든 것을 render할 수 있지만, 그것은 그 신호를 처리하기에 더 오래 걸릴 것이고, 대부분의 경우에 첨가된 결과는 미세할 것이다.
Variable Names
악기 디자인에서 지금까지 교환 가능한 많은 경우에 우리는 a1, asig, ki, ksig를 써왔다. 변수에 이름을 붙일 때 Csound는 i, k, a로 시작하는 이름만을 요구했다. 이는 프로그램이 부호의 특별한 라인을 만들기 위한 비율을 결정하게 한다. 이것이 최우선이다.
예로 당신은 a1, asig, asample 또는 acoolsound의 loscil부호의 출력 이름을 줄 수 있다. 각 변수 이름은 Csound로 알게 될 것이고 에러 없이 작동 될 것이다. 사실 각 코드의 라인이 같은 parameter 세팅들을 가지고 주어졌다면 그것들은 render했을 때에 정확히 모두 같은 소리가 될 것이다. -당신이 그것들에게 어떤 이름을 붙이는가는 상관없이. 그러므로 그것이 사운드 디자이너인 당신에게 맡겨지는 것은, 분명하고, 일관되고, 유익한 그런 가변적 이름을 짓는 계획을 결심하는 것이다.
Theory: Aliasing and the Sampling Theorem
더 진보된 악기 디자인을 하기 전에 이론을 좀더 재검해보자. 처음 시작할 때처럼 figure 1.18의 톱니는 샘플링 법칙의 증거의 예이다. 처음에 시작했듯이 figure 1.18의 톱니(ksig)는 aliasing의 예이며, 샘플링 원리의 예이기도 하다. 샘플링 이론에선 디지털 분야에서 당신이 만들려고 시도하는 최고 주기의 두 배 만큼 많은 샘플의 파형을 정확히 재건하기 위해 그냥 입력하라고 나온다. 이 sampling rate의 1.2인 최고 제한은 Nyquist 주기라고 알려졌다. 44100Hz의 오디오 rate 주기로 인간 지각 가능한 한계에 논의되는 최고 22050Hz톤 까지 정확히 만들어 낼 수 있다. 그리고 4410Hz의 조절 rate로 정확히 2205Hz의 톤까지 만들 수 있다. 이것은 극도로 빠른 LFO가 될 것이고 낮게 변화하는 control rate에 한 비트 높아 보이지만 당신은 진폭 envelope의 조각이 극도로 빠르게 변화하는 것과 이 빠른 변화의 결과로 가끔씩 zipper-noise가 생기기도 한다는 것을 알게 될 것이다.
figure 1.9는 aliasing으로 알려진 현상을 그래픽으로 그려놓은 것이다. 왜냐하면 한 frequency는 하나의 alias로 밑의 샘플이 되고, 교체된 frequency의 결과가 된다. 특별한 경우에서 우리의 원래 사인곡선은 5Hz이다. 우리는 이 wave를 4Hz로 샘플링 한다.(정확한 재생을 위한 최소값은 가장 높은 frequency 구성요소에 2회당 10Hz가 된다는 것을 기억하자) 이 결과는 1Hz이다. 표에서 보다시피 1Hz의 싸인 곡선의 아웃라인 자취를 따라가는 샘플링으로부터 나온 값이지 5Hz가 아니다. 정확한 alias된 frequency는 샘플링 frequency와 샘플의 frequency와 다르다.