2017年6月19日 星期一

Pd裡的DIY2切換

嗨,這裡是北藝大的小宇,阿亂老師這次教的是Pd裡的DIY2切換
關於DIY2 上一篇有相關的介紹,還沒安裝的人可以回去參考(點這裡下載DIY2

前言
當你有一個音檔,想要使用多個DIY2中的效果,做一個效果器的切換,方法如下。
資料夾
創建一個資料夾,
將你下載或是已經錄製好的「音檔」與「pd的程式碼」,放置在這個資料夾 
讀取檔案

建立Message
打上[open
檔名.檔案格式, start]
這邊的「
檔名.檔案格式」為「shoot1.wav
建立Object
打上[readsf~]: read some file,表示在pd中讀取這個檔案
*將[readsf~]右下的那點,接回[open 檔名.檔案格式, start] —> 循環播放這個音檔

—————————————————————————————————————
注意!!當你的pd出現以下的訊息的時候 

表示這個檔案在下載後的格式,pd無法辨認,在下載檔案的過程中發生了點問題
這個時候,可以到Audacity(一個音樂編輯軟題),或是任何的音樂編輯軟體 




開啟檔案,在裡面重新的輸出並且改檔名
shoot1.wav」—>「s1.wav」(記得pd裡open shoot1.wav也要改成open s1.wav)


DIY2效果
下載DIY2套件,放入pd的extra資料夾,在Preferences裡面去做連接套件的設定 
設定好之後
建立Object  [diy-makeobjects]
點一下進入,選擇想要的效果器,放入到主程式中 

[*~ 1]:音量

[throw~ all]和[catch~ all]相對應(可以改成[r~ all]和[s~ all],r = receive,s =send)
throw:丟出訊號 / catch:接收訊號
all為訊號名稱,可以自訂,但是丟出跟接收的名稱要相同
[dac~]:發出聲音

切換 
建立Slider
底下接一個Number可以看到Slider的數值
Slider的值為 0 - 127
[/ 31]:除以31,將 0 - 127等分,
底下的Number可以看到除以31之後的數值
[int]:把上面的數值變成整數,
所以下方的數值就會變成 0 - 4
註:可以先除你要的等份
ex:最後要0-4,所以先[/ 4],
Slider拉到最底,所看到的數值為大約31
所以將[/ 4] —> [/ 31]之後,
最後[int]的結果,就會是 0 - 4




[sel 0 1 2 3 4]:當上面的數值為0的時候會發生什麼事,1的時候會發生什麼事
依此類推
[0 0 0 0]、[1 0 0 0]、[0 1 0 0]、[0 0 1 0]、[0 0 0 1]:
一個 [  ]裡面有四個數字,代表有四個物件
用sel的0、1、2、3、4去做切換
ex: sel 0 —> [0 0 0 0] —> 所以效果器都沒有接收到訊號
      sel 1 —> [1 0 0 0] —> 第一個效果器接收到訊號(使用第一個效果器)
[unpack f f f f]:把上面的訊號拆開來
接收剛剛sel切換的結果,分送到底下的效果器,把[unpack f f f f]接到效果器的[*~ 1]


程式碼

2017年6月12日 星期一

在r-pi上用pd自製合成器

嗨,我是北藝大的vanlan,又來到了pi+pd+arduino的教學整合
今天的應用是:合成器

點我下載 本次阿亂老師範例檔|以下動作都在pi裡執行



首先要先教大家克服一個問題:pi設成自動開機後,如果沒有事先開啟comport就讓pd也自動執行,pd就會當機

以下解法看仔細了!⇩⇊⇊⇊⇊⇊⇩
1.  建一個python檔(檔名:ser.py)


ser.py存檔在桌面新增的patch資料夾,程式內容是打開comport執行2秒

2.  打開終端機先測試看看:在終端機輸入python /home/pi/Desktop/patch/ser.py
     如果你的arduino有接好、訊號程式也是正確的,那執行的時候應該會看到終端機顯示出arduino跑的時候print的內容,2秒後會自動跳出

3.  以上如果正確,就可以把這個程式碼加進自動執行中:
     終端機輸入sudo nano /etc/profile,進入最後一行加入python /home/pi/Desktop/patch/ser.py
     存檔離開(crtl+x)

如此一來,pi開機時就會先執行兩秒打開comport的python程式,再執行pd




在這個合成器上,想讓pi可以外接輸入音源,要在音源孔接一個音效卡(有耳機孔、麥克風孔),耳機輸出端接喇叭或耳機,麥克風輸入端可以接電腦或手機等
以輸入的音源作為基底,用以下pd程式改變聲音
記得輸入源的音量先關小(約一半),避免輸入時音就已經爆掉了
在pd裡面用 [*~ 10]調整音量


合成器使用的套件是DIY2(點擊下載)

範例程式中的[diy2] 點一下會跑出這個視窗
我們先試試mono-effects裡面的EQ3效果:點一下EQ3前面的bang,然後點一下[pd $0-creater]
會跳出一個視窗,把裡面的EQ3整個複製到你的主程式中

先試著用Hslider來控制EQ3裡面的元件
[/127] 因為Hslider的數值是0~127
下面那串,加入補插間[line]讓數值的調變可以比較滑順(細微)
EQ3也可以換成其他任何的試試看,你可以試試simpleFM

我們把剛剛的slider複製四組,上方接的[unpack f f f f]、32 43 76 57和114 115 17 80是方便將四個slider的數值調整成指定數值
[unpack f f f f] : 將訊號解封包成4個浮點數

左上角那塊是接收音高、調整音量
為了讓程式看起來更乾淨,用鍵盤控制音高的程式下方接[s midinote],並用[r midinote]來接收
[t f b] : trigger接收訊號 / float / bang,下方兩個訊號口左邊傳float右邊傳bang
這個bang的訊號送到下面接給另外一個adsr模組,浮點數則往下控制音量
左邊的slider控制音量,接到浮點數下方[+ 0]右上的訊號孔,變更+ 0的數值
adsr模組中,[moses 0.015]是指接收的訊號高於0.015則bang右邊,低於0.015則bang左邊


















[key]是鍵盤輸入
[sel]後面的數值是根據鍵盤ASCII碼
key底下接了顯示數值,按按看就可以知道哪個按鍵的ASCII碼是什麼
以第一組做說明:
按下鍵盤p (ASCII=122),送出訊號1,觸發bang,送出訊號60(=音高中央Do的頻率)

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是否有打開)


2017年5月11日 星期四

在r-pi上用pd接受arduino訊號


嗨我是北藝大的vanlan,今天的課堂教學是pi+pd+arduino

如果你的pi還沒有裝arduino,請在終端機輸入 $ sudo apt-get install arduino
然後可以先隨便燒一個程式進去測試

我們要幫pd安裝一個可以
在/home/pi底下建立一個資料夾“pd-externals”,再建一個資料夾“deke-plugin”,放入外掛檔案deke-plugin.tcl
( /home/pi/pd-externals(自己建)/deken-plugin(自己建)/deken-plugin.tcl )

裝好後,pd的Help底下就會多了Find externals的選項
並且在pd視窗會出現如下圖第一行的字樣

打開receive.pd檔會多跳出兩個錯誤訊息,代表缺少程式中的這兩個library:comport,moocow

進到Find externals,安裝pdstring(選第二個)和comport(選第一個) 


成功安裝的話,重新打開pd時comport的錯誤就會消失了
並且在Help-Browser裡面可以看到pdstring/跟comport/
這些東西的安裝檔案路徑會在pi的usr/lib/pd/extra

由於這次不使用moocow的library而是改用pdstring,所以我們要改一下pd的程式
打開receive.pd,快點兩下pd arduino2pd

會出現另一個視窗,程式如下

如果在電腦中,直接使用上方程式就可以了
(尚未安裝moocow的library要記得補安裝!)
而在pi中,這裡有兩個地方要修改:
1. 把"moocow/" 刪除只留下bytes2any
2. 在旁邊新增一個物件[pdstring]

這樣pd就可以接收來自arduino的訊號了

receive.pd 下載 
deken-plugin.tcl 下載 


arduino寫法如下:


















void setup()
{
Serial.begin(9600);
}
void loop()
{

Serial.print("\t");
Serial.print("melody");
Serial.print(" ");
Serial.println(100);
Serial.print("\t");

Serial.print("\n");
delay(500);
}


其中兩個Serial.print("\t")所包住的內容就是會傳到pd的訊號
上述pd內容中,pd arduino2pd的程式就是在判斷這樣形成一個封包

pd的主程式中加入[route +訊號名稱]
例如[route melody]。則在arduino中Serial.print("\t")下行寫Serial.print("melody")
後面的Serial.println(100)指定了傳送的數值,當然100也可以用變數代換

上圖中Serial.println("L 11 22")意思是:訊號名稱L,帶有11,22兩個數字訊號
所以pd的[route L]下方接了[unpack f f],將訊號解封包成兩個float(浮點數)

2017年5月5日 星期五

pd音量控制圖像大小

嗨,我是北藝大的vanlan,接下來的教學是阿亂老師在聲音裝置課的課程紀錄

關於Gem Library的安裝請參考 http://www.dazegraffiti.com/2016/04/deken-plugin.html

另外,補充快速尋找Gem example的方法


如果你用的是mac也可以選擇以下做法:
應用程式 - Pd - 顯示套件內容 - Contents - extra -->把extra資料夾拉近側邊欄


回歸正題

首先要做的是建一個gem視窗、測試麥克風音量
畫一個圓,圓的大小隨音量改變

   [gemwin]:建立一個gem視窗

   [gemhead]:建立一個gem物件(下面接的[scale 1]、[circle 1]是定義物件樣貌)

   [env~]顯示的數值就是麥克風的音量範圍
   每個人的電腦麥克風音量範圍不一樣,根據音量範圍去做數值上的調整

   [pow 4]:把收到的數值變成四倍,接回到[scale 1]讓scale隨音量改變



加入圖檔,圖的大小隨音量改變

   [destroy]:關掉畫面

   [dimen 800 400]:設定畫面大小800*400

   [pix_image dot.png]:放入自己畫的圖(圖檔要跟程式存在同一個資料夾)

   [translateXYZ 4 0 0]:設定圖檔的位置(x y z)

   [alpha]:開啟圖檔的透明度,才會透明



過濾影響圖形的聲音頻率範圍


   [bp~] :bandpass,過濾聲音頻率

   [hip~]:過濾某頻率之上的聲音

   [lop~]:過濾某頻率之下的聲音



[pi+pd]讓raspberry pi自動執行purdata檔案

(阿亂老師的課程筆記小幫手首次登場)
嗨,我是北藝大的vanlan,接下來的教學是阿亂老師的聲音裝置課的課程紀錄

今天教的是「如何讓寫好的pd程式可以在r-pi上自動執行」
以下動作都在raspi3裡執行


先說一些在pi裡pd的相關事項:

1)在pi上安裝pd只需要在終端機上輸入$ sudo apt-get install puredata


2)如果pd一直沒有聲音,請再次進入終端機,輸入$ sudo raspi-config,進入pi的設定


Advanced Options->Audio->(0)Auto改選(1) 通常就會有聲音了



進入自動執行的正題:

步驟1,打開終端機,輸入$ sudo nano /etc/profile
          (如果你的pi是第一代或第二代,輸入這行之前先輸入$ sudo nano /etc/inittab)

步驟2,按i進入編輯模式,在最後一行加入pd -nogui /home/pi/Desktop/main.pd  
           (路徑請自行改成要自動播放的檔案的存放位置、檔名)
             按esc -> :w+enter存檔 -> :q+enter離開

步驟3,輸入$ sudo raspi-config進入pi的設定,設定純文字模式開機
             選Boot Options -> B1 Desktop -> B2 Console Auto Login

從此這個pi只要插電就會直接執行你的pd檔啦~



把自動執行變回去:

步驟1,crtl+c跳出剛剛被鎖死的模式

步驟2,按按上下鍵,選到剛剛的sudo nano /etc/profile
             進入後刪除註解(在前面加入#)剛剛加的那行pd-nogui /home/pi/Desktop/main.pd
             存檔退出
步驟3,輸入$ sudo raspi-config進入pi的設定
             選Boot Options -> B1 Desktop -> B4 Desktop Auto Login
             Finish後讓他reboot重新開機就好囉