您現在的位置是:首頁 > 單機遊戲首頁單機遊戲

簡單程式設計,快速合成並演奏樂曲,繪製桌面歌詞

簡介播放簡譜midiOut

程式設計中什麼是合成法

我們使用簡單的開發工具 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___,

);

Top