プチコン講座

第8回 楽器演奏プログラムを作ろう

【mkII専用】


 今回は、プチコンで楽器演奏プログラムを作ってみようと思います。
 作ってみたいものはいろいろありますが、まずは鍵盤楽器を作ってみることにしましょう。いわゆるキーボードプログラムです。

 第4回の講座で書いたようにプチコンでは下画面(タッチパネル)を使ってさまざまなことができます。ここに鍵盤を表示してタッチによる入力を行えば直感的な演奏を行うことが可能になります。第3回の講座ではBEEPで音階演奏をする方法について書きましたが、mkIIではBGMPLAY命令によってユーザーの手によって記述されたMMLの演奏ができるようになったためBEEP命令ではなくBGMPLAY命令を使って作ろうと思います。

 鍵盤演奏プログラムをBEEP命令ではなくBGMPLAY命令で作るメリットは、「使える楽器の種類が多い」「音の長さが指定できる」「高音質」という点が挙げられます。2番目の「音の長さ」については、第3回の講座でも書いたようにBEEP命令の弱点となっています。
 鍵盤演奏プログラムを作るのに必要なものは「鍵盤表示」「押した鍵盤に対応した音を鳴らす」(=タッチした座標を元にした当たり判定処理と適切な音色出力処理)というものでしょう。

 プログラムを作る前にまずBGMPLAY命令によるMML記述の超基本について書いていきます。
 最低限覚えておく必要があるのは「:」(チャンネル)「T」(テンポ)、「L」(デフォルト音長)「O」(オクターブ)「<」(オクターブを上げる)「>」(オクターブを下げる)「C」「D」「E」「F」「G」「A」「B」(「ド」「レ」「ミ」「ファ」「ソ」「ラ」「シ」「ド」の音階)です。音階については「#」もしくは「+」で半音上げ、「-」で半音下げることができ、音階の後ろに数字を入れるとその音符の長さとなります。(音符の長さを指定しない場合は、デフォルト音長の長さとなる)

 つまり、BGMPLAY ":0T120L4O4CDEFGAB<C2" は、チャンネル0、テンポ120の速さ、オクターブ4でド(四分音符)、レ(四分音符)、ミ(四分音符)、ファ(四分音符)、ソ(四分音符)、ラ(四分音符)、シ(四分音符)(高い)(二分音符)を演奏します。(チャンネル指定は和音演奏時以外は省略可能でTコマンドやLコマンドなども不要な場合に限り省略できる)
 ちなみに音の高さはBEEP命令と比較するとBEEP 22,0BGMPLAY "O4C"と同等になります。あと、BEEP 22,-4096BGMPLAY "O3C"BEEP 22,4096BGMPLAY "O5C"と同等です。
 ここまで分かればごく簡単な曲はBGMPLAYで演奏できると思います。


 さて、いよいよ本題に入りますが、プチコンにおいては上記のように鍵盤楽器プログラムと相性が良いためか多くのプログラムが存在します。私が確認しているだけで10作品以上存在するくらいです。それだけあるのならば「自分で作る必要なんてないからそれを使えばいい」という考えの人も出てくるかもしれません。それも事実なので仕方ないでしょう。「自分で作る」というのは「自分で作りたいものがある」ということがあって初めて生まれてくるものです。(すでに自分の思い描いている理想型のもの存在するならば作る必要性がなくなる)

 では、発想の転換として鍵盤演奏プログラムであっても「既存のものとは何か違うもの」を作ってみましょう。
 しかし、「何か違うもの」という漠然な考えでは第1回の講座の冒頭で書いたように「具体的なもの」になっているため作ることはできません。しかし、プチコンにおいてはタッチペンでの操作が基本であるためペン操作を前提としたような小さいキーボードの鍵盤演奏プログラムばかりとなっています。つまり、タッチペンを使わず指で手軽に操作できるような鍵盤演奏プログラムならば既存のものと十分に差別化できそうです。
 このように「既存のジャンル」であっても「自分独自のオリジナリティを追加」することによって「新しいもの」を生み出すことが可能になります。

 まずは、画面タッチをすることで「ドレミファソラシド」の音階を発生させる簡単なプログラムを用意しました。処理を簡単にするため白鍵のみでしかもオクターブ設定はありません。(「シ」の次は最初の高さの「ド」になる)

《 サンプルリスト1 》
ACLS:CLEAR:PNLTYPE "OFF"
GPAGE 1:GCLS 15
K=16:S=256/K
FOR I=0 TO K-1
 GLINE I*S,0,I*S,191,13
NEXT

@MAIN
Z=0 OR (TCHX/S)
IF TCHST THEN BGMPLAY MID$("CDEFGAB",Z%7,1)
WAIT 1
GOTO @MAIN

 これは、3行目のK=16が鍵盤数(白鍵数)を示しています。変数Sは鍵盤1つ当たりの横幅です。これが分かれば鍵盤を表示するのは簡単ですね。
 問題は演奏部分ですが、8行目の変数Xに左から何番目の鍵盤を押したかが入っています。Z%7(Zを7で割った余り)が「0(ド)」「1(レ)」「2(ミ)」「3(ファ)」「4(ソ)」「5(ラ)」「6(シ)」に対応しているためそれを鳴らせば完成です。
 ただ、これだと鍵盤をタッチしている間ずっと鳴っているためあまりピアノっぽくありませんね。そこで前回鳴らした音(Zの値)を別の変数に入れてそれが異なった場合のみ(つまり、別の鍵盤をタッチした場合のみ)、音を出すことにしましょう。

《 サンプルリスト2 》
ACLS:CLEAR:PNLTYPE "OFF"
GPAGE 1:GCLS 15
K=16:S=256/K
FOR I=0 TO K-1
 GLINE I*S,0,I*S,191,13
NEXT

@MAIN
L=Z:Z=0 OR (TCHX/S)
IF TCHST*(L-Z) THEN BGMPLAY MID$("CDEFGAB",X%Z,1)
WAIT 1
GOTO @MAIN
※リスト1との違いを青字にした

 これを実行して(タッチペンを使わず指で)すばやくいろいろな場所の鍵盤をタッチしてみると隣の鍵盤にうっかり触れてしまうことが多々あることでしょう。これによって鍵盤数16個(横16ドット)では指で演奏するのには小さいというのは感じたことだと思います。(このサンプルでは黒鍵がないため隣の鍵盤を押したのかが分かりにくいけど1回タッチして2回以上の音がした場合には100%隣の鍵盤を押している)
 では、「指で演奏できるような鍵盤演奏プログラムを作る」という場合においてどのような点において注意していけば良いのでしょうか。それは下記の2つの点が重要だと思われます。


 《 指で演奏できる鍵盤演奏プログラムに必要なもの 》

    (1) 十分な大きさの鍵盤

    (2) 十分な大きさの当たり判定


 (1)に関しては、プチコンの画面のドット数は固定であるため鍵盤数を減らせば1つあたりの鍵盤の大きさは大きくできるというのは容易に理解できると思います。
 しかし、(2)に関してはどういう意味か分かりにくいと思うでしょう。それは、堅くて先端の面積が小さいタッチペンとは異なり、指は柔らかくて画面に触れる表面積が大きいというのが原因で正確な位置をタッチできないためです。これは、触れる瞬間から離す瞬間までTCHXで取得される座標が大きく変化することを意味します。仮に左右5ドット程度のブレがあるとすれば鍵盤の横幅が16ドットあっても正確な当たり判定ができるのは中央部の6ドットしかないということです。(その周囲±5ドット分は隣の鍵盤の音を出してしまう可能性がある)
 これは、タッチして離したら次の音が出せるようにすれば簡単に解決ができます。プチコン標準のQWERTYキーボードもこれを懸念しているためかタッチして離すまでは別の文字を入力できないようになっています。(iPhoneなどではタッチした瞬間に文字を確定するのではなくワンクッション入れることでこの問題を解決している)

 しかし、(1)の「十分な大きさの鍵盤」というのがどの程度かは人によって変わるでしょう。上記のサンプルでは変数Kの値を変えることで鍵盤のサイズ(横幅)が変えられるようになっていますが、それをプログラム実行中に自由に設定できるようにすれば解決できそうです。ただし、鍵盤数が8個で十分でも普通の「ド」(C4)〜高い「ド」(C5)まででは不十分で低い「ラ」(A3)〜普通の「ラ」(A4)までが必要という場合もあるでしょう。サイズを大きくすればするほど音域が狭くなるためどの音域をカバーできるかが非常に重要な問題となってきます。そこで、鍵盤で鳴らせる音域も鍵盤1つ単位で柔軟にかつ自由に変更できるようにしようと思います。
 
 鍵盤のサイズや位置の設定機能は後から追加するとして現状のサンプル2において全く実用にならない点といえばやはり黒鍵表示やオクターブ設定がないことでしょう。
 あと、鍵盤は小さくなるため縦2段には表示しないつもりですが、現状のように縦幅一杯使うと機能を拡張する際に融通が利きにくくなるため少し手前側(画面下部)を開けることにします。縦方向の当たり判定にはかなり余裕があるためこうすることでキーボードの押しにくくなることもなく、システムアイコンやオリジナルのGUIを使って様々な機能を拡張することが可能になります。(ただし、今回の講座では設定をボタン操作で行うことにしたため最後までシステムアイコンは使ってないですが)

《 サンプルリスト3 》
ACLS:CLEAR:PNLTYPE "OFF"
GPAGE 1:GCLS 13
GFILL 0,0,255,160,15
K=10:S=256/K
FOR I=0 TO K
Q=I%7
 GLINE I*S,0,I*S,191,13
 IF Q!=0 AND Q!=3 THEN GFILL I*S-S/2+1,0,I*S+S/2-1,90,14
NEXT

@MAIN
A$="":X=TCHX:Y=TCHY:T=TCHST
G=GSPOIT(X,Y):W=X
IF G==14THEN A$="#":W=X-S/2
Z=0 OR (W/S)
Z$="O"+STR$(0OR(Z/7)+4)+MID$("CDEFGAB",Z%7,1)+A$
IF !T THEN F=0
IF T*!F THEN F=1:BGMPLAY Z$
WAIT 1
GOTO @MAIN
※リスト2との違いを青字にした

 「ド」の白鍵を「0」とした場合には「0」と「3」の白鍵の左上(「シ」と「ド」の間、および「ミ」と「ファ」の間)には黒鍵がないため7で割った余りを元にすれば簡単に分かります。黒鍵の当たり判定は色を元にすれば簡単に分かるので鍵盤半分ずらしてMMLで階名の後に「#」(もしくは「+」)を加えれば実現できます。
 上記の(1)の「十分な大きさの鍵盤」というのは当然ながら黒鍵においても言えるため黒鍵のサイズは一般的な鍵盤楽器における比率(概ね白鍵の半分の横幅)ではなく可能な限り大きくしています。
 オクターブは押した鍵盤の場所を7で割った商を元にすれば簡単に分かります。
 鍵盤を押さえたらフラグ(変数F)は1になるため押している間は指がずれても他の音は鳴らなくなりました。(離したらフラグは0になる)
 これでとりあえず使える最低限の鍵盤演奏プログラムができました。

 さて、ここで実際に演奏をしてみると鍵盤がない下の部分でも音が出てしまいます。これはリスト3では鍵盤との当たり判定は単純にタッチされたX座標のみを元にしているためです。画面下側まで白鍵で埋まっていたリスト2とは異なり余白があるためこれではいけません。タッチされたY座標を元に判断してもいいのですが、黒鍵との当たり判定に色を使っているのと同じく余白はグレーであるため色で判断が可能です。
 それと音がすぐに消えてしまうというのが気になるかもしれません。音長指定できないBEEPと違ってBGMPLAYではMMLで音長指定ができるためこの辺は改善可能です。あと、押した鍵盤が赤く光るようにすれば自分が弾こうと思った鍵盤がちゃんと押さえられているかも分かりやすくなるため追加することにしましょう。

《 サンプルリスト4 》
ACLS:CLEAR:PNLTYPE "OFF"
GPAGE 1:GCLS 13
GFILL 0,0,255,160,15
K=10:S=256/K
FOR I=0 TO K
Q=I%7
 GLINE I*S,0,I*S,191,13
 IF Q!=0 AND Q!=3 THEN GFILL I*S-S/2+1,0,I*S+S/2-1,90,14
NEXT

@MAIN
A$="":X=TCHX:Y=TCHY:T=TCHST
G=GSPOIT(X,Y):W=X
IF G==14THEN A$="#":W=X-S/2
Z=0 OR (W/S)
Z$="T1L1O"+STR$(0OR(Z/7)+4)+MID$("CDEFGAB",Z%7,1)+A$
IF !T*F THEN BGMSTOP 0,0.3:GPAINT D,E,F:F=0
IF T*!F*(G>13) THEN D=X:E=Y:F=G:BGMPLAY Z$:GPAINT X,Y,2
WAIT 1
GOTO @MAIN
※リスト3との違いを青字にした

 プチコンのMMLをはじめ一般的なMMLでは、音の長さはデフォではテンポ(Tコマンド)は120デフォ音長(Lコマンド)は4(つまり、四分音符で120BPM)となっています。これをT1L1と設定すればかなり長い音を出すことができます。(単純計算では連続で4分間となるけどピアノのように自然減衰する音だと数秒間で音は消えてしまう)
 ただし、長い音を鳴らせるようにしたため「鍵盤を離しても音がずっと鳴り続ける」という別の問題が発生するようになりました。そのため離した場合にはBGMSTOP命令で停止する(17行)ようにしました。(BGMSTOP命令ではフェイドアウト時間のオプション設定ができるため0.3秒でフェイドアウトにするようにした)

 赤く光る処理はGPAINTを使い鍵盤を赤で塗りつぶせばいいけど離した場合に元に戻す必要があります。そのため鍵盤を押さえた時の座標を別の変数に入れておくとともに押したのが白鍵か黒鍵かも別の変数に入れておかなくてはなりません。「白鍵か黒鍵か」というのは鍵盤を押さえたか否かというフラグと兼ねることが可能なので変数Fは1か0かではなく押した色となる14、15か0かという値になっています。
 これによって、鍵盤を離した際にはその変数Fの値の色で鍵盤を塗りつぶせばいいので簡単です。
 これで、見た目も音もぐっと良くなりましたね!


 次にいよいよ設定機能を付けます。
 行う必要性があるのは鍵盤数、鍵盤の位置の設定です。そして、ピアノの音だけでは寂しいので音色もボタン操作によって変えられるようにしましょう。

 まず簡単なのは音色変更でしょう。プチコンでは@コマンドで音色を0〜129が選択できますが、128、129はドラム関係となっているためここでは0〜127の128種類の音色を設定できるようにします。(0〜129以外にも144〜255のPSGやBGMRPG命令でユーザー定義した波形が選択できる)
 これは単純にボタン操作で音色を示す変数の値を「+1」もしくは「-1」にすればいいです。この設定は十字ボタンの上下に割り当てましょう。鍵盤の位置は左右に割り当てることにします。こうすることで上下、左右でどのように変わるのかが感覚的に分かりやすくなると思います。鍵盤数は一度設定したら滅多に変えることはないと思うので[A][B]ボタンに割り当てることにします。
 しかし、音色の値を1ずつしか変更できないとなると128種類の音色を選択するのに最大64回(数字の先頭と末尾がループする場合)ものボタン入力が必要になってきます。これではあまりに辛いので一気に音色No.が変わるボタンを用意したいところです。
 使用していない[X][Y]ボタンに「+10」「-10」を割り当てるという方法もありますが、ここでは[L]ボタンに「+25」を割り当てることにします。これだけだと「一気にマイナスする場合はどうするのか?」という疑問が出てきそうですが、音色No.をループするようにすればほんの数回[L]ボタンを押すだけで全く問題ないのです。(最大でも15回ボタンを押せば0〜127のどんな値も設定できる)

 これによって、左手でほぼすべての設定が行えるようになり、右手は演奏に専念することが可能になります。また、左手で十字ボタンを操作するような持ち方だと[X][Y]ボタンを押すと非常に不安定であるため持ち替えが必要になり、そういう点においては[L]ボタンのみで音色No.を大きく変えることによって操作性をアップさせることが可能になると言えるでしょう。[R]ボタンは使用していないため鍵盤数以外の設定を初期化するボタンに割り当てた)


 以上を元にしてできたのがこのプログラムです。

《 「プチコン キーボード」 プログラムリスト 》
ACLS:CLEAR:PNLTYPE "OFF"
K=14:GPAGE 1
GOSUB @KENBAN

@MAIN
A$="":X=TCHX:Y=TCHY:T=TCHST
G=GSPOIT(X,Y):W=X
IF G==14THEN A$="#":W=X-S/2
Z=0OR(W/S)+P
Z$="T1L1O"+STR$((0OR Z/7)+4)+"@"+STR$(N)+MID$("CDEFGAB",(Z+28)%7,1)+A$
IF !T*F THEN BGMSTOP 0,0.3:GPAINT D,E,F:F=0
IF T*!F*(G>13) THEN D=X:E=Y:F=G:BGMPLAY Z$:GPAINT X,Y,2
B=BTRIG()
K=K+(B==32)*(K<20)-(B==16)*(K>4)
P=P+(B==8)*(P<14)-(B==4)*(P>-28)
N=(N+(B%4+1)%3+127+(B==256)*25)%128
IF B==512 THEN P=0:N=0
IF B THEN GOSUB @KENBAN
WAIT 1
GOTO @MAIN

@KENBAN
GCLS 13:CLS
?"ケンバン スウ="K
?"ケンバン イチ="P
?"ネイロ No. ="N
GFILL 0,0,255,160,15
S=256/K
FOR I=0 TO K
 Q=(P+I+28)%7
 GLINE I*S,0,I*S,191,13
 IF Q!=0 AND Q!=3 THEN GFILL I*S-S/2+1,0,I*S+S/2-1,90,14
NEXT
RETURN
 QRコード(ファイル名:OCHAKB)


 鍵盤や上画面の表示は使用開始と設定後に再表示する必要があるためサブルーチン化しました。
 鍵盤数は設定で簡単に増減できるためデフォルトでは14個にしました。これはちょうど2オクターブC4B5であり、大抵の楽曲に対応できるので設定で減らすことはあっても増やすことはあまりないのではないかと思われます。(楽曲によっては鍵盤の位置を変えることで左端の白鍵をG3A3にした方がいいかもしれないけど)
 鍵盤数は上限20、下限は4としました。「4」という数字は鍵盤を見ただけで音階が分かる(つまり、弾かなくても分かる)最小数だからです。上限の20という数字はちょうど3オクターブでキリがよかったのとそれがプチコンのMMLで出せる最高の高さだからです。鍵盤の位置は-28+14としました。これもプチコンのMMLで再生できる音域の制限によるものです。(鍵盤数を4個の状態では+30も可能だけどほぼ使わないと思われる音域に余分な判定をしたくないためリストが短くなるように鍵盤数に関わらず+14を上限とした)

 設定そのものはBTRIG()関数で取得した値を論理式によって条件判断しているだけであり難しいことは何もないのですが、音色No.を上下させる部分だけは分かりづらいと思うので解説しておきます。

 N=(N+(B%4+1)%3+127+(B==256)*25)%128

 これは音色No.を示す変数Nの値を十字ボタンの上下で「+1」「-1」[L]ボタンで「+25」するものです。[L]ボタンの処理は簡単なのですぐわかると思いますが、問題は十字ボタンの方でしょう。
 (B%4+1)%3という式はB%4=0の時は1B%4=1の時は2B%4=2の時は0という値になります。簡単に言えば(B%4+1)%3は論理式で表すと ((B AND 1)==1)-(B AND 2)==2)+1 になるというわけです。この場合は同時ボタン入力を考慮する必要はないため (B==1)-(B==2)+1 としても同じ動作になります。
 それが分かれば上記の式は次のような論理式で書き換えられます。

 N=(N+(B==1)-(B==2)+128+(B==256)*25)%128

 これを見れば上下で「+1」「-1」になっているというのは一目瞭然でしょう。(Tipsコーナー十字ボタンを使った8方向移動参照)
 最後の%128でNが0〜127の値になるようにしています。(128の時は0、129の時は1になる)
 しかし、剰余(%)を求める場合には被除数が負の数の場合は結果も負の数となってしまうためNの値が負の数にならないように128を足しています。128を足すことでどのような場合でもNの値が0〜127の範囲に収まるようになります。



 これで終わってもいいのですが、このプログラムを1画面プログラム(29文字x24行以内)にしてみようと思います。

 ここで問題なのは長い行がたくさんあるということです。1画面に収めるためには1行を29文字に抑える必要があります。
 長いIF文は条件式をあらかじめ別の行で論理式によって記述したり、条件式を変えて2行に分割して判定する必要がります。しかし、今度は行数が増えてくるという問題があります。それはうまく処理を並べ替えて隙間がないように行を埋めるしかありません。
 上記のように無駄な部分は省いてリストはそれなりに短くしているプログラムではないためここから大幅なリスト短縮はできず逆に複数行に分割する必要性から長くなる部分の方が多くなるくらいです。そのため、このプログラムは上画面の表示を簡略化しても1行オーバーとなる25行に抑えるのが限界でした。

 そこで、全く別の方法で作り替える必要があります。(限界までに詰め込む1画面プログラムでは数文字短縮するために1から作り直すということはよくあること)
 では、どうするのかというとここで出てくるのが、プチコンのMMLのNコマンドによる音程指定です。これを使えばCDEFGABとオクターブによる一般的な指定ではなく半音単位で指定できるようになるため音を鳴らす処理部分は短くできます。

Nコマンドと通常のオクターブ指定によるものの対比
N36
O2 C
N48
O3 C
N60
O4 C
N62
O4 D
N64
O4 E
N65
O4 F
N67
O4 G
N69
O4 A
N71
O4 B
N72
O5 C
N84
O6 C
 ※Nコマンドでは0〜127の値を指定できる

 この対比表を見て分かるようにNコマンドでの値が1増減するごとに半音ずつ変わる(12増減すると1オクターブ変わる)というのが分かるでしょう。これはBEEP命令において「1オクターブで4096の増減」を1/12した値(約341という値)を元にして「半音いくつ分か」という形で指定することでオクターブや「#」などを含めた音階指定がストレートにできるのと同じようになっているためそちらに慣れている人ならば違和感なく簡単に扱えるものになっています。

 ただし、その分、「ミ」「ファ」の間と「シ」「ド」が半音でその他は全音となるということを別途記述する必要がでてきます。黒鍵処理はBEEP命令でMMLを作る場合には別途配列変数に入れるかMID$で処理すれば良かったけど今回は「より短くする」というのが求められているため単純にその手は使えません。

 そうやってできたのが、この「PETIT KEYBOARD mkII」です。(ただ、このプログラムも作ってから3ヶ月経ち今(2013年1月)となってはさらに数カ所短縮できる部分が見つかっている)

プログラムリスト QRコード(ファイル名:OCHAPKB2)

 リストは上記の「プチコンキーボード」とは全然別物ですが、処理内容はほぼ同じものになっています。BGMPLAYのNコマンドでは普通にオクターブ指定するより再生できる音域が広いため鍵盤数の上限を25、鍵盤の位置の下限を-35とすることができたため、むしろスペック的にはこちらの方が上回っています。(といっても、この超低音域や超高音域はまともに再生できないからあまり意味がない)

 肝心の黒鍵処理ですが、これはC=31%(Q+4)%3という式によって実現しています。変数Qには「ド」〜「シ」が「0」〜「6」の値で入っています。(Tipsコーナー鍵盤の黒鍵の配置参照)

Q=0
Q=1
Q=2
Q=3
Q=4
Q=5
Q=6
31%(Q+4)%3 の値
0
1
1
0
1
1
1

 この表を見ての通り、C=31%(Q+4)%3 という式で「ド」と「ファ」の白鍵の左上には黒鍵がないということが判定できています。黒鍵の縦幅は90ドットなのでCの値を90倍すればIF文を使用することなくGFILL命令で黒鍵の有無を描くことができるようになります。(「31」という数字はQの値が0〜6の場合に上記の表のような値を取る数を逆算して求めたもの)



 さて、いかがでしたでしょうか。鍵盤演奏プログラムは作るのが簡単とはいえ、工夫する余地はたくさんあるということが分かったと思います。今回は「指で快適に演奏できる」というものを作ってみましたが機能は実用最小限に抑えられているためこれにさらにさまざまな機能を付けてみるのも良いかもしれません。
 例えば録音、再生機能を付ける場合には1フレームごとに音の高さを示すZの値をすべて記録していけば簡単に実現できます。データ量が多くなるためGRPに記録するのがベターでしょう。GRPでは48KB記録できるため最大13分39秒録音できます。録音、再生にはキーボードの手前部分が開いているためそこにICONSET命令を使いシステムアイコンを置くと良いかもしれません。置いたアイコンがタッチされたかどうかはICONCHK()関数で得られた値を元に判断すれば良いです。あとは録音、再生のサブルーチンやセーブ、ロードのサブルーチンを別途用意するだけでいいため何も難しいことはありません。


RETURN

inserted by FC2 system