denemo-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Denemo-devel] Scheme question


From: Andreas Schneider
Subject: Re: [Denemo-devel] Scheme question
Date: Sun, 09 Nov 2014 21:00:07 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Icedove/31.2.0

Thank you for your help. A similar code works. My input filter is now as
follows:

;;; Master keyboard filter
(let ((midi "")
      (command 0)
      (bank 0)
      (note 0)
      (velocity 0)
      (midivalue 0)
      (keyboardactive 1)
      (isstop 0)
      (loop 0))
     (d-InputFilterNames (_ "Master Keyboard MIDI Filter"))
     (d-SetMidiCapture #t)
     (set! loop  (lambda ()
        (begin
                (set! midi (d-GetMidi #f))
                (set! command (bit-extract (list-ref midi 0) 4 8))
                (set! bank (bit-extract(list-ref midi 0)  0 4))
                (set! note (list-ref midi 1))
                (set! velocity (list-ref midi 2))
                (disp "command " command ", bank " bank ", note " note ", 
velocity "
velocity)
                (set! midivalue (+ (ash velocity 16) (ash note 8) (ash command 
4)))
                (disp "midi value " midivalue)
                (if (and (= command #x9)(= bank 0)) ; NoteOn message on bank 0
                (begin
                        (if keyboardactive (d-PutMidi midivalue))
                ))
                (if (and (= command #x9)(= bank 1)) ; NoteOn message on bank 1 
->
trigger pads
                (begin
                        (disp "trigger pad " note)
                        (case note
                                ((36)(d-Set0))
                                ((37)(d-Set1))
                                ((38)(d-Set2))
                                ((39)(d-Set3))
                                ((43)(d-Set4))
                                ((40)(d-SetBreve))
                        )
                ))
                (if (= command #x0B) ; ControlChange message
                (begin
                        (case note
                                ((119)(set! keyboardactive (not 
keyboardactive))) ; record button
                                ((118)(d-DenemoPlayCursorToEnd)) ; play button
                                ((117)(d-Stop)) ; stop button
                                ((115)(d-MoveToMeasureLeft)) ; rewind button
                                ((116)(d-MoveToMeasureRight)) ; forward button
                                ((114)(set! isstop 1)) ; loop button
                                (else (if keyboardactive (d-PutMidi midivalue)))
                        )
                ))
                (if (or (= command 0) (= isstop 1))
                        (display "Filter stopping")
                        (loop)))))
     (loop))
(d-SetMidiCapture #f)


Andreas


Am 09.11.2014 um 19:04 schrieb Richard Shann:
> On Sun, 2014-11-09 at 18:07 +0100, Andreas Schneider wrote:
>> How can I convert the byte list from (d-GetMidi #f) to something that I
>> can issue to d-PutMidi? I was not able to come up with something usable.
> 
> (let* ((midi (d-GetMidi #f))
>       (value #f)
>       (command (list-ref midi 0))
>               (note (list-ref midi 1))
>                       (velocity (list-ref midi 2)))
>       (set! value (+ (ash velocity 16) (ash note 8) command))
>       (d-PutMidi value))
> 
> I think the values required in d-PutMidi are in the opposite to expected
> order (packed inside the integer).
> It would be good to have a wrapper that takes the three numbers and
> executes d-PutMidi after doing the (set! value (+ (ash velocity 16) (ash
> note 8) command)) step, thus hiding the poor design of d-PutMidi (if I'm
> right about the order of the bytes).
> 
> Richard




reply via email to

[Prev in Thread] Current Thread [Next in Thread]