這次的作業看到要彈奏midi note同時又要輸出一段文字,就想到那不就是 詞+曲 嗎!?於是想說可以試試看做一個在鍵盤彈奏旋律的同時,輸出相對應的歌詞的作業(KTV模式?
然後就有了下面的作品
接下來會分成兩部分討論這次的作業,旋律、歌詞
ㄧ、旋律部分
在旋律的部分,我有想過幾種方式進行:
1.直接寫好各個音符的代碼、透過delay做出每個note之間的時間差來產生旋律
這個做法的話,就是會有很多很多個message跟delay的方塊,針對小星星這樣簡單、不長的旋律還可以,但只要旋律一變長,應該會寫到很無聊…,不過應該算是最直接、單純的方法
2.因為小星星的旋律有不少重複的樂句,所以我用不同的下拉選單寫出不同樂句的每個音符,然後再透過metro、計數去觸發不同的選項、最後連結到makenote就可以產生連續的樂句,再接好每一個句子的順序,就可以連成一段旋律
不過在寫這個方法的時候有遇到兩個問題:
一為在第三個跟第四個這兩個相同的樂句
我用計數的方式去選擇選單中的note,所以等數到超過樂句有的音符數時,就沒辦法透過選單產生音符,以至於有點難讓他重複的進行第三個句子兩次。
雖然想過可以用像是select 9 10 11然後再各減掉9的方式,或是多複製一句到選單中(讓menu items裡有兩個重複的樂句),不過想一想覺得跟現在我直接重複多放一個下拉選單的方式一樣不聰明XD 就選擇繼續繼續放著重複的選單了
第二個問題是,一句結束後觸發另一個句子,會讓這首小星星永遠的唱下去啊!
雖然也是可以像上面那個問題一樣,直接改放六個選單(以小星星來說有六句),但就也是不聰明的方法再+1XDD
3.前面的兩個方法其實簡單來說,都還是直接把曲子的旋律轉成一個一個音符寫出來,但這樣只要遇到旋律變化多、很長的音樂,根本就是做到天荒地老也做不完,所以! 還是直接寫個對應的鍵盤跟note,自己彈吧!(其實這好像也才是這次的作業內容?
這個就只是用老師上課提到的ASCII CODE來做,我做了從中央C開始往上兩個八度的音程(含黑鍵),然後是用數字鍵、小寫的英文字母來作為trigger。
音色的部分,我則也是透過計數,設定一個樂句(7個音符),換一次音色、顫音長度,都是透過random隨機選擇。這裡的計數則是跟著歌詞輸出會用到的計數一起。(最上面那張圖)
雖然鍵盤的部分都還算順利,不過在做的時候,也是有遇到一點點小問題,就是在kslide右上角接收velocity的值,我好像怎麼改變它,velocity都不會改變…. 都還是makenote裡的127
二、歌詞部分
其實這次的作業,旋律的部分並沒有卡關太久,用鍵盤做對應的note輸出也沒有花太多時間,真正花了很多時間的,是歌詞怎麼輸出啊!!!
小星星這裡,因為其實也才六個句子,所以我就也是簡單地用了計數的方式,去寫出歌詞顯示的順序。
第一個select 0 7 是用來判斷句子完成了沒的設定,select 0 是為了讓在第一個音符開始時,就可以輸出第一個句子,而後面的select 7 則是讓每一句7個音符完成後,可以接著輸出下一個句子。
第二個select 0到6則是輸出句子的順序。
這裡在做的時候就沒遇到太多的問題,畢竟都算是上次作業就用過的東西,唯一一個小小問題是,右邊的0跟-1是我設計來讓小星星唱完一次時,歸零的設定,但0有作用,-1不管重接了幾次、線檢查了幾次,都沒有用….
以上,都是針對小星星這首,旋律單純、每句音符數相同,所以可以很簡單就做出來的設定。
接下來就….
每一句旋律不一樣! 歌詞不一樣! 字數也不一樣!( 歌來自鄭宜農的就算我放棄了世界 詞/曲:鄭宜農 )
其實最早在思考,是想透過每一句歌詞的字數來做篩選,特別是針對中文歌。原先是希望透過字數來觸發cycle,並讓cycle在確定執行了第一個句子後,才會去執行下一個cycle。
不過這部分就開始遇到了大大的問題,
問題ㄧ:cycle可不可以設定成先確定有執行了第一個才會繼續接下來的執行
這部分試了各種條件的設定、cycle的輸出,發現…嗯…似乎有點難,cycle的執行似乎就是會做完一輪指令後,才執行下一輪指令。所以我如果要使用cycle,也是必須把歌詞的順序安排好,還要再加上其他的條件設定,那我不如用計數的方式去執行句子的順序好像還比較可行。
但用計數的方式,就接著遇到問題二了:沒有辦法在數到5的時候保留5,然後去檢查這句有沒有8個字,等確定沒有8在回來檢查5.6.7,(因為已經數到8了),所以會在數到5的時候,就送出5字的句子,而沒辦法在繼續數到8送出8字的句子。
所以後來在寫句子送出的順序時,就決定還是用計數的方式,不過是用select 8 14這樣字數累積上去的方式去寫要送出下一個句子的時間。後來在想有什麼其他方式的時候突然想到,既然下拉選單可以送出音符,那是不是也可以送出文字?最後就把歌詞中的字一個一個分別放到選單中,然後連到print,就成功了!只不過變成是一個音印出一個字,而不是原來樂句的形式了。
最後在準備要交作業前,才發現好像是要用文字觸發音樂,不是用音樂觸發文字…. 所以又盡快的做了一個(雖然還是不知道理解的意思對不對XD
這份的話,則是用字母對應到的ASCII CODE,在對應到組成單字的字母的ASCII CODE的加總,去判斷該輸出什麼單字,而在接收到對應單字的數字的時候,也會輸出該單字的音。
旋律部分則是先在選單內寫好了,所以一樣用計數的方式去輸出音符,然後在特定幾個字母的時候去改變音色、顫音長度。
這次的作業在研究cycle跟條件式花了不少時間,雖然還是有一點點地方不太懂,但至少已經算熟悉,也比較知道他們的邏輯了,不過這次的作業還是不太熟悉這些用法,或是不知道要怎麼代入系統裡會比較好,所以還是沒用的很多,但全部來說,感覺到自己有慢慢的對MAX更熟悉一點了!