Looper's Delight Archive Top (Search)
Date Index
Thread Index
Author Index
Looper's Delight Home
Mailing List Info

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

Re: (LONG) MIDI control (for loopers and other devices)



Far out, nice conceptual outline.  I've been thinking of making a foray 
into
programming and the most interesting (and accessible for me) possiblity
would be midi control programming.  I'd like to write a simple usable midi
loop sequencer.  We'll see.  I appreciate the thoughts though.

Mike

----- Original Message -----
From: "Tom Ritchford" <tom@swirly.com>
To: <Loopers-Delight@loopers-delight.com>
Cc: "Damon Langlois ( Electrix )" <Damon@Electrixpro.com>
Sent: Friday, August 25, 2000 5:35 PM
Subject: (LONG) MIDI control (for loopers and other devices)


> [sorry... this is very long but I hope quite clear.
>   as you can see, I've been thinking about this for a long while... /t]
>
>
>
> GOALS IN WRITING MIDI CONTROL PROGRAMS
>
> zeroth priority:
>   ACHIEVABLE.  must be able to make it work without too much work.
>
> first priority:
>   COMPLETE.    as much functionality as possible needs to be
> accessible from MIDI.
>
> second priority
>   CLEAR.       it should be "obvious" (to a reasonably technical person)
how to
>                access these functions from MIDI.  More common
> functions need to be
>                "more obvious".
>
> third priority
>   EFFICIENT.   it needs to make reasonably efficient usage of the memory,
>                computational, audio and display facilities of the 
>machine.
>
>
> DEFINING OUR TERMS
>
>
> A "MIDI command" or just a command is some bit of MIDI generated by the
user
> that's supposed to control the machine (ie, program changes, control
changes,
> pitch bends, NRPNs, system exclusives, etc...)
>
>
> Conceptually, you can think of the machine's controls as having
> a "state".  (For the looper's MIDI control, the audio in the machine
> isn't really part of the state.)
>
> You can talk about the state of the whole machine.
> You can talk about the state of a part of the machine, like the state
> of one channel.
> Or, you can talk about the state of a single control.
>
>
> Finally, "internal settings" or "settings" come in two flavours.
>
> Switches have two or more discrete settings, like "on"/"off"
> or "audio/tap/internal".
>
> Dials have "continuous" settings, even though the granularity
> of this might be quite small (or quite large...)  For example,
> dials would be "loop time (0.000-128.000 seconds)"
> or "feedback level (1-8)".
>
>
> So, we put together settings (switches or dials) into parts, and
> then assemble the parts into the whole state of the machine.
>
>
> WHAT IS THE PROBLEM AT HAND?
>
> We want to see how to map "MIDI commands" into changes to "internal
settings".
>
>
>
>
> SAMPLE MEMORY IS EXPENSIVE, USER TIME IS EXPENSIVE,
> CONTROL MEMORY IS CHEAP, CONTROL PROCESSING IS CHEAP
>
> Suppose a user command is represented by a (wildly generous) 100
> bytes on average,
> and the user has programmed 1000 commands, surely quite a few.
>
> The total memory consumed here is a measly 100K, or about one second
> of stereo sampling.
>
>
> Users (ie "musicians") are really unable to generate too many different
sorts
> of streams of information while actually using equipment.  You can't
generate
> hex code on the fly!
>
>
> Modern processors perform hundreds of millions of operations a second.
> Processing audio takes many hundreds of thousands of operations a second.
> One user has trouble generating a thousand control operations.
>
> This means techniques like "table lookups" or "linear interpolation"
> are essentially "free" (a table lookup on a modern microprocessor might
> take 100 nanoseconds!) and can be used if at all helpful.
>
>
>
> ON WITH IT!
>
> Without further ado, I'll present a nice, simple and general model for 
>the
MIDI
> control of a machine.
>
>
> A LIBRARY OF STATES
>
> You need to be able to recall the state of the entire machine by some
> sort of name.
> It's fine if these names are "1", "2", "3", etc. but text would be nice
too.
>
>
> BANKS OF COMMANDS
>
> Commands need to be organized by banks.  (see control processing is
> cheap above..)
> There need to be a lot of banks possible.
>
> Informally, one bank == one song.
>
>
>
> A "bank" of commands describes exactly how "commands" are mapped into
> "changes to the settings".
>
> A bank might conceptually say something like
>
>    Program Change 1:  recall state 1
>    Program Change 2:  set record on loop 1 to on
>    Program Change 3:  set record on loop 1 to off
>    Program Change 4:  -
>    Program Change 5:  -
>      ...
>    CC1: loop 1 output (0-100)
>    CC2: -
>    CC3: -
>
>    PITCH: -
>
> where of course we just don't store the empty areas in a bank.
>
>
> WHY BANKS?
>
> It corresponds to the needs of your average player, where you have
> a limited selection of controls that you need to behave differently
> for different songs.
>
>
> ANY CHANGE CAN BE MADE FROM ANY COMMAND
>
> Remember, your average guy has a few fairly limited control
> sources so if he can only generate, say, program changes, then
> he should be able to set all levels this way.
>
> Banks should be able to handle any MIDI data if at all possible:
> PC, CC, note-on/off, aftertouch, you name it.  Seems ridiculous
> but you have to parse the MIDI stream anyway, it's very little
> work to cover ALL the cases at the end.
>
>
> WHAT SORT OF CHANGES ARE ALLOWED?
>
> any list of the following changes:
>
>    set                 state            to (value)
>    set                 bank             to (value)
>    set                 dial/switch      to (value)
>    increment/decrement dial             by (value)
>    toggle              switch           up/down        // loops
> through all possible values
>    set                 dial             to (start:end) // maps a
> controller linearly
>
>
>
> SUMMARY
>
> A simple model of any MIDI machine is presented
> where a user sends MIDI commands
> to change the state of discrete switches and continuous dials.
>
> At any time, the machine has a "state" of all its switches and dials.
> The user can store and recall multiple states in memory.
>
> The MIDI behaviour is controlled by a "bank" which maps MIDI commands
> into state changes.
>
>
>
> APPENDIX: SUGGESTIONS FOR ENHANCEMENT
>
> Presets: There need to be some decent "preset banks" that expose the most
>           common functions to MIDI and to the most common foot pedals in
their
>           initialized format.
>
> This idea pays for the bank idea on its own, if it works "out of the box"
> with "all" the foot pedals "out of the box".
>
>
> The Bank Command:  There needs to be a command that goes off when you
> select a bank.
>                     If the rest of this worked, that would take 10
> minutes to implement.
>
>
> Default Bank: If you had a little extra time, you could have a "default
bank"
>                that would be searched if you didn't find the incoming
command
>                in the current bank.
>
> Curves for dials: In the case of the "linear values" for the dial, it
> would be very
>                    nice to have arithmetic maps that would let you remap
an
>                    incoming controller.
>                    This sort of thing is very useful because things
> like "velocity"
>                    or "breath control" (my favorite) are not linear in
nature.
>
> Rev 2.0:  In a later rev, once you had this structure, it might not
> be to hard to
>            actually create some LFOs, envelopes, other free-running
gizmos...
>
>
>
> ...electronic a capella madness  <http://volectrix.com>.........
> ...extreme internet radio        <http://extremeNY.com/radio>...
>