Tiny MML
Posted feedbacks - Scala
適当に。なぜかオルゴール音色。 そういえば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 37 38 39 40 41 42 43 44 45 46 47 48 | import javax.sound.midi.spi._
import javax.sound.midi._
def play_mmf(mmf:String):unit = {
val noteMap = Map('c' -> 60, 'd' -> 62, 'e' -> 64, 'f' -> 65,
'g' -> 67, 'a' -> 69, 'b' -> 71)
val crotchet = 24
val channel = 0
val inst = 11
val velocity= 127
var current = 0
val sequence = new Sequence(Sequence.PPQ, crotchet)
val track = sequence.createTrack
var m = new ShortMessage
m.setMessage(ShortMessage.PROGRAM_CHANGE,channel, inst, 0)
track.add(new MidiEvent(m,0))
def addEvent(t:int, pitch:int, pos:int):unit = {
var m = new ShortMessage
m.setMessage(t, channel, pitch, velocity)
track.add(new MidiEvent(m, pos))
}
def interval = current = current + crotchet/2
def addNote(pitch:int):unit = {
addEvent(ShortMessage.NOTE_ON, pitch, current)
interval
addEvent(ShortMessage.NOTE_OFF, pitch, current)
}
mmf.foreach(n => n match{
case 'r' => interval
case x => addNote(noteMap(x))
})
val sequencer = MidiSystem.getSequencer
sequencer.addMetaEventListener(new MetaEventListener(){
def meta(meta:MetaMessage):unit = meta.getType match {
case 47 => sequencer.close()
System.exit(0);
case _ => ()
}
});
sequencer.open
sequencer.setSequence(sequence)
sequencer.start
}
play_mmf("cdefedcrefgagfercrcrcrcrcdefedcr")
|



にしお
#3387()
Rating0/0=0.00
入力はcがド、dがレ、eがミ、fがファ、gがソ、aがラ、bがシ、rが休符とします。この8文字以外の文字は入力に含まれていないと仮定して構いません。おのおのの音符・休符は八分音符・八分休符とします。
オクターブや音の長さの変更、同時発音などの機能は不要です。
サンプル入力(カエルの歌)
[ reply ]