Comment detail

Tiny MML (Nested Flatten)
適当に。なぜかオルゴール音色。
そういえば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")

Index

Feed

Other

Link

Pathtraq

loading...