[linux-audio-dev] XAP: 12t keyboard + pitch bend example

New Message Reply About this list Date view Thread view Subject view Author view Other groups

Subject: [linux-audio-dev] XAP: 12t keyboard + pitch bend example
From: David Olofson (david_AT_olofson.net)
Date: Fri Dec 13 2002 - 21:28:59 EET


Someone suggested that it would be impossible to map the 12 tones
onto the white keys of a keyoard, and still get correct pitch bend
handling. Well, here's a solution:

The MIDI converter/driver:
        This will have to make pitch bend available as a
        separate control output from pitch. This does *not*
        mean we have to apply pitch bend later, though!
        Instead, we apply pitch bend to out PITCH output,
        *and* then send pitch bend to the PITCHBEND output.
        So, if you don't care for anything but continous
        pitch, just ignore this feature.

        As to pitch bend range, that is handled entirely
        by the converter/driver; the bend output is in the
        same units as the pitch output.

        With NOTEPITCH:
                NOTEPITCH is in 1.0/note
                PITCHBEND is in 1.0/note

                PITCHBEND = (midi_bend - 8192) * midi_range * (1.0/8192.0);
                NOTEPITCH = midi_pitch + PITCHBEND;

        Without NOTEPITCH:
                PITCH is in (1/12)/note
                PITCHBEND is in (1/12)/note

                PITCHBEND = (midi_bend - 8192) * midi_range * (1.0/8192.0);
                PITCH = midi_pitch + PITCHBEND;
                PITCHBEND *= 1.0/12.0;
                PITCH *= 1.0/12.0;

The keyboard remapper:
        This one will have inputs for both pitch and pitch
        bend controls, since it needs to be able to remove
        the bend and then reapply it later. remap_lut[] is
        simply a table that "returns" the desired pitch for
        each key in the scale. (Obviously, you'll have to
        add a conditional to ignore the black keys, if you
        don't want to map them to anything.)

        With NOTEPITCH:
                int note = (int)(NOTEPITCH - PITCHBEND);
                NOTEPITCH = remap_lut[note] + PITCHBEND;

        Without NOTEPITCH:
                int note = (int)((NOTEPITCH - PITCHBEND)*12.0);
                NOTEPITCH = remap_lut[note] + PITCHBEND;

//David Olofson - Programmer, Composer, Open Source Advocate

.- The Return of Audiality! --------------------------------.
| Free/Open Source Audio Engine for use in Games or Studio. |
| RT and off-line synth. Scripting. Sample accurate timing. |
`---------------------------> http://olofson.net/audiality -'
.- M A I A -------------------------------------------------.
| The Multimedia Application Integration Architecture |
`----------------------------> http://www.linuxdj.com/maia -'
   --- http://olofson.net --- http://www.reologica.se ---


New Message Reply About this list Date view Thread view Subject view Author view Other groups

This archive was generated by hypermail 2b28 : Fri Dec 13 2002 - 21:31:21 EET