2017年7月17日 星期一

Pd 聲音視覺化1-3利用迴圈建立線段



----以下由小編紀錄阿亂老師 上課內容 與 重點筆記分享----

前言:

1-1 內容是如何影像反應即時的聲音,紀錄的是某刻的聲音影像
http://www.dazegraffiti.com/2017/07/pd-1-1.html
1-2 紀錄一段時間的聲音數據,利用clone畫出一段時間的聲音影像
http://www.dazegraffiti.com/2017/07/pd-1-2.html
1-3 利用迴圈畫出一段線段並讀取陣列數據
http://www.dazegraffiti.com/2017/07/pd-1.html
---------------------------



____________________________________________________________
教學影片1: 如何在pd 與processing 建立for迴圈,與數值反覆循環


教學影片2 : 利用迴圈建立的線段讀取陣列與顏色數值更改



__________________________

[1, 0 1000] -[line] 1000毫秒=1s時間內,數值由0~1 變化
[hsv2rgb] 色彩模式由hsv轉rgb




Pd 聲音視覺化1-2 陣列

----以下由小編紀錄阿亂老師 上課內容 與 重點筆記分享----


前言:

1-1 內容是如何影像反應即時的聲音,紀錄的是某刻的聲音影像
http://www.dazegraffiti.com/2017/07/pd-1-1.html
1-2 紀錄一段時間的聲音數據,利用clone畫出一段時間的聲音影像
http://www.dazegraffiti.com/2017/07/pd-1-2.html
1-3 利用迴圈畫出一段線段並讀取陣列數據
http://www.dazegraffiti.com/2017/07/pd-1.html
---------------------------

目標:
利用陣列紀錄聲音,gem繪圖物件相關參數讀取陣列數據內容
----------------------------

____________________________________________________________
教學影片:(影片比較長,以下筆記有標註影片時間點可以參考)




___________________________________
(00:50): 建立array陣列

put> array 建立陣列
滑鼠左鍵拖曳線段上直接儲存數據入陣列
圖表上右鍵properties可再修改屬性
_______________________
(01:35): 陣列讀取數值



[tabread vol]:讀取vol陣列,vol陣列名稱,
_
上方輸入端是是指陣列中第100個 
(圖表水平X軸由左至右 0~ size,最右端是陣列時size的數值)
_
輸出端輸出第100個儲存的數據是-0.36
(圖表垂直Y軸由下至上 -1~1)
_
_______________________
(03:16): 陣列寫入數值


(vol 陣列名稱)
[tabwirte]  右方指定輸入索引值(圖表水平X軸),左方數據輸入(圖表垂直X軸)
[tabwrite~] 聲音物件數據直接寫入陣列
dsp 記得打開
輸入端必須加bang物件去觸發輸入
______________________________________________
(05:50): 利用陣列數據畫出gem物件

[trigger] 複製訊號,輸出端由右至左依序複製出訊號 
[trigger float float] 表示複製出兩個float數據,下方輸出端會自動出現兩個

[trigger float bang] 表示右方輸出bang,左方輸出數據
可以簡寫成[t f b]
a: anything
f: float
b: bang
l: list


gemhead執行時先觸發讀取[tabread vol]陣列第100個數據
並將數據連結到位移物件的Y輸入端上
gem視窗出現的circle 的Y座標值, 即是陣列內第100的數值 


______________________________________________
(09:09): 建立dot 副程式

建立一個新文件dot.pd
將繪圖gemhead物件放入並儲存於跟主程式相同的資料夾內
(music.pd是主程式 dot.pd存放一樣的資料夾位置才可以呼叫)










($1指dot.pd第一個輸入端inlet的變數)
[expr ] 運算式"$f1"指的是$1的數值,
算式結果 


當$1 = 0 輸出-4

當$1 = 200 輸出4 (200是陣列設定的size)
[expr ] 運算式輸出到物件位移X值輸入端
[tabread]讀取陣列到物件位移Y值輸入端
______________________________________________
(13:28): clone物件複製dot



[clone 200 dot]  複製200等分 dot.pd patch
dot複製200份以後,點連成線段

________________________
(15:15):  使波形線段不斷更新運動


使用[metro] 不斷觸發[tabwrite],陣列不斷更新gem波形跟著運動
[metro 1000] 節拍器1000毫秒=1秒,指每秒觸發一次,數值越小越快
________________________
(16:35):  貼圖取代向量circle

[pix_image] 讀取圖片
[pix_texture] 貼上材質
[alpha]建立透明度
[square] 正方形向量

要將貼圖取代原本dot.pd裡的circle,
如果將讀取材質動作寫在dot.pd內
複製clone 200等分時,相當於讀取圖片動作重複 200次
非常耗效能,
因此比較恰當的做法是先在主程式將讀取圖片動作完成
再利用[send] [receive]傳送入dot.pd副程式內

主程式內先將圖片讀取完成 傳送到dot.pd內的gemhead




Pd 聲音視覺化1-1 即時聲音連結影像

----以下由小編紀錄阿亂老師 上課內容 與 重點筆記分享----

前言:

1-1 內容是如何影像反應即時的聲音,紀錄的是某刻的聲音影像
http://www.dazegraffiti.com/2017/07/pd-1-1.html
1-2 紀錄一段時間的聲音數據,利用clone畫出一段時間的聲音影像
http://www.dazegraffiti.com/2017/07/pd-1-2.html
1-3 利用迴圈畫出一段線段並讀取陣列數據
http://www.dazegraffiti.com/2017/07/pd-1.html

____________________________________________________________
目標:

了解入門gem繪圖相關指令,並將聲音訊號連結上繪圖物件
----------------------------------------------------

---------------------------------------------------
教學影片:(影片比較長,以下筆記有標註影片時間點可以參考)

                          

_____________________________
(00:50): 建立gem視窗
[gemwin] : 建立gem視窗
[dimen 500 500, create, 1] :  尺寸500x500 ,建立 ,true
[destroy] :  關閉視窗

[select 0 1]  :相當於 if else 指令

toggle  打X為1,打開視窗
           空白為0, 關閉視窗

[loadbang]-[1]-[toggle]  程式運行自動執行
______
[send pd]:傳送訊息給pd主程式
[dsp 1] :聲音打開
[dsp 0]:聲音關閉 
_______________________________
(09:35): 建立聲音
聲音物件尾端皆含有“~”符號,區別於邏輯物件



[osc~ 400] : oscillator振盪器400hz(頻率)


[dac~] : digital - analog 數位轉類比,相當於喇叭功能

______________________________________________________________
(13:40): 基本gem物件

[gemhead] : 建立繪圖物件開頭
[0.77] : number物件
** 執行模式下-  shift鍵+滑鼠拖曳 -數值以小數點0.01幅度變化
[scale] : 比例縮放,第二個輸入端控制比例縮放參數
[circle] : 圓形繪圖物件,後方參數為半徑大小, 4為滿版圓形
**方正視窗下,0為中心位置,-4與4為視窗左右邊界位置
_______________________________
(13:45): 聲音控制圖像
[unsig~10] : 將osc~訊號轉成float數值,10參數代表每10毫秒讀取一次(1000 = 1s)

** [unsig~]必須安裝”iemlib” library
    參考教學http://www.dazegraffiti.com/2017/07/unsig.html


[adc~] analog to digital 類比轉數位 ,相當於接收麥克風功能
[env~] 輸出分貝(db)數據,數值1~100
[/100] 除以100,為了使數據可以在0.01~之間連接scale參數改變circle大小
____________________________________________________________________
(21:02) 建立繪圖群組
[separator] : gemhead以下如果超過兩個物件,必須使用separator分開
[translateXYZ] : 位移XYZ


「解惑」關於某一個功能物件找不到,以[unsig~]為例

pd在0.46版以後,鼓勵大家學會自行安裝擴充的lib,所以如果有物件不能使用時,請依照下列步驟安裝上去。

1.步驟一:找尋相關物件的lib名稱,以[unsig~]而言,你可以到google輸入
unsig~ site:http://write.flossmanuals.net/pure-data/



你就會在手冊中找到 ,原來unsig~是屬於 iemlib這個物件



2.步驟二:到 help>find externals 裡面輸入:iemlib


3.步驟三:到 path,新增一個位置,以後pd開啟後,就會自動找到他









2017年7月5日 星期三

[ pd 數值傳送到 Arduino ] & 水龍頭 [ spigot ]

(代po同學遲po的FangJing教學文!抱歉遲了!)

嗨,我是北藝學生FangJing,在這裡跟大家分享從阿亂老師那獲得的的小知識,pd傳訊號到arduino的方法,以及pd裡 spigot 的功能。

——————————————————————

[ pd 數值傳送到 Arduino ] 
假定目的:讓led隨著pd裡的metro亮暗。

Arduino
首先要在Arduino的部分加上以下的程式碼:

1.
宣告一個整數(int) pdin,預設為10 (後面會說明,10為自己設定的數值,目的為讓led燈暗。) 

2.
在 loop() 的部分增加以下程式碼: 
(pink)
讓arduino判斷是否有數值傳入
“ Serial.available() > 0 “ 判斷 如果這個溝通管道有收到數值的話,就讀取它放進 pdin 裡頭。

(blue)
判斷讀入的數值執行相對應的動作
設定收到的數值如果為11,led燈亮,為10或非11的數值時(else),led燈暗。



Pure Data
接著是pd的部分: 


(增加部分為紅色部分,藍色部分的說明可以參照前幾篇文章。)
在metro下方增加object “t b b“ (trigger bang bang),當metro 送“0”時啟動左邊bang,送“1”時啟動右邊bang,並將數值連接回 comport,arduino就能夠讀取到pd的數值了。

p.s. [ 關於設定值 10 & 11 ]
這個數值是自己訂定的,也可以改成任何0與1以外的數值,pd會隨著metro的數值傳送10與11到arduino,讓arduino判斷收到10的時候暗,收到11的時候亮,以達到led燈跟著metro閃爍的效果。




p.s.s.  [ object  “spigot”  的用法 ]
以下圖狀況為例,綠色bang觸發時不會引發spigot下方的動作,除非綠色bang觸發時符合spigot右方的條件,數值才會通過,執行spigot下方接連的部分。

也就是說,spigot右方入口為通過條件,左方入口為欲通過的數值,符合條件才會通過並執行下方的程式。  

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