LilyPond と Ruby による自動作曲システム ver-0.2
ver-0.1 を手入れ。
コマンドラインからパラメータを指定できるようにした。
args のうち、version から relative までは LyliPond 用の変数。
マルコフ連鎖を扱う部分は markov.rb として切り離した。
コマンドラインからパラメータを指定できるようにした。
args のうち、version から relative までは LyliPond 用の変数。
マルコフ連鎖を扱う部分は markov.rb として切り離した。
require 'getoptlong'
require 'markov'
args = {
"version" => "2.14.2",
"key" => "c \\major",
"time" => "4/4",
"relative" => "c",
"order" => "2",
"length" => "5"
}
GetoptLong.new(
[ "--key", "-k", GetoptLong::OPTIONAL_ARGUMENT],
[ "--time", "-t", GetoptLong::OPTIONAL_ARGUMENT],
[ "--relative", "-r", GetoptLong::OPTIONAL_ARGUMENT],
[ "--order", "-o", GetoptLong::OPTIONAL_ARGUMENT],
[ "--length", "-l", GetoptLong::OPTIONAL_ARGUMENT]
).each do |key, val| args[key.sub(/--/,'')] = val end
print <<HEADER
\\version "#{args["version"]}"
\\score {
\\relative #{args["relative"]} {
\\key #{args["key"]}
\\time #{args["time"]}
HEADER
mc = MarkovChain.new(args["order"].to_i)
readlines.each do |line|
line.split.each do |sym|
mc.add(sym)
mc.reset if sym == "|"
end
end
mc.reset
1.upto(args["length"].to_i).each do
while(true)
sym = mc.get
if sym == "|"
print "\n"; break
else
print sym + " "
end
end
end
print <<FOOTER
}
\\layout { }
\\midi {} }
FOOTER