to top page
2013-02-16
LilyPond と Ruby による自動作曲システム ver-0.2
ver-0.1 を手入れ。
コマンドラインからパラメータを指定できるようにした。
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