您現在的位置是:首頁 > 單機遊戲首頁單機遊戲
簡單程式設計,快速合成並演奏樂曲,繪製桌面歌詞
- 2023-01-08
程式設計中什麼是合成法
我們使用簡單的開發工具 aardio ,體積只有幾 MB,下載開啟就可以程式設計了,不需要任何複雜的配置。
入門示例
使用 aardio 新建一個原始碼檔案:
輸入以下程式碼,點選
「執行」
按鈕合成並播放樂曲:
import
sys。midiOut;
//開啟播放裝置
var
midiOut = sys。midiOut();
//播放簡譜
midiOut。play(
“
兩隻老虎,
1__,2__,3__,1__,
兩隻老虎,
1__,2__,3__,1__,
跑得快,
3__,4__,5__,__,
跑得快,
3__,4__,5__,__,
一隻沒有耳朵,
5_,6_,5_,4_,3__,1__,
一隻沒有尾巴,
5_,6_,5_,4_,3__,1__,
真奇怪,
2__,‘5__,1__,__
”
);
程式設計記譜規則
上面的程式設計記譜法基於簡譜記號設計。
中音使用簡譜記號:
“1,2,3,4,5,6,7”
高音在後面加一個單引號:
“1’,2‘,3’,4‘,5’,6‘,7’”
低音在音符前面加一個單引號:
“‘1,’2,‘3,’4,‘5,’6,‘7”
所有音符以逗號分開,忽略空格、製表符、換行等。
前面加負號表示消音(停止演奏指定音符),例如:
“-5,-’5”
用下劃線表示一個延時單位(預設為 250 毫秒 ),前面的音符(或下劃線)與後面的下劃線可以連起來寫,例如:
“5___,5___”
記譜時可以直接呼叫 midiOut 的成員函式,函式名後必須有括號 () 且必須有引數,例如:
“pitchBend(0。6),1__,2__,3__”
pitchBend 函式用於彎音,引數為表示百分比的小數,0 ~ 0。5 為向下彎音,0。5 ~ 1 為向上彎音。更多可用函式請參考庫函式文件。
其他數值表示延時,其他字串表示字幕。
下面是一個小例子:
import
sys。midiOut;
var
midiOut = sys。midiOut();
//播放簡譜
midiOut。play(
“
1,150,
pitchBend(0。6), 彎音,
500, 延時 500 毫秒,
-1,停(音符前加負號表示消音)
1000
”
);
轉換簡譜為程式程式碼
我們學習一下怎麼翻譯簡譜,先找個簡譜:
4/4 表示以四分音符為一拍,每小節有 4 拍。那麼我們用 2 個下劃線表示一拍(也就是 500 毫秒 ),那麼 上面的
我們翻譯為程式碼:
1__,2__,3__,1__,
再看下面的簡譜:
這上面的短橫線為增時線,表示增加一拍(這裡是 500 毫秒,程式碼裡就是增加 2 個下劃線 ),所以上面的簡譜翻譯為程式碼就是:
3__,4__,5__,__,
然後我們再看簡譜:
音符下面的橫線是減時線,也就是由一拍減為半拍(這裡是 250 毫秒,程式碼裡用一個下劃線表示),所以上面的簡譜翻譯為程式碼就是:
5_,6_,5_,4_,3__,1__,
最後生成完整原始碼如下:
import
sys。midiOut;
//開啟播放裝置
var
midiOut = sys。midiOut();
//播放簡譜
midiOut。play(
“
1__,2__,3__,1__,
1__,2__,3__,1__,
3__,4__,5__,__,
3__,4__,5__,__,
5_,6_,5_,4_,3__,1__,
5_,6_,5_,4_,3__,1__,
2__,‘5__,1__,__
”
);
要特別注意上面有一個低音 ’5,音符前面加個單引號表示低音。
自定義音高、拍子快慢
midiOut。play 函式可選用第 2 個引數指定音符 1 對應的 SPN 音名( 可用音名在 sys。midiOut。notes 名字空間定義 ),預設值為 “C4”。可選用第 3 個引數指定單個下劃線對應的延時單位(預設為 250 毫秒 )
我們將上面示例的音符 1 改為 “E4” (其他數字音符會自動調整音高),一個延時單位改為 125 毫秒(加快一倍),程式碼如下:
import
sys。midiOut;
//開啟播放裝置
var
midiOut = sys。midiOut();
//播放簡譜
midiOut。play(
“
兩隻老虎,
1__,2__,3__,1__,
兩隻老虎,
1__,2__,3__,1__,
跑得快,
3__,4__,5__,__,
跑得快,
3__,4__,5__,__,
一隻沒有耳朵,
5_,6_,5_,4_,3__,1__,
一隻沒有尾巴,
5_,6_,5_,4_,3__,1__,
真奇怪,
2__,‘5__,1__,__
”
,
“E4”
,125);
請執行一下,聽一聽有什麼區別。
繪製桌面歌詞
下面我們再小小改進一下,播放音樂時在桌面上顯示漂亮的歌詞。
原始碼如下:
//建立桌面歌詞視窗
import
win。util。lyric;
var
lyric = win。util。lyric();
lyric。show();
//開啟播放裝置
import
sys。midiOut;
var
midiOut = sys。midiOut();
//定義顯示歌詞的函式
midiOut。log =
function
(str){
lyric。text = str;
}
//播放簡譜
midiOut。play(
“
兩隻老虎,
1__,2__,3__,1__,
兩隻老虎,
1__,2__,3__,1__,
跑得快,
3__,4__,5__,__,
跑得快,
3__,4__,5__,__,
一隻沒有耳朵,
5_,6_,5_,4_,3__,1__,
一隻沒有尾巴,
5_,6_,5_,4_,3__,1__,
真奇怪,
2__,’5__,1__,__
”
);
按「執行」按鈕,顯示效果如下:
多執行緒
下面建立獨立執行緒合成並播放音樂,原始碼:
//合成並輸出音樂
import
win。util。lyric;
var
lyric = win。util。lyric();
lyric。show();
//建立獨立執行緒
thread。invoke(
function
(lyric){
import
sys。midiOut;
var
midiOut = sys。midiOut();
//指定字幕回顯函式
midiOut。log =
function
(v) lyric。text = v;
midiOut。play(
“
兩隻老虎,
1__,2__,3__,1__,
兩隻老虎,
1__,2__,3__,1__,
跑得快,
3__,4__,5__,__,
跑得快,
3__,4__,5__,__,
一隻沒有耳朵,
5_,6_,5_,4_,3__,1__,
一隻沒有尾巴,
5_,6_,5_,4_,3__,1__,
真奇怪,
2__,‘5__,1__,__
”
);
lyric。close();
},lyric);
win。loopMessage();
使用 SPN 音名記譜
程式設計記譜時可使用 sys。midiOut。notes 名字空間指定的
所有音名,這些音名使用科學音高記號(Scientific pitch notation)。
音名與音符的對應關係如下:
當然音名與唱名的對應關係可以變更,這裡先不用管這些。音名後面的數值越大表示越高的音,例如 C4( 中央C ,簡譜中的 1 ) 高八度就是 C5( 高音 do,簡譜 1 上面加一點),低八度的音就是 C3 ( 低音 do,簡譜 1 下面加一點)。
注意:
SPN 音名中的 -1 省略
SPN 音名中的升號 ♯(Sharp) 用小寫 s 替代
例如:C-1♯ 略寫為 Cs 。
示例:
import
sys。midiOut;
var
midiOut = sys。midiOut();
midiOut。play(
“
C4,_,_,D4,_,_,E4,_,_,C4,_,_,
C4,_,_,D4,_,_,E4,_,_,C4,_,_,
E4,_,_,F4,_,_,G4,_,_,_,_,
E4,_,_,F4,_,_,G4,_,_,_,_,
G4,_,A4,_,G4,_,F4,_,E4,_,_,C4,_,_,
G4,_,A4,_,G4,_,F4,_,E4,_,_,C4,_,_,
D4,_,_,G3,_, _,C4,
1000
”
);
也可以這樣寫:
import
sys。midiOut;
//開啟音名空間
namespace
sys。midiOut。notes{
//記譜(這裡下劃線與音符不能連起來,也不能使用數字音符)
drm = {
“兩隻老虎”
,
C4,_,_,D4,_,_,E4,_,_,C4,_,_,
“兩隻老虎”
,
C4,_,_,D4,_,_,E4,_,_,C4,_,_,
“跑得快”
,
E4,_,_,F4,_,_,G4,_,_,_,_,
“跑得快”
,
E4,_,_,F4,_,_,G4,_,_,_,_,
“一隻沒有耳朵”
,
G4,_,A4,_,G4,_,F4,_,E4,_,_,C4,_,_,
“一隻沒有尾巴”
,
G4,_,A4,_,G4,_,F4,_,E4,_,_,C4,_,_,
“真奇怪”
,
D4,_,_,G3,_, _,C4,
//用下面的方式呼叫函式,小於等於 127 的延時必須呼叫 delay 函式
{
“delay”
,1000}
}
}
var
midiOut = sys。midiOut();
midiOut。play( sys。midiOut。notes。drm );
切換樂器
我們還可以選擇不同的樂器,程式碼示例:
import
sys。midiOut;
var
midiOut = sys。midiOut();
//選擇八音盒,引數為樂器編號
midiOut。changeInstrument(10);
在譜子中也可以切換樂器,例如:
import
sys。midiOut;
var
midiOut = sys。midiOut();
midiOut。play(
“
changeInstrument(10),
1___,
2___,
3___,
”
);