So, I posted an Idea for an app over on the “Ideas” category, and it was suggested that the Process area might be a good place for me to keep the community updated on the goings on of this journey and to seek wise words and encouragement to carry on with what will no doubt be a VERY mamoth task as somebody who never even changed my myspace layout back in the day, let alone tried to devise and code a LUA script…
so, without further ado, let me introduce to you my script idea ( reposted from the original “ideas” thread for completeness…
=============The Idea ===========
OK folks, this might be a long one so I will try and break it down into chunks to keep interest
Working Name – D2MS (a drum-to-midi-synth)
Overview – A bridge to take non-melodic “drum trigger” midi note data and reinterpret it as timing (and dynamics) data to be used by melodic sequenced or “constrained-random” data.
Background – My first exposure to the concept here is the awesome drummer Andre Duracell, who used drum triggers running into a computer to create step advances ( and shifts between sequences) in sequences pre-prepared on his computer .
I wished to work from this idea base to create something that could operate this way without a full laptop setup , and also extend the scope of the project to take in “constrained variable randomisation“ (i.e. give me a bass motif off my kick drum , notes within two octaves of middle C on my snare, change the bass drums root note each time I tap my tom and make it all generate within C major etc)
The niche of this idea is using static Midi notes to drive “Lanes” of midi melodic note data , rather than the more conventional use of triggering other drum samples in a non melodic way.
How I’ve been doing it so far (outside of Norns)…
The nearest I have managed so far is using a Midibox Seq V4 which does have a “step advance” function which uses a whole channel as a “bus” input to then tell another track to advance by one step each time a note input is revied on the receiving channel …. This got me to the following kind of situation…
Scale = Major , Root = C ,
Bus 1 receives on channel 1 from Kick drum sends to track 1 outputting on track 1 with a randomly generated 8 step pattern or notes
Bus 2 receives on channel 2 sent from my snare, which sends from a randomly generated 16 notes ( with added “humanisation” to vary these notes even more over time)
Bud 3 and 4 receive on channels 3 and 4 from both my toms but are both output to channel 3 set an octave apart with two different random sequences , this allows me to make “chords” where the higher or lower part of the chord can shift upon a hit with the other being held as a drone note.
What could a norns/grid version add?
To me there are some very obvious things that could be very useful
The first being that there is a LOT of data what is not being used in my current Midibox “proof of concept ”setup… basically we are limited to just 4 buses and they can only use the note to step advance , all other data that could be used ( I’e more notes , velocity, aftertouch, extra pedals etc is being discarded.
To me an optimal setup would contain the following
- Grid support for quick pattern creation / re-randomisation ( lets say a page of “lanes to select track length and note ) plus function buttons per track to set play method, randomise the notes in that lane etc.
- The ability to use some specified notes as “step advancers” and other midi notes to , for example, switch between patterns or modulate patterns ( for example, to change a the filter cutoff of the synth connected to midi output, or to reverse the note order of a sequence
- The ability to use things like the velocity data of the step advance note to control things such as a velocity of the synth being controlled…but this being de-coupled so that it could be re-parsed as a filter CC# or higher velocities leading to longer decay etc.
Well, basically, this is me putting my dreams out there and seeing what sticks… I am loving the norns eco system and I am taking teensy steps to add a button here and there to other peoples scripts that I really love, but clearly, the scope of this idea is MUCH bigger than my current knowledge base, so I thought , in the spirit of the community, I would see if the idea resonated with anyone who might be able to run with it from a coding aspect.
---- next steps----
I decided it would be a good “ thought process” to try and write a manual for the script as if it did exist ,therefore what follows is a full manual for a how the script would work i theory.
Grid Layout Page 1 – “Performance”
This consists of four repetitions of 2 x 16 “lanes”
The top line of these lanes are “functions” that then apply to the lower 16 buttons which form a 16 step sequence grid.
It is important to note at this point that a “sequence” is simply an “order in which the selected notes will play” , it is not a sequencer in the traditional sense as the notes are diven by the incoming Midi drum hits data, not by a clock etc. …all time based data is dependent on receiving midi notes that correspond to the “driver channels” as defined in the Options page on Norns
By further extension , in Random mode, these “sequences” are basically just a “note pool” from which the random note will be drawn, to increase the likely hood of a specific note being played in random step mode, it can be inserted more times into the pool.
-------------ROW A —Functions Row----------
A1-A7 (full lit for active notes half lit for omitted notes) are the notes selection section in the chosen scale ( in all examples I will use the C major scale so , for example this would be notes C,D,E,F,G , A, B , holding any of these keys and pressing a sequence step will specify that note in the sequence to be sent at the point where that step is triggered.
A8 – Currently unused for visual definition (can be used with the shift button to activate “velocity mode”
A9-A10 +Octave and –Octave (full lit) . These buttons set which octave range of the note that will be input into the step sequence Shift + either octave button will transpose the whole sequence up or down by adding or lowering by one octave per press relative ot the input notes
A11 – Range marker button ( Half lit) – This button is held along with pressing a note on buttons A1-A7 and with help of the octave keys or within the steps of the sequence or the Sequence buttons B1-16 ….and is used similar to making open and closed quotation marks “” to define the highest and lowest notes that will be used in the random note generation and replay functions (in the case of the A1-7 notes buttons being pressed) or the steps to play between in the case of the sequence B1-16 being pressed.
A12 - Currently unused for visual definition
A13- Sequence Direction - (toggles between off/ half/ full lit ) This specifies if the sequence is played through in order in a loop forwards , the same but backwards, or random.
A14 – Randomise (full lit) – this button would insert notes into each step of the sequence at random but constrained by the scale / octave and range selected …a repress will re randomise the pattern
A15 Sustain buttons (toggle between off and half bright) suppresses note off messages to allow for midi notes to drone and just hold the note until the next note is received
A16 Shift ( Full Lit)
This button is combined with others to allow the following functions
— Shift Functions ----
Shift+ A1-A7 takes that note out of the note pool for randomise functions (the coinciding button goes to half brightness ) another press would re-enable it.
Shift + A8 is a special function button that disables the sequence mode ( all sequence lights B1-16 dim to half brightness when ON ) … it activates “velocity mode” see OPTIONS for further info.
Shift +A9/10 ( Octave +/-) Transposes the playing sequence up of down by just one semitone allowing for on the fly transposing of the sequence
Shift + A 11 lets you re-define the midi channel on which the sequence is sending ( this can also be defined in setup and saved) with both buttons held the channel is displayed by a flashing cursor on whichever of the B1-B16 sequence steps represents the channel ( I.e B3 flashing would indicate midi channel 3)
Shift +A13 Sequence Direction : re randomises the random sequence if in random direction mode ( same underlying notes are in the actual sequence just played in a new order)
Shift + A14 Randomise : clears the sequencer of all notes
Shift + A15 Sustain – sends all notes off message to that channel to allow stuck / sustained noted to be cleared
----------ROW B – Sequence Lane ------
B1 – B16 are all steps of a playback sequence that will loop over at the row end… remember , in distance to a normal “sequencer” the step is only advanced based on the triggered input midi note received as defined in its channel setup…
Shift + B1-B16 will delete any note inserted in that step of the sequence
A note on Blank spaces – Blank spaces in the Sequence Lanes are the default of a new /cleared sequence… or can be made by shift clicking any step as this would delete the data in the step… in performance a blank space is acknowledged by the playhead moving to that step , however no midi note is output…this allows for thing like gaps in the melody during performance, i,e, a drum could be hit without always having an accompanied melodic note.
---------- Other Tracks/ Lanes ---------
We have 4 tracks to send up to 16 notes of data on each can have
• A different channel
• A different sequence
• A different playback type
• Different notes omitted from the master scale ( via shift selecting)
• A different octave and range
These for tracks are a repetition of rows A and B three motr times i.e:
Track 2 rows C and D
Track 3 rows E and F
Track 4 Rows G and H
----------- ON NORNS SCREENS AND DATA ----------
Button 1 will more between screens
Screen 1 – Performance.
(this is the screen that would be displayed with the grid as the main performance view )
This screen would give a simple overview of what Root and Scale is being used on the performance grid.
Encoder 2 would navigate the Root notes C, C#, D etc without changing the used root, whilst pressing
Button 2 would confirm the choice selected by E2 and bring it into use
Encoder 3 would navigate the Scales, Major, Minor, Lydian etc without changing the used scale, whilst pressing
Button 3 would confirm the choice selected by E2 and bring it into use
Screen 2 – Setup
This page would be navigated soley on Norns itself and would allow for the initial setup of options
Encoder 1 scrolls to each option, and when hovering on a specific option encoders 2 and 3 are used to set the highlighted options with button 2 used to cancel and changes and button 3 used to accept .
Driver Channel / Note 1 = what channel and note will control the advance of steps of Lane 1
Driver Channel / Note 2 = what channel and note will control the advance of steps of Lane 2
Driver Channel / Note 3= what channel and note will control the advance of steps of Lane 2
Driver Channel / Note 4 = what channel and note will control the advance of steps of Lane 4
Encoder 2 sets the channel Encoder 3 sets the Note , Button 2 exits the selected menu layer Button 3 accepts changes
Preserve Empty Sequence Steps - (OPTIONS YES/NO) if this is set to on steps in the sequence that have been defined as empty (no note when triggered) will be preserved when the note randomise button is used
Random Empty Steps – (OPTIONS YES / NO ) if yes, then an empty step is possible an an optin for any step in a randomised sequence lane, if no , then all 16 steps will contain note data.
If this is set to off, a note will be written to every step in the sequence ( including those outside of the defined start and end points although these wouldn’t be heard unless the points are re-expanded.
Velocity Mode Min / Max 1
Velocity Mode Min / Max 2
Velocity Mode Min / Max 3
Velocity Mode Min / Max 4 -sets lowest and highest velocity
E2 sets min E3 sets Max, B2 cancels B3 accepts changes
Velocity Invert 1
Velocity Invert 2
Velocity Invert 3
Velocity Invert 4 ( higher velocity = lower note if ON ) these are off by default.
E2 changes from off to on E3 accepts E2 canels
About Velocity Mode – velocity mode uses the same base of selecting a root/scale ( and notes within that scale ) along with a highest and lowest note point using the grid,
But rather than using the sequence steps to chose which note is played, Velocity mode slices the refined note range across the 0-127 ( or less if the range is constrained above) so that harder velocities are interpreted as higher notes within the note pool) … the smallest gap possible must not be less than 1 velocity step per defined note range ( i.e. if one octave is defined then 60 to 67 would be the smallest definable gap in velocity ) … in practical usage larger ranges allow small to medium note ranges to be mapped with reasonable intervals between each note being switched to the next ( i.e. if minimum is 40 and max is 120 then a 2 octave range would be divided so that there is a new note every 5 velocity levels ( 80 velocity levels divided by 14 note options rounded down )
Command 1 Channel / Note
Command 2 Channel / Note
Command 3 Channel / Note
Command 4 Channel / Note
These set which incoming midi channel and note will be used as a “command” E2 sets channel E3 sets note, B2 cancels B3 accepts changed values.
Command 1 – Type / Value
Command 2= Type / Value
Command 3 = Type / Value
Command 4 = Type / Value
Options of Command Type are as follows: CC/Rand/Rev/Retrig
CC = sends a midi CC number as defined in the VALUE this function uses midi velocity in a “sample and hold” way to represent value off the CC number that will be sent when a hit is detected…this is useful for (for instance) using a rimshot to alter the filter cutoff of the synth that is played with the snares main midi note.
Randomise= when this specific midi channel/note combination is received, it will randomise the sequence for that defined Lane. ( i.e. you could use an auxiliary snare set to send a command channel note , to change the notes played by the bass drums Lane.
Reverse playhead, this command note will reverse the direction of the playhead in the specified Lane ( tap once to engage and once again to “reverse the reverse” back to normal
Retrig –reversing the playhead direction AND playing the note that it is reversed to … this has a specific purpose of allowing for playing back up and down a single step or few steps rapidly , therefore allowing “creccendo” by using it and the normal trigger note for that lane to re step the same note or few notes over and over again
Sequencer Velocity 1 = Min / Max
Sequencer Velocity 2 = Min / Max
Sequencer Velocity 3 = Min / Max
Sequencer Velocity 4 = Min / Max
( this sets the lowest and highest midi note velocities that will trigger the advancement of a step along the sequence lane… it is used to “tune out” specific dynamics, so that a drummer can play either soft or hard notes knowing they WON’T trigger a step advance…allowing for dynamic playing )
------------Future Expansion -----------
I would really love to have another grid page that allowed for the selection of and storage of multiples patterns per lane that could then use more “command modifiers” to for instance use a tom drum hit to switch between verse and chorus sequences or notes…however, I think there is quite enough here to be going on with.
Running Changes to Original Idea
- the Note section will now run over 8 steps (octave note now included) as this seemt o be inline with other exsisting code in the MusicUtils library.
- therefore the Shift+A8 function (velocity mode) should now be moved to Shift+A12
- I am considering a new function of splitting the 16 Sequence Steps into an A and B ( verse and chorus) parts… where another midi note could be used to switch between them…however I need more time to consider how to map this out.