2.06.組み込み関数3

以下の追加の組み込み関数が存在します(MML音楽演奏等)。

戻り値のない関数は、式の中では使えません。


audcheck() 音楽演奏機能が利用可能かチェックします。

audmode() 音楽モードを設定します。(戻り値なし)

audmake() MMLを指定して音楽プレイヤーを作成します。(戻り値なし)

audmakedata() data URI schemeの文字列を指定して音楽プレイヤーを作成します。(戻り値なし)

audmakestat() audmakedata()の完了待ち状態を返します。

audplay() 音楽を再生します。(戻り値なし)

audspeedrate() 再生速度レートを設定します。(戻り値なし)

audstat() 再生状態を返します。

audstop() 再生を停止します。(戻り値なし)

audvolume() 音量を設定します。(戻り値なし)

disaud() 音楽プレイヤーを削除します。(戻り値なし)


2.6.1.組み込み関数3の詳細


--

audcheck()

音楽演奏機能(Web Audio API)が利用可能かチェックします。

音楽演奏機能が利用可能であれば1が返ります。

音楽演奏機能が利用可能でなければ0が返ります。


--

audmode(mode)

音楽モードを設定します。

modeに0を指定すると、音楽なしになります。以後、音楽演奏の命令は無視されます。


modeに1を指定すると、音楽ありになります。以後、音楽演奏の命令は実行されます。

そして、命令実行時に 音楽演奏機能(Web Audio API)が利用可能でなければ エラーになります。


modeに2を指定すると、音楽演奏機能が利用可能な場合のみ 音楽ありになります。

音楽演奏機能(Web Audio API)が利用可能であれば、音楽演奏の命令は実行されます。

音楽演奏機能(Web Audio API)が利用可能でなければ、音楽演奏の命令は無視されます。


デフォルトは mode=1 です。


(戻り値なし)


--

audmake(no,mml)

音楽プレイヤー番号 no の音楽プレイヤーを作成します。

mmlにはMML(Music Macro Language)の文字列を指定します。

(MML(Music Macro Language)については 2.6.2.を参照ください)


演奏の例.

audmake(0,"cdefg")

audplay(0)

while(audstat(0)>0){sleep(100)} // 演奏終了待ち


音楽演奏には Web Audio API を使用しています。

MMLをコンパイルして音声バッファに展開するため、

あまり長い音楽は再生できないと思われます。

また、現状は ある程度 高い音や低い音が うまく再生できません。

また、現状は ベロシティ(音の強さ)は未対応です。

また、音色も相当限定的なものになっています。


(戻り値なし)


--

audmakedata(no,dat)

audmake()と同様に、音楽プレイヤー番号 no の音楽プレイヤーを作成します。

ただしdatには、音楽ファイル(mp3等)をdata URI schemeに変換した文字列を指定します。


注意点として、audmakedata()は 作成が完了するまでに時間がかかります。

そして 作成が完了するまでは、音楽を再生することができません。

このため、作成完了を 以下のようにaudmakestat()をチェックして待つ必要があります。

audmakedata(no,dat)

while(audmakestat(no)){sleep(100)}


作成完了後の再生等の手順は、audmake()の場合と同じです(audplay()等))


音楽演奏には Web Audio API を使用しています。

音楽データをコンパイルして音声バッファに展開するため、

あまり長い音楽は再生できないと思われます。


(戻り値なし)


--

audmakestat(no)

audmakedata()の完了待ち状態を返します。

noには audmakedata()の引数と同じ音楽プレイヤー番号を指定してください。

audmakedata()の処理中は1が返ります。

audmakedata()の処理が完了すると0が返ります。


--

audplay(no,repeat)

音楽プレイヤー番号 no の音楽プレイヤーで、音楽を再生します。

音楽プレイヤーは 事前に作成済みである必要があります。

repeatに0以外を指定すると、リピート再生を行います。

repeatは省略可能です。省略した場合にはリピートは行いません。

現在再生中の音楽プレイヤーで 再度 audplay()を実行した場合は、

現在の再生を停止し、先頭から再生します。

(戻り値なし)


--

audspeedrate(no,spd)

音楽プレイヤー番号 no の音楽プレイヤーで、再生速度レートを設定します。

spdには再生速度レート(倍率)を数値で指定します。

例えば、1.5とすると 1.5倍速で再生します。

デフォルトは1です。

音楽プレイヤーは 事前に作成済みである必要があります。

(戻り値なし)


--

audstat(no)

音楽プレイヤー番号 no の音楽プレイヤーの 再生状態を返します。

再生中は1が、停止中は0が返ります。

また、音楽演奏機能(Web Audio API)が利用可能でないか、もしくは、

audmode()で音楽なし(mode=0)に設定していた場合には、-1 が返ります。

音楽プレイヤーは 事前に作成済みである必要があります。


--

audstop(no)

音楽プレイヤー番号 no の音楽プレイヤーで、再生を停止します。

音楽プレイヤーは 事前に作成済みである必要があります。

(戻り値なし)


--

audvolume(no,vol)

音楽プレイヤー番号 no の音楽プレイヤーで、音量を設定します。

volには音量を0-100までの数値で設定します。

デフォルトは100です。

音楽プレイヤーは 事前に作成済みである必要があります。

(戻り値なし)


--

disaud(no)

音楽プレイヤー番号 no の音楽プレイヤーを削除します。

(戻り値なし)



2.6.2.MML(Music Macro Language)について



MMLは "t120 !c0 @0 v120 cdefg" のように文字列で音楽を記述します。

本アプリで使用可能なMMLの命令は、以下の通りです。

(MMLには方言が多数あり、本アプリも独自文法になっています)

アルファベット、数字、記号は、すべて半角です。

アルファベットの大文字小文字の区別はありません。

割り当てのない記号や空白は、無視されます。


(1)テンポ(全チャンネル共通)

テンポは、t120 のように指定します。数字は20-1200までです。デフォルトは120です。

数字は 1分間に演奏する4分音符の数になります。


(2)チャンネル

チャンネルは、!c0 のように指定します。数字は0-7までです。デフォルトは0です。

複数のチャンネルは同時に演奏されます。


(3)音色(チャンネルごと)

音色は、@0 のように指定します。指定できる数字は以下の通りです。デフォルトは0です。

=0:方形波

=1:正弦波

=2:のこぎり波

=3:三角波

=4:ホワイトノイズ

=500:ピアノ(仮)

=501:オルガン(仮)

=502:ギター(仮)



(4)音符(チャンネルごと)

音符は、c+4. のように 音の高さ、変化記号(シャープ/フラット/ナチュラル)、

音の長さ、符点(音長を1.5倍します) の順に記述します。

音の高さ以外は省略可能です。


音の高さは、cdefgabの各文字が、ドレミファソラシに対応します。休符は r になります。

変化記号は、シャープが + になります。フラットが - になります。

ナチュラルが = になります。( + のかわりに #、 = のかわりに * を使うこともできます)


音の長さは、4分音符が4、8分音符が8 のようになります。

符点(.)をつけると音長を1.5倍します。

数字の前に%をつけると絶対音長の指定となり、

4分音符が48、8分音符が24 のようになります(c%48とc4は同じ意味)。

音の長さを省略した場合は、後述のデフォルト音長(Lコマンド)で指定した長さになります。

(デフォルトでは4分音符の長さになります)


また、タイ/スラーは、& 記号で音符をつないで表現します(c4&c4等)。

また、タイは、^ 記号で音長だけを連結することもできます(c4^4等)。



(5)オクターブ(チャンネルごと)

オクターブは、o4のように指定します。数字は0-8までです。デフォルトは4です。

また、< で 1オクターブ下げます。 > で 1オクターブ上げます。

また、!o で < と > の意味を逆にします(全チャンネル共通)。

(現状は、ある程度高い音や低い音が うまく再生できません

(オクターブがおおよそ3~6の間である必要があります))


(6)調号(チャンネルごと)

調号は、!+cfg のように シャープをつける音符を複数指定します。

また、!-eab のように フラットをつける音符を複数指定します。

また、!=cfg のように ナチュラルに戻す音符を複数指定します。

( + のかわりに #、 = のかわりに * を使うこともできます)

(演奏の音符と区別するため、この命令の終わりには空白を入れてください)


(7)ボリューム最大値(全チャンネル共通)

ボリューム最大値は、!v127 のように指定します。数字は1-1000までです。デフォルトは127です。

例えば、!v16 とすると チャンネル音量が 0-16 までであるようなMMLを実行できます。


(8)チャンネル音量(チャンネルごと)

チャンネル音量は、v120 のように指定します。

数字は0-ボリューム最大値(!vで指定した値)までです。デフォルトは120です。


(9)ベロシティ(チャンネルごと)

ベロシティ(音の強さ)は、k100 のように指定します。数字は0-127までです。デフォルトは100です。

(現状は、ベロシティは未対応です。記述しても無視されます)


(10)デフォルト音長(チャンネルごと)

デフォルト音長は、L4 のように指定します。音符の音の長さを省略した場合に この値が使われます。

数字は、4分音符が4、8分音符が8 のようになります。デフォルトは4です。

符点(.)をつけると音長を1.5倍します。

また、数字の前に%をつけると絶対音長の指定となり、

4分音符が48、8分音符が24 のようになります(L%48とL4は同じ意味)。


(11)発音割合指定(チャンネルごと)

発音割合指定は、q8 のように指定します。

数字は1-8で、音長の8分のいくつまで発音するかという意味になります。デフォルトは8です。



(12)ループ指定(チャンネルごと)

ループ指定は、[ abc : de ]2 のように指定します。

[ ] の中を、数字の回数だけ実行します。数字を省略した場合は 2回実行します。

(2より小さい数を指定した場合も 2回実行します)

また、: があると、最後の1回だけは : のところでループを終了します。


また、ループは入れ子にすることが可能です。

例えば、[cd:e [fg]3 ] を実行すると cde fg fg fg cd が実行されます。


注意点として、ループ指定はチャンネルごとであるため、

複数のチャンネルをまたぐようなループは実行できません。


(2016-8-15)