和音を表現する

MIDIプロトコルはシリアル転送方式であり、複数のメッセージを同時に送ることはできません。そのため和音を完全に表現する方法はなく、複数のメッセージを逐次、瞬間的に送信する以外にありません。また、音源においてもコンピュータである以上は、受け取ったメッセージを順に処理するしかありません。しかし、違和感を感じるほどの問題が発生することはないでしょう。

サンプル02は、for文による繰り返しで連続にノートナンバー60、64、67を表すノートオンを送信しています。当然、メッセージは逐次的に送信されますが、極めて短い間隔なので和音として認識することができます。実行するとC、E、Gの音が重なって聞こえるでしょう。

サンプル02(ノートナンバー60、64、67に対応するC、E、Gの音を再生)

import java.io.*;
import javax.sound.midi.*;

class Test {
    public static void main(String[] args) throws Exception {
        int[] notenums = { 60, 64, 67 };

        Receiver receiver = MidiSystem.getReceiver();
        ShortMessage message = new ShortMessage();

        for(int num : notenums) {
            message.setMessage(ShortMessage.NOTE_ON, num, 127);
            receiver.send(message, -1);
        }

        System.out.println("Enter キーを押してプログラムを終了します>");
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        reader.readLine();
    }
}

もちろん、同時発音数には物理的な限界があります。音源によって同時発音数は異なりますが、標準に準拠している場合は 24 音以上の同時発音能力を持ちます。DTM ユーザーの間で多く使われているローランドのハードウェア音源SC-88であれば64音、SC-8850、SD-80、SD-90では128音まで同時発音できます。