音を出してみよう♪

for Squeak 4.4 on Mac OS X (macOS 10.13 High Sierra or earlier) / Windows (Windows 7 or later)
for Squeak 5.2 on Mac OS X (macOS 10.14 Mojave or later) / Windows (Windows 7 or later)

MIDI(ミディ)

Squeak(Smalltalk)では、MIDI(Musical Instrument Digital Interface:電子楽器デジタルインタフェース)を扱うことができます。システムブラウザを開いて、一番左のペインから「KSU-Example」のカテゴリを選びましょう。二番目のペインに「KSUMidi」というクラスが出てきますので、それを選びます。そして、二番目のペインに下部にある「class」のボタンを押してください。三番目のペインに「examples」というカテゴリが現れますので選択しましょう。

Browser.png

MIDIを一つ作る

次のプログラムは、MIDIのインスタンスを一つ作り、aMidiとすることを表しています。

    | aMidi |
    aMidi := KSUMidi new.
    ^ aMidi

音階を奏でる

では、音符を並べて楽譜にするように、音を出すメッセージを並べて音楽にしてみましょう。プログラムで楽譜を書く感じになりますかね…。

    | aMidi |
    aMidi := KSUMidi new.
    aMidi note: 'C4' length: 1000.
    aMidi note: 'D4' length: 1000.
    aMidi note: 'E4' length: 1000.
    aMidi note: 'F4' length: 1000.
    aMidi note: 'G4' length: 1000.
    aMidi note: 'A4' length: 1000.
    aMidi note: 'B4' length: 1000.
    aMidi note: 'C5' length: 1000.
    ^ aMidi

上記のプログラムは「ド・レ・ミ・ファ・ソ・ラ・シ・ド」と音階を奏でます。下記の図を参照すれば、音階の指定の仕方が明かでしょ。

CDEFGABC

音を出す仕組み

では、'C4'、すなわち「ド」の音を出す仕組みを詳しく見てみましょう。以下のプログラムをご覧ください。(1)「ド」の音を出して、(2)1,000ミリ秒、すなわち1秒待って、(3)「ド」の音を止める、というプログラムになっているのです。

    | aMidi |
    aMidi := KSUMidi new.
    [aMidi play: 'C4'.
    aMidi wait: 1000.
    aMidi stop: 'c4'] value.
    ^ aMidi

和音を奏でる

今度は、単音ではなく、和音を奏でてみましょう。長三和音「ド・ミ・ソ」の構成音を一つずつ出した後に、三秒間、和音を奏でます。

    | aMidi |
    aMidi := KSUMidi new.
    [aMidi play: 'C4'.
    aMidi wait: 1000.
    aMidi stop: 'C4'] value.
    [aMidi play: 'E4'.
    aMidi wait: 1000.
    aMidi stop: 'E4'] value.
    [aMidi play: 'G4'.
    aMidi wait: 1000.
    aMidi stop: 'G4'] value.
    [aMidi plays: #('C4' 'E4' 'G4' ).
    aMidi wait: 3000.
    aMidi stops: #('C4' 'E4' 'G4' )] value.
    ^ aMidi

これはもっと簡単に書くことができます。

    | aMidi |
    aMidi := KSUMidi new.
    [aMidi note: 'C4' length: 1000] value.
    [aMidi note: 'E4' length: 1000] value.
    [aMidi note: 'G4' length: 1000] value.
    [aMidi notes: #('C4' 'E4' 'G4' ) length: 3000] value.
    ^ aMidi

お辞儀

次のプログラムを実行してみましょう。ピアノでお辞儀の時に弾く和音列になります。だんだん和音の数を増やして重厚に…

    | aMidi |
    aMidi := KSUMidi new.
    [aMidi notes: #('E4' 'G4' 'C5' ) length: 2000] value.
    [aMidi notes: #('D4' 'F4' 'B4' ) length: 2000] value.
    [aMidi notes: #('E4' 'G4' 'C5' ) length: 2000] value.
    ^ aMidi
    | aMidi |
    aMidi := KSUMidi new.
    [aMidi notes: #('C3' 'G3' 'E4' 'G4' 'C5' ) length: 2000] value.
    [aMidi notes: #('G3' 'D4' 'F4' 'G4' 'B4' ) length: 2000] value.
    [aMidi notes: #('C3' 'G3' 'E4' 'G4' 'C5' ) length: 2000] value.
    ^ aMidi
    | aMidi |
    aMidi := KSUMidi new.
    [aMidi notes: #('C3' 'G3' 'C4' 'E4' 'G4' 'C5' ) length: 2000] value.
    [aMidi notes: #('G2' 'G3' 'D4' 'F4' 'G4' 'B4' ) length: 2000] value.
    [aMidi notes: #('C3' 'G3' 'C4' 'E4' 'G4' 'C5' ) length: 2000] value.
    ^ aMidi

かえるのうた

以下に「かえるのうた」の楽譜を示しておきます。さぁ!「かえるのうた」を斉唱するプログラム、そして、輪唱するプログラムまで仕立て上げてください。

KaerunoUtaScore

おきばりやしとくれやす!

MIDIファイルの再生

ちなみにですが、モーツァルトさんの「トルコ行進曲」がMIDIファイルになっています。それを再生するには、次のプログラムを実行します。詳細はメソッドの中身を調べてください。

KSUMidi playMozartTurkeyMarch.
000000000000: #[16rFF 16r03 16r24 16r4D 16r6F 16r7A 16r61 16r72 16r74 16r54
                16r75 16r72 16r6B 16r65 16r79 16r4D 16r61 16r72 16r63 16r68
                16r2E 16r6D 16r69 16r64 16r2D 16r50 16r72 16r6F 16r64 16r75
                16r63 16r65 16r64 16r42 16r79 16r52 16r32 16r44 16r32] ; @ tr.1
000000000000: #[16rFF 16r51 16r03 16r07 16rA1 16r20] ; set tempo 500,000 (120 bpm) @ tr.1
000000000000: #[16rFF 16r58 16r04 16r02 16r02 16r18 16r08] ; time signature 2/4 @ tr.1
000000000000: #[16rB0 16r40 16r00] ; control change Damper Pedal on/off (Sustain) @ ch.1 tr.1
000000000000: #[16rB0 16r07 16r3C] ; control change Channel Volume (formerly Main Volume) MSB @ ch.1 tr.1
000000000000: #[16rFF 16r51 16r03 16r1E 16r84 16r80] ; set tempo 2,000,000 (30 bpm) @ tr.1
000000000000: #[16rB0 16r5B 16r7F] ; control change Effects 1 Depth @ ch.1 tr.1
000000000000: #[16rB0 16r0A 16r40] ; control change Pan MSB @ ch.1 tr.1
000000000000: #[16rB0 16r0B 16r64] ; control change Expression Controller MSB @ ch.1 tr.1
000000000000: #[16rB0 16r00 16r00] ; control change Bank Select MSB @ ch.1 tr.1
000000000000: #[16rB0 16r20 16r00] ; control change Bank Select LSB @ ch.1 tr.1
000000000000: #[16rC0 16r00] ; program change Acoustic Piano @ ch.1 tr.1
000000000000: #[16rB1 16r40 16r00] ; control change Damper Pedal on/off (Sustain) @ ch.2 tr.1
000000000000: #[16rB1 16r07 16r3C] ; control change Channel Volume (formerly Main Volume) MSB @ ch.2 tr.1
000000000000: #[16rB1 16r5B 16r7F] ; control change Effects 1 Depth @ ch.2 tr.1
000000000000: #[16rB1 16r0A 16r40] ; control change Pan MSB @ ch.2 tr.1
000000000000: #[16rB1 16r0B 16r64] ; control change Expression Controller MSB @ ch.2 tr.1
000000000000: #[16rB1 16r00 16r00] ; control change Bank Select MSB @ ch.2 tr.1
000000000000: #[16rB1 16r20 16r00] ; control change Bank Select LSB @ ch.2 tr.1
000000000000: #[16rC1 16r00] ; program change Acoustic Piano @ ch.2 tr.1
000000000480: #[16rFF 16r51 16r03 16r06 16rC8 16r1C] ; set tempo 444,444 (135 bpm) @ tr.1
000000000480: #[16r90 16r47 16r64] ; note on B4 @ ch.1 tr.1
000000000600: #[16r90 16r47 16r00] ; note off B4 @ ch.1 tr.1
000000000600: #[16r90 16r45 16r64] ; note on A4 @ ch.1 tr.1
000000000720: #[16r90 16r45 16r00] ; note off A4 @ ch.1 tr.1
000000000720: #[16r90 16r44 16r64] ; note on G#4 @ ch.1 tr.1
000000000840: #[16r90 16r44 16r00] ; note off G#4 @ ch.1 tr.1
000000000840: #[16r90 16r45 16r64] ; note on A4 @ ch.1 tr.1
000000000960: #[16r90 16r45 16r00] ; note off A4 @ ch.1 tr.1
000000000960: #[16r90 16r48 16r64] ; note on C5 @ ch.1 tr.1
000000000960: #[16r91 16r39 16r64] ; note on A3 @ ch.2 tr.1
000000001128: #[16r90 16r48 16r00] ; note off C5 @ ch.1 tr.1
000000001200: #[16r91 16r39 16r00] ; note off A3 @ ch.2 tr.1
000000001200: #[16r91 16r3C 16r64] ; note on C4 @ ch.2 tr.1
000000001200: #[16r91 16r40 16r64] ; note on E4 @ ch.2 tr.1
000000001368: #[16r91 16r3C 16r00] ; note off C4 @ ch.2 tr.1
000000001368: #[16r91 16r40 16r00] ; note off E4 @ ch.2 tr.1
000000001440: #[16r90 16r4A 16r64] ; note on D5 @ ch.1 tr.1
000000001440: #[16r91 16r3C 16r64] ; note on C4 @ ch.2 tr.1
000000001440: #[16r91 16r40 16r64] ; note on E4 @ ch.2 tr.1
000000001560: #[16r90 16r4A 16r00] ; note off D5 @ ch.1 tr.1
000000001560: #[16r91 16r3C 16r00] ; note off C4 @ ch.2 tr.1
000000001560: #[16r91 16r40 16r00] ; note off E4 @ ch.2 tr.1
000000001560: #[16r90 16r48 16r64] ; note on C5 @ ch.1 tr.1
000000001680: #[16r90 16r48 16r00] ; note off C5 @ ch.1 tr.1
…

Updated: 2019/02/06 (Created: 2008/11/15) KSU AokiHanko