A Music Notepad: A handwriting music score input system

手書きで楽譜がかける、とても簡単なシステムを作成してみました。

The Music Notepad とは?

The Music Notepad は、Brown University で開発された、手書きで楽譜を書く事の出来るシステムです。

今回、大学でこれに似たシステムを作ってみるということをやってみました。結構面白いと個人的には思っているので、公開してみます。

お断りしておかなければならないこととして、私は音楽に関しては本当に素人であり、学校で習った程度の知識しかありません。日常的に楽器を弾いたり、歌を歌っている訳ではありません。楽譜の書き方も誤りがかなりあると思われます。そんなときは……笑って許して下さい。或いは、メールでお知らせ下さい。

出来ること・出来ない事

まず、出来ることと出来ないことを明らかにしておきます。私の実装では、出来る事はほんの一握りで、とても基本的なことしか出来ません。Java のキホンすら忘れていましたし、instanceof を初めて知ったとか、そういうとても駄目駄目な状態から、実質 50 時間程度で Java を覚えながらの実装です。今から考えると異常に時間がかかってますね。本当に基本的なことしか出来ません。

まず、出来ることは次の通りです。

  • 音符・休符の入力 (全音符から三十二分音符まで)
  • beam (音符をつなげること)
  • シャープ・ナチュラル・フラットを付ける、符点を付ける
  • 消去

出来てもよさそうですが、次のことは出来ません。(そんなに難しいことではないので、時間があれば出来る様になったでしょうが)

  • 小節線をひくこと
  • 連符
  • 一度 beam したあと、部分的に音の長さを変えること
  • 楽譜のフォーマット・保存
  • 音符の移動・コピー・ペースト

ジェスチャー一覧

以下にジェスチャーの一覧を示します。それぞれについて説明をします。

ジェスチャー一覧
1 - 6
音符の入力です。1 は全音符、2, 3 は四分音符、4, 5, 6 は八分音符、十六分音符、三十二分音符を入力します。五線譜の、線上に音符を入力したい場合は、2 の様に、一端横に入れてから上に上げて下さい。4, 5, 6 も同様に一端横に入れると線上に入力出来ます。横に入れないと、線の間にしか入力出来ません。但し、全音符だけは線の間でも線上でも、同一動作です。
7 - 11
休符の入力です。7, 8, 9, 10, 11 がそれぞれ全休符、四分休符、八分休符、十六分休符、三十二分休符に対応します。
12
全音符を入力したあと、全音符上から上に向かって線を引くと、二部音符が入力出来ます。
13, 14
13, 14 はそれぞれ音符の長さを二倍、半分にします。
15
音符どうしをビームします。このとき、音の長さは半分になります。途中に休符があったり、二分音符や全音符がある場合は、ビームできません。
16 - 19
16 は、クリック動作です。音符に符点を付けます。符点は、二個まで付けられます。17, 18, 19 は、それぞれシャープ、ナチュラル、フラットに対応します。臨時記号は、その音符のみ有効です。
20, 21
20 は一度ビームしたものの長さを、さらに半分にします。21 は、長さを二倍にします。アンビームには対応していません。
22
音符上でぐちゃぐちゃと塗りつぶすと、その音符を消す事が出来ます。

実際に動かして遊んでみる

動かして遊んでみたい人は、ダウンロードへ。applet にしようと思ったのですが、何故か上手く動かなかったもので。appletviewer でなら動いたのに。

尚、Play はおまけで、まともな演奏が出来るわけではありません。かなりヨタヨタした演奏になります。三十分程度でおまけ的につけたものなので、あんまり期待しないで下さい。Java の version は 1.4 以降がオススメです。古いと javax.sound.* が使えなくて落ちるので。また、Play 中は他の動作をしないで下さい。これは仕様です (?) (考慮してないという意味では仕様なのだろうが。)

また、なんか表示されないなー、というときは repaint ボタンを何回か押してみるのが大人の対応です。Java の初期化順を考慮してなかったので、しばしば最初が表示されません。つーか、知らなかったのな、初期化順序なんか。

ダウンロード

もうちょっとまともにして動かしたいという人には、ソースコード (Java) を提供します。テキトーに製作しているので、ライセンスは NYSL とします。3000 行に満たないくらいの小さなものですが、相当読みにくいと思います。万が一読むのなら、Score.java から読む事をオススメします。

2003-01-01