[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
Posted on Thursday September 2nd