棒歌ロイドキーボード

【mkII 専用】 2012年4月8日 公開

 リアルタイムで文字入力をしながら歌わせることができる演奏プログラムです。ボタン操作でカナを入力しながら画面上の鍵盤をタッチすることでその音程で歌わせることができます。
 機能はそれだけですが、鍵盤はサイズなどを自由に調整できるため使い勝手は良いと思います。(少なくとも1画面版 棒歌ロイドキーボードよりは使い勝手は格段に良いはず)

ACLS:CLEAR:PNLTYPE "OFF"
DIM A(25),B(256):Y$(3)="ャ":Y$(9)="ュ":Y$(7)="ョ"
FOR I=1 TO 9:READ A:B(A)=I:NEXT
FOR I=1TO 9:FOR J=1 TO 5
X$(I,(J+(J==2)-(J==3))*2+(J==1)-2)=CHR$(171+I*5+J-(I==9)*2-(I==8)*((J==3)+(J==5)*2))
NEXT:FOR K=0TO 2:X$(I,K*3+3+(K==1))=X$(I,4):NEXT:NEXT:X$(8,4)="ワ":X$(8,6)="ン"
PNLSTR 2,13,"[START]+[L] <==> [START]+[R]",13
GPAGE 0:GFILL 24,40,224,128,15:GFILL 27,43,221,125,0
GPAGE 1:GCLS 250
X=41:GOSUB @BF:X=157:GOSUB @KB:GOSUB @PN:MS=1

@MAIN
PB=B:B=BUTTON()
S=B%16:C=B%256-S:D=512AND B:M=256AND B:M$="":Y$="":F=1:N$=X$(E,F)
IF B>1023THEN GOSUB @SL
IF !D*B(C)THEN E=B(C):N$=X$(E,1):P=0
IF C*D/9*B(C)THEN F=B(C):N$=X$(E,F):P=1:IF E>1AND X$(E,F)==X$(E,4)THEN Y$=Y$(F)
H=(S==4)*3+(S==1)*9+(S==8)*7
IF H*(E>1)*(X$(E,3)==X$(E,4))THEN F=4:N$=X$(E,F):Y$=Y$(H)
IF M*E*(!(E%2)+!(E%3))*(E-8)THEN N$=X$(E-(E==9)*3,F)+CHR$(222+(E==9))
GOSUB @BG:GPAGE 1
V=DX:DX=X:W=DY:DY=Y:X=TCHX:Y=TCHY:Q=TCHST
IF Y-W<2THEN R=0
IF !T*Y*Q>174THEN GOSUB @MS:ON (X>21)*(X<85)+(X>133)*(X<197)*2+(X>222)*3-1GOSUB @BF,@KB,@PN
IF !Q THEN TALKSTOP:T=0:GOSUB @KC
IF Y<Q*150THEN GOSUB @TC
VSYNC 1:GOTO @MAIN

@TC
GOSUB @MS
PT=!T-(Y-W>ABS(X-V)*3)*(Y-W>8)*(R<1)*2
R=R+(PT<0):IF PT THEN GOSUB @KC:GOSUB @TK
RETURN

@TK
GOSUB @KC:CL=GSPOIT(X,Y)
IF CL==13THEN RETURN
P=(CL==14):Z=A(0OR (X+P*KS/2)/KS)-P
IF PZ==Z AND R>1THEN RETURN
PC=CL:PX=X:PY=Y:PZ=Z:KP=1:GPAINT X,Y,6
T$=V$+STR$(Z*58+1447)+N$+M$+Y$+W$
T=1:TALK T$:U$=RIGHT$(U$+N$+Y$,32):LOCATE 0,22:?U$;
IF PN THEN BEEP 22,Z*341.2-4096
RETURN

@BF
BF=0OR(X-21)/4
PNLSTR 0,20,"バッファ サイズ":PNLSTR 0,22,RIGHT$("0"+STR$(BF),2):
GFILL 19,172,87,186,251:GFILL 21,174,85,184,13:GFILL BF*4+21,175,BF*4+25,183,251
V$="@E16@S9@T"+STR$(BF*BF*4+50)+"@N":W$="-"*(BF*14+10)
RETURN

@KB
KB=0OR(X-101)/4:IF O+KB>23THEN KB=23-O
PNLSTR 14,20,"ケンバンスウ":PNLSTR 14,22,RIGHT$("0"+STR$(KB),2):
GFILL 131,172,199,186,251:GFILL 133,174,197,184,13:GFILL KB*4+101,175,KB*4+105,183,251
GOSUB @KP
RETURN

@PN
PN=1-PN
PNLSTR 27,20,"ピアノ":PNLSTR 28,22,MID$("OFFON ",PN*3,3),15
GFILL 220,172,252,186,251:GFILL 222,174,250,184,249+PN*2
@LP
IF TCHST THEN @LP ELSE RETURN

@KP
GFILL 0,0,255,150,15:H=N-5:KS=256/KB:FOR I=0 TO KB
GBOX I*KS,0,(I+1)*KS,151,13:NEXT
FOR I=0 TO KB:A=(I+O+7)%7:H=H+1
IF A!=2 AND A!=5 THEN K=KS*I-KS/2+1:L=KS*I+KS/2-1:GFILL K,0,L,80,14:GBOX K,0,L,80,13:H=H+1
A(I)=H:NEXT:VSYNC 1:RETURN

@KC
IF KP THEN GPAINT PX,PY,PC:KP=0
RETURN

@SL
GOSUB @MS
IF B==1540THEN ACLS:END
IF PB==B THEN RETURN
PS=D/512-M/256:PO=(GSPOIT(KS*(6.5+PS/2),50)==14)+1
IF O+PS>-6AND O+PS+KB<24THEN O=O+PS:N=N+PO*PS
LOCATE 0,0:?O,:GOSUB @KP:RETURN

@MS
IF MS THEN PNLSTR 2,13," "*28:MS=0
RETURN

@BG
Z$=N$+Y$:L=LEN(Z$)-1
GPAGE 0:GFILL 27,43,221,125,0
FOR I=0 TO L
GPUTCHR I*64-L*32+96,56,"BGF0",ASC(MID$(Z$,I,1)),0,8
NEXT:RETURN

DATA 192,64,80,128,0,16,160,32,48

QRコード(ファイル名:OCHABOKB)



《 使用方法 》

使用するボタンは以下のようになっています。

子音・母音選択[A] [B] [X] [Y] ボタン
子音確定[R] ボタン
濁音{L] ボタン

 文字入力はスマートフォンなどで採用されているフリック入力をモチーフとしてそれをボタン操作で行うことができる入力方法となっています。スマートフォンのソフトウェアテンキー([1]〜[9]のボタン)に相当するボタンは下記のようになっています。


[ 1 ]
[ 2 ]
[ 3 ]
[X] + [Y] ボタン[X] ボタン[A] + [X] ボタン
[ 4 ]
[ 5 ]
[ 6 ]
[Y] ボタン[A] [B] [X] [Y] ボタンを
どれも押さない
[A] ボタン
[ 7 ]
[ 8 ]
[ 9 ]
[B] + [Y] ボタン[B] ボタン[A] + [B] ボタン

画面中央の大きく表示されている文字がこれから発音しようとしている文字です。(スタート段階や何も押していない時は「ナ」が表示されている)
これは自由に変更できますので[1]〜[9]のボタンを使って2段階で文字入力をしていきます。

◎ 1st Step(子音の決定)

[X] + [Y] ボタン[X] ボタン[A] + [X] ボタン
「ア」行
「カ」行
「サ」行
[Y] ボタン[A] [B] [X] [Y] ボタンを
どれも押さない
[A] ボタン
「タ」行
「ナ」行
「ハ」行
[B] + [Y] ボタン[B] ボタン[A] + [B] ボタン
「マ」行
「ヤ」行+「ワ」「ン」
「ラ」行


◎ 2nd Step(母音の決定)

[R]ボタン を押しながら
[X] + [Y] ボタン
[R]ボタン を押しながら
[X] ボタン
[R]ボタン を押しながら
[A] + [X] ボタン
(母音「A」
母音「U」
母音「I」+拗音「ャ」
[R]ボタン を押しながら
[Y] ボタン
[R]ボタン を押しながら
[A] [B] [X] [Y] ボタンを
どれも押さない
[R]ボタン を押しながら
[A] ボタン
母音「I」
(母音「A」
母音「E」
[R]ボタン を押しながら
[B] + [Y] ボタン
[R]ボタン を押しながら
[B] ボタン
[R]ボタン を押しながら
[A] + [B] ボタン
母音「I」+拗音「ョ」
母音「O」
母音「I」+拗音「ュ」

この子音と母音の決定方法の表だけ見ると複雑な操作に感じるかもしれませんがテンキーとの対応表を見て[1]〜[9]に置き換えて考えれば非常にシンプルになっています。
子音(ワ、ンを除く)と母音の拗音以外は一般的なフリック入力の方向と同じなのですぐに覚えられると思います。

《 補 足 》

[A]+[B]といっても[A]と[B]全く同時に押す必要はなく[A]と[B]を押した状態であれば問題ないのでゆっくり押していけば確実です。
[A][B][X][Y]ボタンと[R]ボタンの同時押しができない場合は1stepと2stepの間に[R]ボタンを押す3stepで考えた方が簡単かもしれません。
なお、母音「A」(ア段の音)は2nd Stepを行う必要はなく1st Stepで決定できます。(Rボタンを押す必要はない)

拗音は「ャ」「ュ」「ョ」のみサポートしています。「ヲ」は「オ」で代用してください。
拗音は2nd stepを行わなくても1st stepの「子音+十字ボタン」で入力可能ですが、鍵盤操作をしにくいためおすすめし辛いです。
濁音は押している間のみ有効なので任意のタイミング(1st Stepでも2nd StepでもOK)で押して鍵盤をタッチするまで押し続けてください。
半濁音(「パ」行)はラ行+濁音で入力できます。

発音する文字が決まれば画面上の鍵盤をタッチすることで発声します。
あとは、適当に演奏するだけです。余分な機能は一切ありません。
本プログラムの動作を終了させる場合は[START]+[R]+[←]です。

《 設定について 》

このプログラムでは「バッファサイズ」「鍵盤数」「鍵盤の位置」「ピアノの有無」が選択できます。
画面上のスライダーやボタンを操作して好みの設定を行ってください。

◎バッファサイズについて
(0〜15の範囲で設定可能:デフォ値は5)

 これを大きくすると連続して発音できる時間が長くなり、小さくすると鍵盤操作に対する反応が良くなります。(設定0で約1秒、設定15で約25秒間の連続発音が可能です)

 プチコンのTALK命令は発話速度を遅くしたり、「ー」をたくさん連ねることで長時間の発声が可能になっていますが、それを行った場合にはかなりのタイムラグがあり鍵盤操作に対して若干の遅れを感じてしまうことになります。しかし、タイムラグを減らそうとして発話速度を速くしたり、「ー」の数を減らすと短時間しか発声できなくなってしまいます。どの程度が許容できるのかは人それぞれですし、演奏する曲によっても変わってくると思うのでそれを簡単に変更できるようにしています。
 デフォルトではパラメータTの値は150、「ー」の数は80個に設定しています。

◎鍵盤数について
(8〜23の範囲で設定可能:デフォ値は14)

 画面上の表示鍵盤数(白鍵の数)を自由に変えることができます。
 個人的には2オクターブあれば十分に感じますが指で操作する関係上鍵盤サイズを大きくしたいという人もいると思われるため使いやすさを考えて選択可能にしました。デフォではちょうと2オクターブ分となる14個ですが、これで不満になることは一般的な歌ではあまりあないため鍵盤数を増やす意味はあまりないし、細くなって使い勝手も悪くなってしまいますが、無駄にTALK命令で出せる上限の高さの音程まで鍵盤を増やせます(笑)

◎鍵盤位置変更について
(BEEPとTALK命令の有効範囲で設定可能:デフォの左端の白鍵はA2)

 鍵盤の左端の白鍵はデフォではラ(A2)の音になっています。これを変えたい場合には[START]+[L]ボタン(もしくは[R]ボタン)で白鍵1つ単位で移動できます。(移動量は上画面の左上に数字で表示)
 これはBEEPやTALK命令が出せる音域の範囲内だと自由に設定できるのですが、表示鍵盤数によって移動できる量に差があります。下限は鍵盤数に関わらず「-5」ですが、上限は「23−鍵盤数」となります。つまり、表示鍵盤数が23の状態だとすでにデフォで上限に達しているため右方向に移動はできないということです。また、同様に右方向に移動した状態の時は上限である「23」まで表示鍵盤数を増やすことはできません。

◎ピアノの有無について
(ONとOFFが設定可能:デフォは「ON」)

 これは特筆するようなことはないのですが、歌だけでは寂しい、もしくは正しい音が出ているのかわかりにくいと感じる人もいると思うので簡単な楽器音を入れただけです。他の伴奏と合わせるから不要という人もいると思うので簡単にOFFもできるようにしました。
 簡単な音取りをしたいという場合に別の鍵盤演奏プログラムを使わなくてもバッファサイズを最大にして鍵盤を軽く押せば声が出るまでのタイムラグによって無声でピアノ演奏も可能という使用方法もできます(笑)

《 演奏テクニック「レガート奏法」について 》

 この「棒歌ロイドキーボード」の特長としては独特のレガート奏法が可能なことが挙げられます。
 TALK命令で1音ずつ発音するとどうしても発声にブツ切れ感が生じてしまうのですが、それをより顕著にしているのが鍵盤を離している間には無声になってしまうことにあります。これはボタン操作を行って演奏する場合には避けられませんがタッチパネルの演奏では「押す」「離す」以外の選択も可能であるために実現できました。
 この「レガート奏法」を使えば離している間の無声時間が無くなるため音のブツ切れを大幅に改善してくれます。これはタッチパネル上に常時指を置いておいて、次に鳴らす鍵盤の上で待機しておいてその鍵盤上で下方向に軽くスライドさせる(簡単に言えば下方向へのフリック操作をする)だけです。意図的に休符を表現したいという場合以外は演奏中にタッチパネルから指を離す必要はないと思います。

 本当に効果があるのか疑問に思っている人は実際に確かめてみれば一目瞭然です。バッファを最小にして音を出しても発話タイムラグが比較的大きい「ナ」の音(発話文字によって発声するまでの時間が異なる)の場合だと1つの鍵盤を軽く連打(1秒間に3〜4回)しただけでもタイムラグによって全く発声ができなくなります。
 しかし、このレガート奏法によって鍵盤を上下にこするように指を移動させた場合にはそれなりに高速に動かしてもそこそこ発声できるのでレガート奏法の効果が大きいことが分かるでしょう。TALK命令で1音ずつ発音する場合にはこれ以上は無理ではないかと思います。

《 改造について 》

 このプログラムはリスト短縮を各所で行っているし、1行に詰め込んでいる部分もあり分かりやすいものとは言い難いため一応簡単な解説を書いておきますので改造などの参考にしてみてください。(1画面版「棒歌ロイドキーボード」ほどの無茶なコード短縮はしてないけど)

 カナ入力は清音を9×9の81個にマッピングしています。これは[1]〜[9]のボタン入力を2回分であるためです。これは本来であればDIM X$(10.10)を宣言する必要がある(縦横ともに0は使ってないため)けれどプチコンでは添え字10以下の配列変数は宣言不要であるため行っていません。
 81個は清音だけではお釣りが来るため開いた部分(2step目の斜め方向)に拗音「ャ」「ュ」「ョ」を割り当てています。しかし、濁音を表示する際に濁点を間に入れる必要性から拗音そのものはデータとして入れておらずリアルタイムで「清音+濁点+拗音」を結合しています。(後から気づいたけど拗音、濁音をリアルタイムで結合するのならばこのプログラムのようにキャラコードから強引に作成するのではなくあらかじめ「アウイイアエイオイ・・・」という感じで81個の文字を羅列してMID$を使って取り込んだ方がリストが短くなるかもしれない)

 十字ボタンを使うことで拗音を一発指定できるというのが最初の特長(拗音「ャ」「ュ」「ョ」は「イ」段の音とくっつくのが確定であるため2Step目の母音決定をする必要がない)でしたが、拗音を出すために左手の親指を使用したら鍵盤を演奏する指が足らないということでABXYボタンでも出せるようにしました。(十字ボタンで拗音を使用するためには、一端清音を確定してLボタンを押した状態で十字ボタンを選択し右手の親指で鍵盤を叩くという方法しかないのでスムーズな演奏は極めて困難)
 「ャ」「ュ」「ョ」の選択方向が気に入らないという場合は初期設定のY$(3)="ャ":Y$(9)="ュ":Y$(7)="ョ"の「ャ」「ュ」「ョ」を入れ替えるだけで簡単に変更ができます。キーそのものを変更したい場合には。[1]、[3]、[5]、[7]、[9]の好きなボタンに割り当て可能ですが配列変数Y$()の中の数字も変えただけでは駄目なので変更箇所は多くなります。

 「ャ」「ュ」「ョ」以外の拗音も使用したいというのならばまずは配列変数Y$()に入れなくてはなりません。現在は「ャ」に3、「ュ」に9、「ョ」に7を割り当てているので1、2、4、5、6、8が使用可能です。問題はどうやってそれらの音を入力するかですが、十字ボタンに「ァ」「ィ」「ゥ」「ェ」「ォ」を割り当てるという方法もあります。ただし、その場合は上記のように使いづらいという問題が発生します。使いづらい十字ボタンではなく他のボタンを使用する場合には2stepではなく3stepにするとかRボタンを確定用のみに使うのではなく本格的に文字入力ように使うなどの根本的な面から文字入力を見直す必要があるため大幅な改造が必要でしょう。

 文字入力をするボタンに対応するキーコードは「ア」「カ」「サ」・・・の順番(つまりボタン順)で末尾のDATA文に入っています。例えばアを中央にする(何も押さない時は自動的に「ア」になる)というようなことは1番目の数字を0に変えれば簡単にできるのですが同じ数字が2個ある場合はデータの後ろの方のみが有効となるため9個の数字に同じ数字をダブらないように注意が必要です。またこれはボタン配置そのものを変えることになるためキー設定のデータ変更したの場合は2step目もその配置に変更になってしまいます。

 文字入力以外は特にこれといって変わったことをしているわけではなく「文字入力+発声」という単純なプログラムであるためあとは特に説明は不用でしょう。リスト短縮のテクニックに関しては話題が完全にそれてしまうためそのうちTipsコーナーの方に書く予定です。
 しかし、鍵盤演奏部分も多くのプチコンプログラムでは使用していないようなものも使っているためそれらを書いていくことにしましょう。

 まず、本プログラムの特長の1つとなっているレガート奏法ですが、その判定については誤動作防止と使用の快適性のバランスを考えて下記のようにしています。

 下方向のスライド=直前2フレーム分の時間に垂直真下方向±18度の範囲で8ドット以上移動

 これに不満がある人は、サブルーチン@TC(LIST @TCで一発移動可能)の中にあるABS(X-V)*3「3」Y-W>8「8」を変えてください。前者は縦方向移動量と横方向移動量の比率(デフォだと縦方向の移動量が横方向の移動量の3倍であるため垂直方向に対してはATAN(1/3)≒18.4度までが許容範囲)になっており、後者が直前2フレームの間の移動量となっています。移動方向はあまり広くすると横にスライドしても反応してしまうし、移動量は小さくすると誤動作を招いてしまうため適度な範囲にするといいでしょう。

 次に録音機能が欲しいという人はサブルーチン@TKで生成されているZの値を逐次記録していけば簡単に実現できます。ただし、Zの値は負の数になることもあるし押してない時も記録しなければならないので多少の工夫は必要ですが。
 MEMリソースならば256バイトまでなのでかなり厳しいですが、GRPに保存するならば49152バイトまで記録可能であるため1フレームごとに発話文字と音程の2バイトを記録したとしても最大で6分50秒くらい記録できる計算になります。データ保存効率があまり良くないと感じれば適当なカウンタを用意して1フレームごとの記録ではなく鍵盤を押している時間と離している時間を記録すれば保存時間は数倍〜数10倍に伸びる(時間を1バイトで管理したら1音あたり4バイト、2バイトで管理しても1音あたり6バイトになるので最大で12288音分録音できる)ために十分な時間になる思われます。

 あと音色がピアノだけではつまらないという人はサブルーチン@TKにあるBEEP 22「22」をBEEPで出せる範囲内のもの(0〜263)に変えればいいだけなので初心者でも非常に簡単です。
 ピアノ(もしくは楽器音)だけあれば良くボーカルが要らないという人は上記設定でバッファサイズを最大にして発声までのタイムラグを大きくするか@TK内にあるTALK命令を削除もしくはコメントアウトしてください。
 TALKを無くしてしまうとこのプログラムの存在価値はかなり微妙になってしまいますが鍵盤演奏部分の使い勝手はとてもいいと思うのでそういう使用方法もありでしょう(笑)

 変えるとすればこの程度でしょうか。
 とりあえず、DSのハードウェア(=マルチタッチに非対応な小さなタッチパネル液晶とゲームに特化しており文字入力に向いていないボタン)でリアルタイム歌唱演奏が最も快適にできる方法を模索して私にとってはベストなものに仕上げて必要に感じた機能はすべて搭載しましたが、その反面であまり必要とは言えないものはあえて搭載していないため改造のし甲斐はあると思います。機能面で不満があるとか使い勝手がさらに良くなる方法があるという人はここに挙げたような改良のヒントなどを元にしてじゃんじゃん改造して自分好みのものにしてみてください。

 このプログラムを使ってリアルタイムで演奏するのはかなり難しいですが頑張って練習してまともに弾ける(歌える)ようになってください。

《 使用中の動画 》



RETURN/RETURN *MAIN

inserted by FC2 system