challenge Tiny MML

文字列の入力をとり、音を鳴らすプログラムを作ってください。

入力はcがド、dがレ、eがミ、fがファ、gがソ、aがラ、bがシ、rが休符とします。この8文字以外の文字は入力に含まれていないと仮定して構いません。おのおのの音符・休符は八分音符・八分休符とします。

オクターブや音の長さの変更、同時発音などの機能は不要です。

サンプル入力(カエルの歌)

cdefedcrefgagfercrcrcrcrcdefedcr

Posted feedbacks - Java

javax.soud.midiパッケージを使用しています。初めてなので改善点などご指摘いただけましたら幸いです(音がちゃんと消えていないような)…… タイミングの制御をちゃんとやっていないのでたどたどしい演奏になります(苦笑)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import javax.sound.midi.MidiSystem;
import javax.sound.midi.Receiver;
import javax.sound.midi.ShortMessage;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiUnavailableException;

public class TinyMML {
    private final static int[] code = {69, 71, 60, 62, 64, 65, 67};
    private final static int TONE = 120;

    public static void play(String mml) throws InvalidMidiDataException,
                                               MidiUnavailableException, 
                                               InterruptedException {
        ShortMessage mes = new ShortMessage();
        Receiver rcvr = MidiSystem.getReceiver();
        for (int i = 0; i < mml.length(); i++) {
            char c = mml.charAt(i);
            if (c >= 'a' && c <= 'g') {
                int co = code[c - 'a'];
                mes.setMessage(ShortMessage.NOTE_ON, 0, co, TONE);
                rcvr.send(mes, -1);
                Thread.sleep(500);
                mes.setMessage(ShortMessage.NOTE_OFF, 0, co);
                rcvr.send(mes, -1);
            } else {
                Thread.sleep(500);
            }
        }
        rcvr.close();
    }

    public static void main(String[] args) throws Exception {
        play(args[0]);
        System.exit(0);
    }
}

Index

Feed

Other

Link

Pathtraq

loading...