Beep Play (beeplay)   (C)2025 OffGao
===============================================================================

更新履歴
---------------------
0.90：初版



概要
---------------------
これはLinux用のプログラムで、引数にMMLのサウンドデータを指定することで、
適当に音を手っ取り早く鳴らせるプログラムです。
s1等の指定だけで鳴らせるサンプルデータもいくつかあります。

鳴らせる音色は、Duty比50%の矩形波のみです。
サウンド出力にはPulseAudioを使います。



使い方（コマンド）
---------------------
beeplay [MML]
  MML: 曲データ。シェルの命令と見なされないよう、なるべく""等で囲うこと。

beeplay [s*]
  s*：サンプルサウンド指定。
  ・s0 ：短いBEEP音
  ・s1 ：正解音
  ・s2 ：不正解音
  ・s3 ：上昇音
  ・s4 ：下降音
  ・s5 ：通知音（03raceから）
  ・s6 ：問い合わせ音（GGGから）
  ・s7 ：目のついた黄色いのがやられる音
  ・s8 ：発車ベル
  ・s9 ：ジャーン
  ・s10：サンプル音楽１（TEST300）
  ・s11：サンプル音楽２（03E）
  ・s12：サンプル音楽３（TEST106）
  
beeplay [NUM]
  NUM：数値
  ・0：簡単な正解音
  ・0以外(負数含む)：簡単な不正解音（DotActから）
  「コマンド ; beeplay $?」と書くことで、
  コマンドの結果に応じたサウンドを鳴らすことが出来ます。



使い方（MML文法）
---------------------
・c,d,e,f,g,a,b：音符・音階
  音符の後に'+'か'-'で、半音上げたり下げたり出来ます。
・r：休符
　音符・休符の後に数字か'.'をつけることで、音長を指定できます。
  音長には+や-による加算・減算が可能。（8.+2：付点8分+2分音符の長さ）
  音長数字の前に^をつけると、tick値を直接指定できます。
・< >  ： オクターブ上げ/下げ
・o[n] ：*オクターブ指定
・l[n] ：*デフォルト音長指定
・n[n] ：*ノートシフト指定
・q[n] ：*ゲートタイム指定(tick単位、音長-qの長さだけ音が鳴る)
・t[n] ：*テンポ指定(全トラックに影響)
・v[n] ：*音量指定(0-15)
・@[n] ： エンベロープ指定 0で無効、1が一番短い
・[n .. / .. ] ： ループ開始(n:回数・省略可) / 途中抜け / ループ終端
  ループ中にループを重ねることは出来ません。
・音符&音符： タイ・スラー
・; ： トラックの終了＆区切り、最大１９トラックまで
(*付きの項目は、数値の前に+をつけると相対指定に出来ます)



シーケンサ仕様
---------------------
・各設定のデフォルト値
  o7 l8 n0 q0 t150 v8 @0
 
  何の指定もせずに、手っ取り早くシステム通知のための簡単なメロディを
  鳴らすことに特化したデフォルト設定になっています。
  適当にa〜gのいずれかをランダムに並べるだけで、それなりの音になります。

・tick値：全音符が480
　つまり、「c1」と「c^480」が同じ長さ

・音階：MIDIの規格と同じ128段階



ライセンス
---------------------
このプログラムは、サンプルサウンドデータ含め、MITライセンスです。
改変・商用利用等自由に使えますが、大変なことが起きても俺は責任取らないし、
再配布時に著作権表記とライセンス文は残してね、ってやつです。
 
ライセンス全文は、license.txtにあります。












付録：サンプルサウンドのMML
---------------------
0："v12ec8"
0以外："v12>>>e>b-4"
s0："v12<g-"
s1："v10@70d>a<d>a<d>a3;v9@70<d>a<d>a<d>a3"
s2："t120v12l^1o6[15fr]r^30[110fr];v12l^1o5[15rc]r^30[110rc]"
s3："v10o4[30c48n+2];v10o4[30d48n+2]"
s4："v10o7[28c48n+-2];v10o7[30f50n+-2]"
s5："v11@40gegag<g4;v11r^2@20>gegag<g4"
s6："@35c+cc+c>f4;@25n-1>gbgbd4;@9<c+cc+c>f4;@9n-1gbgbd4;r4>>>d-;@50r4>>>>d-4"
s7："o5l23v8[8bn+1v+-1]v8[8bn+1v+-1]v8[8bn+2v+-1]v8[8bn+3v+-1]"
s8："o6l48[40af];v3r29o6l48[40af];v1r14o6l48[40af]"
s9："o8g2;o8e2;o8c2;o7g2;o7e2;o7c2;o6g2;o6e2;o6c2;n-4o7g2;n-4o7e2;n-4o7c2;n-4o6g2;n-4o6e2;n-4o6c2;n-4o5g2;n-4o5e2;n-4o5c2;o4e2"
s10："t130q6o6[ce-rg<c4.crr>b-4+16b-gre-f4.frrc4+16c--crde-4.grrf4+16e-dr/fg2..]>b-<c1+8>r8.g1;o5v6r4[6g8e-][6a8e-][3a-8e-][3a-8d][3g8d][3g8d-][6g8e-][6a8e-][3a-8e-][3g8d][6g8e-]r8.d+1;o4v10@30fgrr[c8<c>rrccrde-8b-rrggre-f8<c>rrffrcf8<c>rrffrga-8<c>rre-a-re-/a-8<c>rrda-rdg8brrdg8dg8brre-frg]g8<f>rre-f8.[c8<c>rrcf8g]v16c8.v8@0c1;o5v8r4r8[gr2gr2ar2ar2a-r2/a-r2gr2gr2]c-r4.r8gr2gr4.r8.v7d1;o5v8[8r1+8]r4..v6c-1"
s11："t120l8q3@299o6[g<cc>b4<c>g4.gfeagfc4de2.defgab<dc>b<c4>ag4fc4d/e4.&g4.]t110c2.n+3t120a<cc>b4<c>g4.gfefedc4de2.defgab<dc>b<c4>gt110agfc4dt85e2.; l8q3@80o3[c<<ee>>d<<ff>>e<<gg>>a<<aa>>f<<aa>>g<<gg>>c<<gg>>e<<gg>>d<<ff>>g<<gg>>e<<bb>>e-<<b+b+>>d<<aa>>/f<<ff>>c-<<gg>>g<<bb>>]g<<ff>>cegbgdn+3c<<ee>>d<<ff>>e<<gg>>a<<aa>>f<<aa>>g<<ff>>c<<gg>>e<<gg>>d<<ff>>e<<gg>>g<<bb>>g-<<b+b+>>fgagdfa b<c+@199a4.>; v7o5l4.[gab<c>ff<c>bab<gg->f/a<df>]dl8efde4.l8n+3l4.gab<cc>b<c>bab<ee-l8>c4>af4gb2."
s12："t150l32o5q4cdefgab-b<l16c4>a8.<cdrc4>l8a<c>b-afab-g4a4l16f8.agrl32agaal16b-r<crd2r4l32c-rcrdrer[l16f4a8.agr<c4>b-8a/rab-a8f8a8l32ab-agg4]araarrr>>ffrffrrr<<aaraarrr>ffrff; l16@20r4o4b+ab+a<f>a<fca+dacf>a<c>a<a>f<f>a<c>f<c>a<f>a<f>a<e>g<e>g<fdf>a<a>a<d>a<a>a<ceaeca>dgb<dgb<dgbr8.l32>defgaa+<cd[l16d>dfd<d>dfd<e>>a<<g>c/<c>c<e>c<f>>f<a+d<d>>a+<a+f<f>ca+g<e>>l32fgaa+<cd<]l32>ea<cea<ceal16[ffrffr8./d>dfb<ar8.]>aaraa; l16r4o3q4f8.c<cr>crfrl8f4cfab-b<c4>c4d<f<d>f>c<e<c>e>g2>g<rrrl16[b-8<<dr>>b-8<<dr>>a8<<er>>/a8<<gr>>g8<<fr>>g8<<dr>>b+8<<fr>>c8<<er>>]<c8<<cr>>>bbrbbr8.ggrggr8.<ccrccr8.>ccrcc"


