2010-10-28 4 views
1

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

(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 играть в нем.

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

ответ

3

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

(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)))