Использование 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]]
Другие вопросы по тегам