2017年5月26日 星期五

[pd] recorder + looper


嗨,我是北藝大的vanlan,今天阿亂老師的課堂上教大家做的是looper
功能有:麥克風錄音、利用剛錄的聲音編寫音樂/節奏、播放編寫的結果

點此下載阿亂老師課堂範例檔|以下將程式碼分開解釋

record mode(紫)
麥克風錄音

play mode(紅)
編寫節奏、播放結果

[loadbang] 開啟檔案時自動執行
紫紅按鈕為Toggle,切換模式開關

用麥克風收音(左)
播出聲音、調整音量(右)
[/ 127] 是因為slider的預設值

[s~] send
[r~] receive
















用麥克風錄製聲音

[r chMode]和[s chMode]相對應,r = receive,s = send
黃色bang相當於觸發按鈕
觸發後進行後面的動作:麥克風收音1秒錄成s1.wav

[t b b] 將訊號複製成兩份,先打開一個s1.wav(右邊)然後進行寫入(左邊)
[del 1000] [stop] 觸發後一秒結束(錄製一秒),del = delay
[writesf~] write sound file
[readsf~] read sound file
[s~ dac] 訊號送到喇叭播放

老師的範例做了四組(4個按鈕)
這時候[s~ dac]只能有一個,四組的[readsf~]都要接到同一個[s~ dac]

recorder子程式

























為了讓程式整齊,我們在主程式新增一個object: [pd recorder],會跳出一個叫recorder的子程式
把剛剛寫好錄製麥克風聲音的部分剪下、貼到這個子程式中
(點一下 [pd recorder]即可開啟子程式)
刪除本來的黃色按鈕(按鈕留在主程式就好)改成[inlet],主程式上的[pd recorder]上排就會多一個接孔
並在右邊的bang上接一個[outlet],[pd recorder]的下排也會多一個接孔
在主程式中[pd recorder]的上下排接孔就可以接上bang
bang上方的[key][sel 49 50 51 52]是為了方便控制,用鍵盤的1,2,3,4鍵來控制四個按鈕的觸發


looper主程式

深黃色下半部所接的就是looper
[r chPlay]是接收play mode的[s chPlay]
當深黃色的bang被觸發,就寫進array裡
[tabwrite a] table(=array) write a,寫進名稱為a的array
(b c d 以此類推)

[t f f] 把訊號複製成兩份,都是float(浮點數)
[t b b f] 把訊號複製成bang bang float



新增array(陣列),按右鍵選擇properties可更改名稱、尺寸
新增四個array,分別命名為a b c d












這裡是讓a b c d 陣列訊號歸零

當然你也可以寫成 [a const -1;]
那點擊這裡時a陣列的值就會是-1









這個部分是looper中設定循環、讀取陣列進行播放的部分

[invert] 也可以寫成[expr 1-$f1],相反的意思,功能是切換0,1(expo = express)

[f] [+ 1] [% 1000] 是計數器,從1-1000循環計數
底下將訊號分成四份,分別接到讀取四個陣列 [tabread a] (b c d以此類推)
[s banga] send bang a 傳送觸發a陣列


ps:有可能需要補裝[invert]的library
     缺少library的物件可以到下方網址搜尋需要安裝什麼library
     http://blog.joehahn.ws/list-puredata-objects-and-extended-objects












整理一下玩法:

1.  record mode 先不要打開,輪流按鍵盤1,2,3,4錄製聲音
     (如果聲音沒有錄進去,可以檢查Media-Audio Settings的麥克風選擇)
2.  打開record mode,再輪流按鍵盤1,2,3,4聽聽看剛錄的聲音
    (如果沒聲音,檢查dsp是否有開、slider是否有拉到右邊)
3. 打開play mode,依你的喜好鍵入1,2,3,4開始錄製音樂
    (array會出現訊號,那就是成功輸入了)
4. 關掉play mode,就可以聽到剛剛寫的音樂一直循環播放
    (記得檢查[invert]底下的toggle是否有打開)