×

[PR]この広告は3ヶ月以上更新がないため表示されています。
ホームページを更新後24時間以内に表示されなくなります。

ピアノ(ソフトウェアMIDIキーボード)


*ここに掲載している「ピアノ(ソフトウェアMIDIキーボード)」のソースコードを、以下にアップロードしています。ご自由にお使いください。
Microsoft Small Basic Program Listing(Program Listing : FTN258)

前回の「音符を再生」の応用で、ピアノ鍵盤を描画し、それぞれ対応した鍵盤をクリックすると音が鳴るようなプログラムを作ってみます。
まずは、ピアノ鍵盤の絵を描いてみましょう。

GraphicsWindow.Title = "Piano"
GraphicsWindow.Width = 500
GraphicsWindow.Height = 300

sirohaba = 30
sirotakasa = 90
kurohaba = 26
kurotakasa = 50

For i = 1 to 14
  GraphicsWindow.PenColor = "black"
  GraphicsWindow.DrawRectangle(sirohaba * i, 50, sirohaba, sirotakasa)
EndFor
For i = 1 to 2
  GraphicsWindow.BrushColor = "black"
  GraphicsWindow.FillRectangle(16 + (sirohaba * i), 50, kurohaba, kurotakasa)
EndFor
For i = 4 to 6
  GraphicsWindow.BrushColor = "black"
  GraphicsWindow.FillRectangle(16 + (sirohaba * i), 50, kurohaba, kurotakasa)
EndFor
For i = 8 to 9
  GraphicsWindow.BrushColor = "black"
  GraphicsWindow.FillRectangle(16 + (sirohaba * i), 50, kurohaba, kurotakasa)
EndFor
For i = 11 to 13
  GraphicsWindow.BrushColor = "black"
  GraphicsWindow.FillRectangle(16 + (sirohaba * i), 50, kurohaba, kurotakasa)
EndFor

ピアノ1

Forto」を使ってみました。
最初に、以下で白鍵と黒鍵の幅と高さを決めています。

sirohaba = 30
sirotakasa = 90
kurohaba = 26
kurotakasa = 50

そして、以下で白鍵を書いています。

For i = 1 to 14
  GraphicsWindow.PenColor = "black"
  GraphicsWindow.DrawRectangle(sirohaba * i, 50, sirohaba, sirotakasa)
EndFor

i = 1の時は横幅30ピクセル、縦幅90ピクセルの鍵盤を座標(30、50)に書いて、
i = 2の時は横幅30ピクセル、縦幅90ピクセルの鍵盤を座標(60、50)に書いて、……
と、x座標だけを鍵盤幅だけ移動しつつ14個描きました。

それ以降は黒鍵を書いています。
黒鍵は飛び飛びなので、2個書いて(For i = 1 to 2)、1個飛ばして、3個書いて(For i = 4 to 6)……という風にしています。
また、x座標を「16 + (30 * i)」としました。白鍵の横幅半分だけズラすためです。(丁度半分の15だと、なんとなくズレてみえるので修正しました)
そして、黒鍵の幅は白鍵より少し短い26にしています。白鍵と同じ30だと、隣の黒鍵と繋がってしまうからです。
更に、長さも50と白鍵より短くしました。

次は、それぞれの鍵盤部分をクリックした時に音を鳴らす、というプログラムです。
これは黒鍵の方が説明しやすいので、先に黒鍵から書きます。
一番左の黒鍵は「#ド」です。
「#ド」の黒鍵は、上のプログラムから、座標(46, 50)から(72, 100)にかけて描かれていると計算できます。
つまり、「マウスのボタンがクリックされた時に、マウスのx座標の値が46〜72、かつ、y座標が50〜100だったら、#ドの音を鳴らす」というプログラムを書けば良いのです。

GraphicsWindow.FillRectangle = OnMouseDown

Sub OnMouseDown
  x = GraphicsWindow.MouseX
  y = GraphicsWindow.MouseY
  If 46 <= x And x <= 72  And 50 <= y And y <= 100 Then
      Sound.PlayMusic("o4 c+")
    EndIf
EndSub

数学とは異なり、「46≦x≦72」というような表記はできませんので(「≦」という記号も使えません)、Andを使って、「46 <= x And x <= 72」と書いています。

毎回x座標とy座標を手計算するのはめんどいので、黒鍵の位置で自動的に計算できないか、考えてみます。

左からi個目の黒鍵の位置……
左上のx座標 = 16 + (sirohaba * i)
左上のy座標 = 常に50
右下のx座標 = 16 + (sirohaba * i) + kurohaba
右下のy座標 = 常に100

こうですね。
変化するのはx座標だけです。
こういう時もFor to構文でx座標を決めることができます。

For i = 1 to 13
  kurohidari[i] = 16 + (sirohaba * i)
  kuromigi[i] = 16 + (sirohaba * i) + kurohaba
EndFor

これで、変数「kurohidari[1]」は「16 + (sirohaba * 1)」を計算した結果、
変数「kurohidari[2]」は「16 + (sirohaba * 3)」を計算した結果
……
変数「kurohidari[5]」は「16 + (sirohaba * 5)」を計算した結果
……となります。
変数もFor to構文で作ることが出来るということです。

GraphicsWindow.FillRectangle = OnMouseDown

For r = 1 to 13
kurohidari[r] = 16 + (sirohaba * r)
kuromigi[r] = 16 + (sirohaba * r) + kurohaba
EndFor

Sub OnMouseDown
  x = GraphicsWindow.MouseX
  y = GraphicsWindow.MouseY

  If kurohidari[1] <= x And x <= kuromigi[1] And 50 <= y And y <= 100 Then
      Sound.PlayMusic("o4 c+")
  EndIf
  If  kurohidari[2] <= x And x <= kuromigi[2] + kurohaba And 50 <= y And y <= 100 Then
      Sound.PlayMusic("o4 d+")
  EndIf
  If  kurohidari[4] <= x And x <= kuromigi[4] + kurohaba And 50 <= y And y <= 100 Then
      Sound.PlayMusic("o4 f+")
  EndIf
  If  kurohidari[5] <= x And x <= kuromigi[5] + kurohaba And 50 <= y And y <= 100 Then
      Sound.PlayMusic("o4 g+")
  EndIf
  If  kurohidari[6] <= x And x <= kuromigi[6] + kurohaba And 50 <= y And y <= 100 Then
      Sound.PlayMusic("o4 a+")
  EndIf
  If  kurohidari[8] <= x And x <= kuromigi[8] + kurohaba And 50 <= y And y <= 100 Then
      Sound.PlayMusic("o5 c+")
  EndIf
  If  kurohidari[9] <= x And x <= kuromigi[9] + kurohaba And 50 <= y And y <= 100 Then
      Sound.PlayMusic("o5 d+")
  EndIf
  If  kurohidari[11] <= x And x <= kuromigi[11] + kurohaba And 50 <= y And y <= 100 Then
      Sound.PlayMusic("o5 f+")
  EndIf
  If  kurohidari[12] <= x And x <= kuromigi[12] + kurohaba And 50 <= y And y <= 100 Then
      Sound.PlayMusic("o5 g+")
  EndIf
  If  kurohidari[13] <= x And x <= kuromigi[13] + kurohaba And 50 <= y And y <= 100 Then
      Sound.PlayMusic("o5 a+")
  EndIf
EndSub

これで黒鍵だけは鳴るようになります。

問題は白鍵です。
なにしろ、黒鍵があるので長方形にはなっていません。

ピアノ2

「黒鍵が被っている部分」と「黒鍵が被っていない部分」のふたつの長方形に分けて座標を指定することになるので、黒鍵よりもめんどくさい文章を書かなければならないでしょう。
……めんどくさかったら、「黒鍵が被っている部分」は無視するのも手ですが。w

左からi個目の白鍵(黒鍵が被っていない部分のみ)の位置……
左上のx座標 = sirohaba * i
左上のy座標 = 常に100
右下のx座標 = sirohaba * (i + 1) - 1
右下のy座標 = 常に140

「黒鍵が被っていない部分」は黒鍵と同じ考え方でOK。

For i = 1 to 13
sirohidari[i] = sirohaba * i
siromigi[i] = sirohaba * (i + 1) - 1
EndFor

  If sirohidari[1] <= x And x <= siromigi[2] <= y And y <= 140 Then
      Sound.PlayMusic("o4 c")
  EndIf

「黒鍵が被っている部分」は鍵盤により計算方法が異なります。
例えば一番左のドなら、
左上のx座標 = sirohidari[1]
左上のy座標 = 常に50
右下のx座標 = kurohidari[1]
右下のy座標 = 常に100
という感じ。

  If sirohidari[1] <= x And x <= kurohidari[1] And 50 <= y And y <= 100 Then
    Sound.PlayMusic("o4 c")
  EndIf

鍵盤の図を見ながら計算していくのが良いと思います。

ということで完成はしたのですが、長ったらしくなったので、コメント文で少しコメントを入れています。
プログラミングでは、頭に「'」と書いてある文章はプログラミング言語ではないとして無視してくれます。
メモに使えるというわけです。
だから、以下には解説が入れてありますが、そのままコピー&ペーストしても使えます。

GraphicsWindow.Title = "Piano"
GraphicsWindow.Width = 500
GraphicsWindow.Height = 300

sirohaba = 30
sirotakasa = 90
kurohaba = 26
kurotakasa = 50

'白鍵の描画
For i = 1 to 14
  GraphicsWindow.PenColor = "black"
  GraphicsWindow.DrawRectangle(sirohaba * i, 50, sirohaba, sirotakasa)
EndFor
'黒鍵の描画
For i = 1 to 2
  GraphicsWindow.BrushColor = "black"
  GraphicsWindow.FillRectangle(16 + (sirohaba * i), 50, kurohaba, kurotakasa)
EndFor
For i = 4 to 6
  GraphicsWindow.BrushColor = "black"
  GraphicsWindow.FillRectangle(16 + (sirohaba * i), 50, kurohaba, kurotakasa)
EndFor
For i = 8 to 9
  GraphicsWindow.BrushColor = "black"
  GraphicsWindow.FillRectangle(16 + (sirohaba * i), 50, kurohaba, kurotakasa)
EndFor
For i = 11 to 13
  GraphicsWindow.BrushColor = "black"
  GraphicsWindow.FillRectangle(16 + (sirohaba * i), 50, kurohaba, kurotakasa)
EndFor

GraphicsWindow.FillRectangle = OnMouseDown

For i = 1 to 14
  kurohidari[i] = 16 + (sirohaba * i)
  kuromigi[i] = 16 + (sirohaba * i) + kurohaba
  sirohidari[i] = sirohaba * i
  siromigi[i] = sirohaba * (i + 1) - 1
EndFor

Sub OnMouseDown
  x = GraphicsWindow.MouseX
  y = GraphicsWindow.MouseY

'黒鍵をクリックした時に音を鳴らす
  If kurohidari[1] <= x And x <= kuromigi[1] And 50 <= y And y <= 100 Then
      Sound.PlayMusic("o4 c+")
  EndIf
  If  kurohidari[2] <= x And x <= kuromigi[2] And 50 <= y And y <= 100 Then
      Sound.PlayMusic("o4 d+")
  EndIf
  If  kurohidari[4] <= x And x <= kuromigi[4] And 50 <= y And y <= 100 Then
      Sound.PlayMusic("o4 f+")
  EndIf
  If  kurohidari[5] <= x And x <= kuromigi[5] And 50 <= y And y <= 100 Then
      Sound.PlayMusic("o4 g+")
  EndIf
  If  kurohidari[6] <= x And x <= kuromigi[6] And 50 <= y And y <= 100 Then
      Sound.PlayMusic("o4 a+")
  EndIf
  If  kurohidari[8] <= x And x <= kuromigi[8] And 50 <= y And y <= 100 Then
      Sound.PlayMusic("o5 c+")
  EndIf
  If  kurohidari[9] <= x And x <= kuromigi[9] And 50 <= y And y <= 100 Then
      Sound.PlayMusic("o5 d+")
  EndIf
  If  kurohidari[11] <= x And x <= kuromigi[11] And 50 <= y And y <= 100 Then
      Sound.PlayMusic("o5 f+")
  EndIf
  If  kurohidari[12] <= x And x <= kuromigi[12] And 50 <= y And y <= 100 Then
      Sound.PlayMusic("o5 g+")
  EndIf
  If  kurohidari[13] <= x And x <= kuromigi[13] And 50 <= y And y <= 100 Then
      Sound.PlayMusic("o5 a+")
  EndIf

'白鍵(被りなし部分)をクリックした時に音を鳴らす
  If sirohidari[1] <= x And x <= siromigi[1] And 100 <= y And y <= 140 Then
      Sound.PlayMusic("o4 c")
  EndIf
  If sirohidari[2] <= x And x <= siromigi[2] And 100 <= y And y <= 140 Then
      Sound.PlayMusic("o4 d")
  EndIf
  If sirohidari[3] <= x And x <= siromigi[3] And 100 <= y And y <= 140 Then
      Sound.PlayMusic("o4 e")
  EndIf
  If sirohidari[4] <= x And x <= siromigi[4] And 100 <= y And y <= 140 Then
      Sound.PlayMusic("o4 f")
  EndIf
  If sirohidari[5] <= x And x <= siromigi[5] And 100 <= y And y <= 140 Then
      Sound.PlayMusic("o4 g")
  EndIf
  If sirohidari[6] <= x And x <= siromigi[6] And 100 <= y And y <= 140 Then
      Sound.PlayMusic("o4 a")
  EndIf
  If sirohidari[7] <= x And x <= siromigi[7] And 100 <= y And y <= 140 Then
      Sound.PlayMusic("o4 b")
  EndIf
  If sirohidari[8] <= x And x <= siromigi[8] And 100 <= y And y <= 140 Then
      Sound.PlayMusic("o5 c")
  EndIf
  If sirohidari[9] <= x And x <= siromigi[9] And 100 <= y And y <= 140 Then
      Sound.PlayMusic("o5 d")
  EndIf
  If sirohidari[10] <= x And x <= siromigi[10] And 100 <= y And y <= 140 Then
      Sound.PlayMusic("o5 e")
  EndIf
  If sirohidari[11] <= x And x <= siromigi[11] And 100 <= y And y <= 140 Then
      Sound.PlayMusic("o5 f")
  EndIf
  If sirohidari[12] <= x And x <= siromigi[12] And 100 <= y And y <= 140 Then
      Sound.PlayMusic("o5 g")
  EndIf
  If sirohidari[13] <= x And x <= siromigi[13] And 100 <= y And y <= 140 Then
      Sound.PlayMusic("o5 a")
  EndIf
  If sirohidari[14] <= x And x <= siromigi[14] And 100 <= y And y <= 140 Then
      Sound.PlayMusic("o5 b")
  EndIf

'白鍵(黒鍵との被りあり部分)をクリックした時に音を鳴らす
  If sirohidari[1] <= x And x <= kurohidari[1] And 50 <= y And y <= 100 Then
    Sound.PlayMusic("o4 c")
  EndIf
  If kuromigi[1] <= x And x <= kurohidari[2] And 50 <= y And y <= 100 Then
    Sound.PlayMusic("o4 d")
  EndIf
  If kuromigi[2] <= x And x <= siromigi[3] And 50 <= y And y <= 100 Then
    Sound.PlayMusic("o4 e")
  EndIf
  If sirohidari[4] <= x And x <= kurohidari[4] And 50 <= y And y <= 100 Then
    Sound.PlayMusic("o4 f")
  EndIf
  If kuromigi[4] <= x And x <= kurohidari[5] And 50 <= y And y <= 100 Then
    Sound.PlayMusic("o4 g")
  EndIf
  If kuromigi[5] <= x And x <= kurohidari[6] And 50 <= y And y <= 100 Then
    Sound.PlayMusic("o4 a")
  EndIf
  If kuromigi[6] <= x And x <= siromigi[7] And 50 <= y And y <= 100 Then
    Sound.PlayMusic("o4 b")
  EndIf
  If sirohidari[8] <= x And x <= kurohidari[8] And 50 <= y And y <= 100 Then
    Sound.PlayMusic("o5 c")
  EndIf
  If kuromigi[8] <= x And x <= kurohidari[9] And 50 <= y And y <= 100 Then
    Sound.PlayMusic("o5 d")
  EndIf
  If kurohidari[9] <= x And x <= siromigi[10] And 50 <= y And y <= 100 Then
    Sound.PlayMusic("o5 e")
  EndIf
  If sirohidari[11] <= x And x <= kurohidari[11] And 50 <= y And y <= 100 Then
    Sound.PlayMusic("o5 f")
  EndIf
  If kuromigi[11] <= x And x <= kurohidari[12] And 50 <= y And y <= 100 Then
    Sound.PlayMusic("o5 g")
  EndIf
  If kuromigi[12] <= x And x <= kurohidari[13] And 50 <= y And y <= 100 Then
    Sound.PlayMusic("o5 a")
  EndIf
  If kuromigi[13] <= x And x <= siromigi[14] And 50 <= y And y <= 100 Then
    Sound.PlayMusic("o5 b")
  EndIf
EndSub

上に一手間加えれば、例えば「ドの鍵盤を押した時に『ド』と表示する」なども可能でしょう。



▲TOPへ戻る