[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