Создание экземпляра миди: midifile - PullRequest
2 голосов
/ 28 октября 2010

Я использую Lisp MIDI библиотеку для небольшого проекта, над которым я работаю.Для начала я пытаюсь написать простой MIDI-файл, который воспроизводит средний C. Однако я не могу заставить это работать и не могу найти никакой документации о том, как это сделать.Вот мой код:

(defun make-track () 
  (list
   (make-instance 'midi:note-on-message
          :time 0
          :key 60 
          :velocity 100
          :status 0)
   (make-instance 'midi:note-off-message
          :time 128
          :key 60 :velocity 100
          :status 0)))

(defun make-tracks ()
  (list (make-track)))

(defun try-to-write-midi-file ()
  (let* ((my-midi-file (make-instance 'midi:midifile
                     :format 1
                     :tracks (make-tracks)
                     :division 25)))
    (midi:write-midi-file my-midi-file "opus.mid")))

Он создает файл MIDI, но длительностью 0 секунд, в котором, похоже, не играет средняя буква C.

Может кто-нибудь сказать мнечто я тут не так делаю?

1 Ответ

4 голосов
/ 28 октября 2010

Дэвид Льюис, один из хранителей библиотеки , объяснил мне, что я делаю неправильно. Вот правильный код:

(defun make-track () 
  (list
   ;; The STATUS values you give to your messages gives the sequencer channel 
   ;; information but, rather than taking the channel as you'd expect to see it
   ;; (i.e. an integer between 0-15), it takes it in the form the MIDI itself 
   ;; uses, which for NOTE-ON is (+ 144 channel) and for NOTE-OFF is 
   ;; (+ 128 channel).
   (make-instance 'midi:note-on-message
          :time 0
          :key 60 
          :velocity 100
          :status 144)
   (make-instance 'midi:note-off-message
          :time 128
          :key 60 :velocity 100
          :status 128)))
...