MSP Tut.17 Sampling: Review A sampling exercise

Tutorial 17 Sampling: Review A sampling exercise
이 챕터는 샘플링과 오디오 플레이에 대한 연주의 이해를 하고 있는지 테스트를 하는 챕터 입니다.

-a키를 눌러 오디오를 키도록 하고, 다시 눌러 토글로 오디오를 끄도록 하라.
-r키를 눌러 컴퓨터로 들어오는 어떤 소리든 녹음하여 1초의 오디오 파일을 만들라.
-어떤 Amplitude envelope가 플레이 될 때에 샘플로 적용이 되며, 시작과 끝에 조금 감소하게 하여 끝에서 갑자기 클릭이 나타나지 않도록 만들어라.
-샘플이 3Hz의 vibrato를 만들며 연주하도록 하라. Vibrato Depth는 one semitone (a factor of 2±1/12) 오르락 내리락 하도록 하라.

Hints
소리를 플레이 하기 위하여 buffer~를 사용하는 것이 좋다.
buffer~ 와 record~를 사용하여 바로 녹음할 수 있다. record~ 는 adc~ 또는 ezadc~로부터 연결될 것이다.
buffer~로부터 소리를 연주하기 위한 두 가지 선택으로는 play~ 와 groove~가 있다.
그러나 비브라토를 더해야 하기 때문에 groove~를 선택하여 플레이의 스피드를 바로 결정할 수 있도록 하는 것이 유리할 것이다.
Amplitude envelope 은 line~ object 를 사용하는 것이 좋다. *~object는 groove~로부터 나오는 출력신호의 amplitude를 scale하기에 좋다. function object를 사용하여 envelope를 그릴 수 있고 그것을 line~ 로 보내어 envelope을 그릴 수 있다.
computer keyboard로 adc~, record~, groove~, line~ 또는function를 연동시키도록 해야 한다. 따라서 key 와 select를 이용하는 것이 좋겠다.
싸인 곡선을 cycle~ object를 이용하여 만들어 vibrato에 활용한다. frequency 는 vibrato의 rate를, 싸인 곡선의 amplitude는 depth를 결정할 것이다.
Tutorial 10에서, 우리는 vibrato를 만들 때 the modulating oscillator를 carrier oscillator의 frequency input 에 더하여서 만들었다. 여기에선 두 가지가 다른데 일단 modulating oscillator는 또 다른 cycle~ object의 frequency보다는 groove~ 의 playback speed를 modulate해야 하며, 두 번째는 modulator 의 출력을 carrier의 입력에 더하여 carrier 위 아래로 똑 같은 frequency의 진동을 만들어 내는 것이며 똑 같은 pitch를 오르내리는 진동을 만드는 것이 아니다. Pitch의 변화는 어떤 양에 의해 carrier frequency 가 곱해지는 것으로 이루어 지는 것이지 더하는 것으로 생기는 것이 아니다. Pitch를 올리기 위하여 2의 12배수로 frequency를 곱해야 한다. 더 낮은pitch는 반대로 2의 -1/12 제곱으로 만들어진다. 이 범위를 계속 바꾸어주는 signal값을 계산하기 위해서 pow~라는 것을 이용해야 한다. (아직 다루어 본적이 없음)

Solution


buffer~ object 는1000ms의 시간과 channel의 수(2)를 지정해줍니다. 이것은 얼마나 많은 memory 가 buffer~에 할당될 것인지를 결정합니다.

buffer~가 1초로 메모리가 지정되었기 때문에 record~ object에 stop하라는 명령을 줄 필요가 없게 됩니다.
Key와 select object 가 키로 컨트롤 할수 있도록 해줍니다.

이 패치는 또한 amplitude envelope를 샘플이 플레이 됨과 동시에 작동하도록 해줍니다. 이 envelope은 groove~의 출력을 scale하도록 해줍니다.

A sig~ 0.5 object는 groove~의 기본 플레이 스피드의 반의 속도로 맞추어 줍니다. 3 Hz cosine wave 의 amplitude는 0.083333 에 의해 scale됩니다. Sine signal은 pow~에 의해 2의 제곱근에 곱해집니다. 그래서 그 결과로 플레이의 스피드를 곱해주는 역할을 하게 됩니다.

MSP Tut.16 Sampling: Record and play audio files

Tutorial 16 Sampling: Record and play audio files

Playing from memory vs. playing from disk
우리는 지금까지buffer~안에 어떻게 사운드를 저장하는지에 대해서 배웠습니다. 일단 소리가 메모리에 저장되면 다양한 방법으로 다시 읽어들일수 있었지요. (cycle~, lookup~, index~, play~, groove~, wave~) buffer~의 단점이라고 한다면 RAM의 사용량에 대한 한계가 있다는 것입니다. 만약 우리가 아주 큰 소리를 녹음하고 재생하기 위하여 너무 많은 하드의 용량이 요구된다는 것입니다. 그러므로 MSP가 하드 디스크로부터 소리를 재생할 때 여전히 메모리에서 소리를 미리 불러낼 작은 버퍼를 만들어 줄 필요가 있습니다. 이렇게 해야 MSP는 하드로부터 더 많은 소리를 불러 들일 수가 있게 됩니다. 그리고 이것은 디스크에서 소리를 불러올 때 소요되는 작은 시간차와 같은 문제들을 없애주게 되는것이죠.

Record audio files: sfrecord~
MSP는 직접 녹음하고 재생할수 있는 오브잭트 sfrecord~ 와 sfplay~를 재송합니다. 오디오 파일에 녹음하는 것은 특히 쉬우며, 단시 파일을 열어 녹음을 시작하고 끝내면 됩니다. sfrecord~ 투토리얼 패치안에 오른쪽 윗부분에 있는 patcher를 열면 레코딩을 하는 패치가 다음과 같이 보입니다.

sfrecord~ 는 인렛으로 시그널이 들어오면 녹음합니다. 시그널은 직접 adc~ 나 ezadc~ 으로 올수 있습니다.
• “Create an AIFF file”.라고 되어있는 메시지 박스를 클릭하여 봅니다. 파일 이름을 명명해줄수 있게 됩니다. Toggle을 클릭하고 레코딩을 시작합니다. 다시 클릭하면 끝나게 되겠지요.

Play audio files: sfplay~
왼쪽 부분에보면 오디오파일을 재생하기 위한 장치가 있습니다. sfplay~ 는 몇 개의 오브잭트를 더 필요로 하게 되는데요, 그것은 아래의 그림과 같습니다. 파일을 재생하기 위해서 단지 파일을 열고  sfplay~를 시작합니다. sfplay~은 직접 dac~ 나 ezdac~로 보내어 소리를 재생시킵니다.

• open 을 클릭하여 미리 녹음된 파일을 엽니다. toggle 을 클릭하여 재생해봅니다.

Play excerpts on cue
sfplay~ 은 오디오 파일 전체를 불러들일 필요가 없기 때문에 같은 sfplay~ 에 많은 파일을 열수 있습니다. 그리고sfplay~ 는 그들중에 어떤것이든 플래이할수 있습니다.  sfplay~는 가장 최근에 열린 파일을 ‘현재’의 파일로 인식합니다. 그리고 1의 메시지를 받으면 그 파일을 플레이 합니다.
• 오픈 메시지를 열어 다른 오디오 파일을 열어보고 “Define cues, 2 to 9”라고 되어있는 메시지를 클릭해봅니다. sfplay~ 가 Cue에 숫자를 받으면 그에 해당하는 파일을 연주합니다. 예를들어2, 3, 4에 cue를 주면 전체의 파일을 연주하며 cue 5 는sacre.aiff의 처음270 milliseconds을 연주합니다.
Cue 1 은 언제나 현재 파일을 연주하게 되어있으며 0을 멈추는데 사용된다는 것을 잊지마세요.
sfplay~ 가 cue를 받을 때 마다 현재 연주하고 있다면 멈추어지게 되며 즉시 새로운 cue를 연주합니다. 각 preload message 는 사실 cue의 시작에 쓰일 오디오 데이터를 포함하고 있는 작은 버퍼를 만들어냅니다. 따라서, 재생시 즉각적으로 연주할 수 있게 해 주는것입니다. 현재 0~9의 cue가 정의되어있으며 각 다른 오디오를 재생 시킬 수 있습니다. 다음은 키보드의 아스키모드를 사용한 재생장치입니다.

• “Keyplay On/Off”라고 되어있는 토글을 클릭하며 숫자키를 사용하여 다른 큐를 주어봅니다.

Try different file excerpts
cue를 지정하기 전에 , seek 메시지를 통해서 현재 파일의 어떤 부분이든 들을 수 있다.
• 다시 오디오 파일을 열고 패치의 오른쪽 부분에seek message 에 갈 end time을 입력하세요.

seek 메시지에 의한 명령은 delay를 유발시킬 수 있으므로, 더 정확하게 불러들여야 하는 경우에는  cue에 미리 불러들이는 설정이 더 나은 방법입니다.

Trigger an event at the end of a file
패치에서 오른쪽 아랫 부분에sfplay~.의 오른쪽 아웃렛에 대한 사용이 나옵니다.  Cue에 의해서 한번 플레이 된 경우 sfplay~ 는 뱅을 오른쪽 아웃렛으로 보냅니다. 이 패치에서는 bang이 다음 cue를 유발시키는, 응용된 모습을 보여줍니다.

이 패치에서 gate를보면 이 장치가 없으면 sfplay~ 가 멈추지 않게 됩니다. 왜냐하면, 0 cue가 또다른 0이 아닌 cue에 의해 유발될것이기 때문입니다. gate 는 반드시 0이 sfplay~로 보내지기 이전에 닫혀야 합니다.
• “Play random excerpts”라고 되어있는 메시지 박스를 클릭하여 cue를 preload합니다. 그리고toggle을 클릭하여 진행을 시작합니다.

MSP Tut.15 Sampling: Variable-length wavetable

Tutorial 15
Sampling: Variable-length wavetable

Use any part of a buffer~ as a wavetable: wave~

투토리얼3에서 Cycle~은buffer~에 들어온 wave의 512샘플을 이용할수 있고 반복해서 읽을수 있다고 배웠습니다. Wave~는 조금 더 확장된 개념으로서 buffer~에 들어온 wave의 어떤 섹션이든 반복적으로 읽을 수 있습니다.  Buffer~내에 있는 wave의 시작, 끝값은 그림에서 처럼 중간, 오른쪽 인렛으로 결정됩니다. 왼쪽 인렛에서 phasor는 0에서 1까지 반복적으로 돌아다니며 wave를 읽습니다.

-참고 : wave~에서 시작, 끝값을 선형적으로 이어주기 위하여 interp $1라는 메시지를 왼쪽 인렛에 보내면,
-$1=0이면 연결 안함
-$1=1이면 아주 선형적으로 연결
-$1=2이면 대충(?)선형적으로 연결 (low quality)

일반적으로 기본적인 소리 합성에서는, wavetable이 wave form의 한 주기가 되며(cycle~) frequency는 소리의 기본음때 따라서 결정되어집니다. 그러나 wave~에서는 wavetable은 실질적으로 어떤것이든 포함할 수 있습니다(주기적이지 않은 오디오 파일까지)
wave~는 다른 소리 생성방법에 비해서 예측할수 없는 소리를 만들어 내며 다양한 음색을 만들어 낼 수 있습니다.

Synthesis with a segment of sampled sound
투토리얼에 있는 패치는wave~를 사용하는 3개의방법을 소개합니다.

1. a repeating ramp signal (phasor~),
2. a sinusoid (cycle~),
3. a single ramp (line~).
패치 아랫부분에 wave에 대한 기본적인 것을 보여줍니다. 윗쪽에 wavetable을 읽는 3가지 방법을 보여줍니다. 일단 아래를 보면

-toggle을 클릭하여 오디오를 키세요. Amplitude를 0보다 크게 조절합니다. Wave table의 endtime이 782로 입력 되어있습니다. (시간단위 ms) 이 세팅에서 wave~는 buffer~에 있는 전체의 내용을 다 사용합니다. (isthatyou.aiff)
-팝업메뉴에서“Read forward”를 고릅니다. 이것은 selector~의 첫번째 시그널 인렛을 엽니다. 그리고 wave~가 phasor~에 의해 컨트롤 되도록 설정되어집니다.

-“Range”라고 되어있는 숫자 박스를 1로 설정하면 phasor의 amplitude가 설정됩니다. 따라서 wavetable의 어떤 부분이 사용될지를 결정합니다. “Frequency”가 2로 설정되어있습니다.이 말은phasor가 초당 0에서 1까지 두번 왔다갔다 한다는 뜻입니다.
-phasor~에 다른값들을 넣어보세요. 그럼 buffer~에 있는소리의 속도가 바뀝니다. range값에 따라서 buffer에서 받아들이는 양을 변화시킵니다.
-참고:여기서 phasor~는 종종 인식된 음높이와 관계없어집니다. 왜냐하면 wavetable의 내용이 waveform의 하나의 주시를 나타내는 것이 아니기 때문입니다. 게다가 복잡한 샘플의 임의적으로 선택된 부분을 빠르게 반복하는 경우에 Nyquist rate의 범위에서 frequencies를 생성하는 높을 가능성을 지닙니다. 이것은 예측불가능하게 가청범위에서 wave가 접히게 됩니다. (Nyquist error)
-메시지 박스를 클릭하여 wave~에서buffer~ chords object 로 보냅니다. 그리고 endtime의 최대값을sacre.aiff.의 길이와 같게 합니다. 이것은 부적당한 start와 end time이 들어가는 것을 막기 위한 것입니다.

Using wave~ as a transfer function
buffer~는a lookup table로서 다른 onject들에 의해 다른 여러 방법으로 접근할 수 있도록 해줍니다. Tut. 12에서 lookup~ object는  buffer~의 한 부분을, 코사인 웨이브를 입력으로 받아 transfer function으로 사용하게 해 주었습니다. wave~ object 또한 유사하게 사용될 수 있습니다. 차이점이라면 imput이 반드시 0에서 1사이의 범위여아 한다는 것입니다. (반면 lookup~ 은 `-에서 1사이였지요)  wave~ 를 이런 방법으로 이용하려면 입력되는 cosine wave의 위상변화를 0~1로 시켜주어야 합니다.
-wave~의 시작, 끝값이 가까우면 아주 짧은 시간동안 왔다갔다 (앞으로 뒤로)합니다.

-“Range” number box를 아주 작게 해주어 amplitude를 제한시킵니다. 여기에서는 cycle~이 아주 작은 부분의 wavetable을transfer function으로 사용하게 해 줍니다. cycle~ 의 frequency를 220 Hz로 설정하면 풍부한 tone의fundamental frequency 가 220 Hz인 소리를 들을 수 있습니다. “Range” number box 를 변화시키면 음색이 변합니다.

Play the segment as a note
wave~ 가 0~1사이의 어떤것이든 받아들이기 때문에 0에서 1까지 (또는 1에서 0까지) wavetable 를 단 한번 읽습니다. play~ and groove~ 는 이런 부분에 있어서 장점이 있지만 wave~에서도 가능합니다.

– “Read once” 를 팝엉에서 고릅니다. 이것은 selector에서 3번째를 인렛으로 받아들여서 wave가 line~에 의해 컨트롤 되도록 합니다. 시작, 끝값을 주고, “Duration” number box를 1000으로 합니다. 그리고 버튼을 클릭하면 1초동안 wavetable이 선회합니다.

Changing the wavetable dynamically
Patcher window 의 오른쪽 부분에 있는 cycle~ object는 wavetable로 싸인웨이브의 position의 변화를 첨가하기 위하여 사용되었습니다. cosine wave 가 오르락 내리락 하고 wavetable의 시작, 끝값이 오르락 내리락 합니다. 결과 wavetable 은 계속해서 위치를 바뀌게 되는것입니다. 이것은 일정한 vibrato를 생성합니다.

– “Shift amount” 를 0.35로 설정하고 “Shift rate” 를 6으로 둡니다. 시작, 끝값을102 와109로 둡니다. 그리고 “Read forward” 를 팝업에서 고릅니다. phasor~의 frequency를 110과 같은 audio rate으로 정하고 범위를 1로 합니다. 그럼 vibrato와 같은 음색의 변화를 (6Hz의 비율로) 들을 수 있습니다. 다양하게 shift rate와 the shift amount를 변화시켜보세요.