(title later)

[Flash 9 is required to listen to audio.]

Air on the G String, hacked by mame.

Tone = {

  "a"  =>  0, "a+" =>  1, "b" =>  2, "c"  => -9, "c+" => -8, "d"  => -7,

  "d+" => -6, "e"  => -5, "f" => -4, "f+" => -3, "g"  => -2, "g+" => -1,

}



def mml_compile(mml)

  scores = ["", "", "", ""]

  mml.each_line do |line|

    next unless line =~ /^(\d+):/

    scores[$1.to_i - 1] << $'

  end

  seqs = scores.map { [] }

  scores.zip(seqs, [2, 2, 0, -1]) do |score, seq, octave|

    score.split.join.scan(/([a-gr<>,]\+?)([\d\-+]+)?/) do |tone, length|

      length = eval(length.gsub(/\d+/) { 32 / $&.to_i }) if length

      case tone

      when ","

      when ">"; octave += 1

      when "<"; octave -= 1

      when "r"; seq.concat([nil] * length)

      else seq.concat([octave * 12 + Tone[tone]] * length)

      end

    end

  end

  seqs

end



seqs1 = mml_compile(<c+4-32a2a16f+16c16e16d+16a16g16,

2:f+1                    ,f+8b16g16e16d16c+16d16c16c8a16c16r8r4    ,

3:d8>d8c+8b8a8g8g+8e2          ,e8d+4e8f+8r8r4                 ,

4:a2b2                   ,e4a8g8f+8e8d+8b8      ,



1:g2g16e16d16c+16g16f+16,                          ,

2:e16d16e16f+16g16e16f+4f+8g+16a16d8d32e32f+8e16e16d16,c+16c+32d16d8c+16    ,

3:e8b4e8e8r8r4                  ,d4d8e8f+8d8b8e8                   ,e8f+8b8e8c+2                        ,

4:e8d8c+8a8      ,d8>d8c+8b8g+8e8           ,a8d8e8c+16d16e16g16f+16e16,

END



seqs2 = mml_compile(<c+32a4a8c8,b8+16a16g16f+16g4+32f+32e32d32c+16c8+16e8d8d+8e2                    ,

4:a8g8f+8e8d+8f+8b4                      ,



1:a+16b16>c+8+16d16e8+16f+16g4f+8           ,e16d16c+16c+16d32e32d8c+8c+8               ,g8e8f+8b8a8       ,

3:e2+16d16c+16c+8               ,d4+16f+16e16d16b4+8a16g+16,f+32e32a16c16c+16d8+8c+16c+16d+16e8,

2:e4f+4e16f+16g+16a16b8  ,b8a8b8+16>c+32d32c+8+16d4+8f+16e16e4+8g16f+16                  ,

3:b8a16g+16a8g+8+16f+16e4,e8e8f+8e8e8+16d16c+16d16f+16c+16,f+8g8g+8a8g+8f+8e8d8c+8d8e8a8g8d4e4c+8                         ,



1:e8d+16c+16d+16e16f+8g2     ,c+16e16g16g16e16f+8+8+16g32a32,d4+16f+16a16>c16c+8c+16d16a+8b8e8>e8d8b16g16e16  ,c+8>c+8c+8d8c8<            ,b8a8g8f+8 ,



1:c+16e16g4d8e16f+32g32+16f+8e16,d32c+32c+16d8c+16d16d2,

2:e16e16g16b16a16g16f+16e8a4g8 ,a4g16f+16g8f+2>           ,

3:g8b8>e4+16d16c+16d8c+8d8g8             ,a8g8a8<< s

      f.flush

    end

  end

else

  # generate air.wav

  header = ["WAVEfmt ", 16, 1, 1, 44100, 44100, 1, 8].pack("A8VvvVVvv")

  data = ""

  play(44100, seqs) {|s| data << s }

  data = ["data", data.size].pack("A4V") << data

  open("air.wav", "wb") do |f|

    f << ["RIFF", header.size + data.size].pack("A4V") << header << data

  end

end


To Tumblr, Love PixelUnion