[sdiy] FW: FW: Communications with voices in a polyphonic synth

Jerry Gray-Eskue jerryge at cableone.net
Fri Mar 12 15:56:34 CET 2010


Oh it's not that hard, and well defined with a small number of special
cases.

OSC is probably a good thing but I want to make my stuff work with keyboards
and such that can be purchased anywhere. I see a lot of MIDI equipment
available but have yet to see a readily available commercial keyboard that
supports OSC. OTOH I have not been looking for any so they may be out there
somewhere.

OSC, using text strings is going to be processor intensive, no big deal with
a desktop or high end DSP, but when using a small micro and very limited
ram/code space/processor speed it gets hard to get good performance and may
not fit in the code space.

What about that network layer? Is that running in the target system? The
code I posted includes the entire hardware to final protocol implementation,
no other support layers required. BTW this is running in a PIC processor
with the whole program using less than 2k of code space and 256 bytes of
ram.

Best Regards,

- Jerry

-----Original Message-----
From: cheater cheater [mailto:cheater00 at gmail.com]
Sent: Friday, March 12, 2010 8:26 AM
To: Jerry Gray-Eskue
Cc: Synth-diy at dropmix.xs4all.nl
Subject: Re: [sdiy] FW: FW: Communications with voices in a polyphonic
synth


So not so easy after all?

with OSC, you don't have to support anything, so you can just
implement 1 hook and ignore the rest, and nothing bad will happen,
because OSC########## works on packet data. The state machine for that
 is taken care of in the network layer.

D.

On Fri, Mar 12, 2010 at 14:44, Jerry Gray-Eskue <jerryge at cableone.net>
wrote:
>
>
> Achim correctly pointed out that the code I posted needs to handle Real
Time
> messages, here is the change:
>
> Thanks Achim
>
> ============ Original =============
> ...
>        if(MidiByte >= 0x80)
>        {
>
>                // STATUS Byte
>                MidiType = MidiByte;
>
>                if (MidiChannel != 0x0f) // Channel 16 for OMNI
>                {
>                        if((MidiByte & 0x0f) != MidiChannel)
>                        {
>                                MidiType = 0;
>                        }
>                }
>                DataByteCount = 0;
>
>        }
>        else
>        {
>                // Data Byte
>                switch(MidiType & 0xf0)
> ...
> ============================================
> =========== Minimum Change To ==============
> ...
>        if(MidiByte >= 0x80)
>        {
>                if(MidiByte >= 0xf8)
>                {
>                //System Real Time Messages
>                }
>                else
>                {
>                        // STATUS Byte
>                        MidiType = MidiByte;
>
>                        if (MidiChannel != 0x0f) // Channel 16 for OMNI
>                        {
>                                if((MidiByte & 0x0f) != MidiChannel)
>                                {
>                                        MidiType = 0;
>                                }
>                        }
>                        DataByteCount = 0;
>                }
>        }
>        else
>        {
>                // Data Byte
>                switch(MidiType & 0xf0)
> ...
>
============================================================================
> ========
> =========== Change To With Placeholders for System Real Time Messages
> ==============
> ...
>        if(MidiByte >= 0x80)
>        {
>                if(MidiByte >= 0xf8)
>                {
>                //System Real Time Messages
>                //============================
>                // System Common Messages 0xf1 - 0xf7
>                // are not supported - If needed Add single byte messages
here
>                // multi byte message cases in switch(MidiType & 0xf0)
below
>                // NOTE: 0xf7 is EOX - end of System Exclusive
>                // if supported look for it and finish the Sys Ex task here
>                        /* Placeholder
>                        switch(MidiByte)
>                        {
>                                case 0xf8:
>                                {
>                                        // Timing Clock
>                                        break;
>                                }
>                                case 0xf9:
>                                {
>                                        // Undefined
>                                        break;
>                                }
>                                case 0xfa:
>                                {
>                                        // Start
>                                        break;
>                                }
>                                case 0xfb:
>                                {
>                                        // Continue
>                                        break;
>                                }
>                                case 0xfc:
>                                {
>                                        // Stop
>                                        break;
>                                }
>                                case 0xfd:
>                                {
>                                        // Undefined
>                                        break;
>                                }
>                                case 0xfe:
>                                {
>                                        // Active Sensing
>                                        break;
>                                }
>                                case 0xff:
>                                {
>                                        // System Reset
>                                        break;
>                                }
>                        }
>                        */
>                }
>                else
>                {
>                        // STATUS Byte
>                        MidiType = MidiByte;
>
>                        if (MidiChannel != 0x0f) // Channel 16 for OMNI
>                        {
>                                if((MidiByte & 0x0f) != MidiChannel)
>                                {
>                                        MidiType = 0;
>                                }
>                        }
>                        DataByteCount = 0;
>                }
>        }
>        else
>        {
>                // Data Byte
>                switch(MidiType & 0xf0)
> ...
> ==========================
>
> -----Original Message-----
> From: ASSI [mailto:Stromeko at nexgo.de]
> Sent: Friday, March 12, 2010 12:04 AM
> To: Jerry Gray-Eskue
> Subject: Re: [sdiy] FW: Communications with voices in a polyphonic synth
>
>
> [off-list]
>
> Hi Jerry,
>
> even for this stripped down FSM you would need to handle RT messages
> seperately as side-channel data, as they can come between status and
> data bytes (and hence must not reset your DataByteCount).
>
>
> Regards,
> Achim.
> --
> +<[Q+ Matrix-12 WAVE#46+305 Neuron microQkb Andromeda XTk Blofeld]>+
>
> Factory and User Sound Singles for Waldorf Q+, Q and microQ:
> http://Synth.Stromeko.net/Downloads.html#WaldorfSounds
>
> _______________________________________________
> Synth-diy mailing list
> Synth-diy at dropmix.xs4all.nl
> http://dropmix.xs4all.nl/mailman/listinfo/synth-diy
>




More information about the Synth-diy mailing list