Использование midke-библиотеки haskell и parsec для музыки L-системы
Я пытаюсь генерировать музыку с помощью L-системы, используя haskell. Я использую что-то вроде следующего, чтобы сгенерировать мою песню.
musicgen mylist 4 = mylist
musicgen mylist generation = musicgen (multiReplace [("A","o-B+B"),("B","AoA")] mylist (generation + 1)
Символы для использования в песне или правиле:
.
это отдыхo
играет ноту:+
текущая нота поднимается на полутон-
текущая нота звучит вниз на полутон!
сбросить текущий шаг/
панорамирование вправо\
панорамирование влево|
центральная кастрюля
o + o будет играть две ноты одновременно, одна выше другой. oO будет играть две ноты одну за другой.
Я работаю над использованием parsec для анализа результатов L-системы, однако мне трудно найти работающий пример parsec (и я импортирую необходимые библиотеки).
Затем я решил, что начну с миди-звуковой библиотеки. Я не пользовалась Sound.MIDI
потому что у него нет примеров. Так что я использовал Codec.Midi
который имеет этот пример: http://www.increpare.com/2008/10/basic-haskell-midi-file-output/
Однако я не могу успешно изменить канал. Также не ясно, как я должен загружать файлы SoundFont с Codec.SoundFont
для того, чтобы использовать другие инструменты.
1 ответ
Вот простой пример Parsec, чтобы вы начали.
import Text.ParserCombinators.Parsec
data Stream = Chord [Stream] | Play | PitchUp | PitchDown | PitchReset | PanRight | PanLeft | CenterPan deriving Show
instructions :: Parser Stream
instructions = try chord <|> play <|> up <|> down <|> reset <|> right <|> left <|> center
chord = do string "("; x <- many instructions; string ")"; return (Chord x)
play = do string "o"; return Play
up = do string "+"; return PitchUp
down = do string "-"; return PitchDown
reset = do string "!"; return PitchReset
right = do string "/"; return PanRight
left = do string "\\"; return PanLeft
center = do string "|"; return CenterPan
p string = case (parse (many instructions) "" string) of
Left err -> error "Parse error"
Right x -> x
Функция p теперь будет анализировать список символов в список типа Stream. То есть:
Main> p "+-+(o+o-o+)"
[PitchUp,PitchDown,PitchUp,Chord [Play,PitchUp,Play,PitchDown,Play,PitchUp]]