From the original SynthMaker forum (2004–2014), with its members’ names and dates.
caleb ·
Hi all,
I'm currently working on a small project to create a Midi VST plug-in which I'm calling Progressilator.
Dumb title - but that's OK.
Basically, this plug-in will allow you to automate progression versions of an accompaniment via automation.
It's pretty rudimentary so far, but for the moment, you can set the root tonic note of your accompaniment, set a destination tonic along with one of two modulations - Maj/Min, and set whether you want the transposition to be down or up.
The plug-in will do the work for you.
Additionally, you have a global semitone transposition knob if you just want to transpose up/down by -12 to +12 semitones.
There are several limitations at the moment:
1) The root key must be major for the moment (this will change eventually)
2) The conversion to minor does so just flattening the 3rd. This won't be enough for a melody line and I will make it so that it also flattens the 6th and raises the 7th in a future incarnation so that complete melodies can be modulated to minor. However, basic accompaniments should be OK.
3) There is no functionality to transpose by inversions of a chord. Will think about this later.
4) Would MUCH prefer to automate which chord is selected by sending a note - eg C for C (duh), but I haven't really looked into this yet, might require quite a bit of fiddling.
5) Only maj/min modulations possible. It would be nice to add further modulations like min7 etc..
OK - there are heaps of limitations which I intend to knock over, but I thought I'd let you know that I'm doing this and I will post an update to my progress when I have made progress.
Working with midi in SynthMaker is lots of fun (compared to working with audio). It's great working only with Integers - gives the dummies a chance to play too. 😊
--EDIT--
Just realised this was for collaborative projects, but I just thought this would be a nice place to document my progress. Feel free to move this to a more appropriate forum if necessary.
Regards
Caleb
caleb ·
The first thing I'm trying to fix up is that switching a major to a minor really requires more than just flattening a third from the major scale.
You also need to flatten the 6th.
I could say - if semitone in octave equals 4 (with 0 being the tonic) - subtract one from the note value.
Then I could have another compare saying if the semitone in octave equals 9 - subtract one from the note value.
I'm wondering if there's a better way.
For example if value is in list of values, subtract one from the note value.
I'm probably thinking too high up in Python land where this stuff is easy from a programming point of view - but it's probably just performing a series of if-then instructions lower down anyway.
I've been playing with the idea of using an array of integers and a loop primitive, but I think that will end up being a wanky idea so I'm dropping in favour of the string of if-thens.
What I do need though is a way to "execute" chunks of my schematic based on a choice. Ie - I want to be able to say - if the selection for destination is minor go into this module that determines which notes need to be changed for a minor.
I think the Multiplex module might be it - not 100% sure, but I'll experiment and see if this brings about the desired result.
Regards
Caleb
unkargherth ·
caleb wrote: I've been playing with the idea of using an array of integers and a loop primitive, but I think that will end up being a wanky idea so I'm dropping in favour of the string of if-thens.
Seems agood idea for me. Generate a colection of arrays at begining, each one containing the distance in semitones from tonic fro every interesting note
Then, when you need , ie a minor chord, simply select wich array you wanna use
I think is far more eficient than evaluate a collectio of if in any change of "mode"
Also better if you plan to implement a big colection of modes ( Major, minor, 7th, 5th aug , 4th dim, 9th,11th,13th,etc)
caleb ·
Well the big collection of modes isn't going to be a problem because I'm using a multiplex to divert into the appropriate modes based on mode is selected.
So if I select min, the signal gets routed to the "make it minor" module, if I select 7th, the signal gets routed to the "make it 7th" module etc...
So I shouldn't really need huge long strings of if-then.
So minor now has if it's 4, then flatten, if it's 9, then flatten. This isn't too unwieldy.
The 7th is only flattening the 11th semitone so it's not a problem.
It might be a good idea to make an array, but it's not really clear to me how to use this properly. Once I've played with it a bit more I might find better ways to use it. Even creating the array seems a little strange to me.
Regards
Caleb
infuzion ·
unkargherth wrote: Generate a colection of arrays at begining, each one containing the distance in semitones from tonic fro every interesting note
Then, when you need , ie a minor chord, simply select wich array you wanna use
That's the way I would do it! Might beable to cut & paste in an array from a spread sheet, with a bit of .txt exporting...
caleb ·
Thanks for the suggestions about the arrays. Unfortunately, I really just don't know how to implement what you're speaking about. I think I'm going to need to understand arrays and iterators better in SM but they're just curiosities to me at the moment.
Regards
Caleb
infuzion ·
Hmmm after adding a few things to Jorge's Chord.osm from here:
Chord
& oddson's String2Array
[old link]
I came up with this:
[old link]
also interesting:
chord or multiple note string
caleb ·
I've been working with the string2array module trying to understand it.
I've modified it so that it stores a list of comma separated values into an integer array, but I'm having a problem with the clear trigger on the array.
The module stores all my values into an array of integers but the clear trigger is arriving afterwards and clearing all the values.
In the string2array module, the incoming string triggers the clear of the string array. Likewise, my incoming string triggers the clear of the integer array. But in my case, the clear seems to be coming too late. 🙁
If anyone can tell me why I'm having the clear problem I'd be much obliged.
Regards
Caleb
infuzion ·
caleb wrote: In the string2array module, the incoming string triggers the clear of the string array. Likewise, my incoming string triggers the clear of the integer array. But in my case, the clear seems to be coming too late.
If anyone can tell me why I'm having the clear problem I'd be much obliged.
It's your link order.
Look inside the module at the In. You'll see little notches next to it on each link. This is telling the programmer (you) what order that In data goes out. So, you need to make the Array:Clear trigger the first to recieve data, then Counter:Reset , then the module. {edit}
caleb ·
Oh cripes!
That's simple and it certainly makes sense. I didn't go past thinking - that's the first additional, that's the second additional.....
This visual logic is simple once you actually start thinking! 😀
Thanks for that.
Off to bed now, but I'll fix up what I've done some time tomorrow and move ahead with redesigning using arrays.
Thanks for the help.
Regards
Caleb
caleb ·
Was just thinking about the problems attached with transposing via different modes.
Now that people and previous efforts have got me using integer arrays I will be able to move from major to minor and minor to major fairly easily.
However, chords like 7 and min7 are a little different, and it's made me realise that I need to cater for two different types of pattern used as input: melody and chord.
For a melody track it's fine to just flatten or sharpen as necessary. However, for chord-type tracks you'll want to add and/or remove notes . Additionally, in one pattern you may have a melody and a chord component. So it might be worthwhile to introduce an automatable switch between the two transposition methods.
The saga continues....
Regards
Caleb
caleb ·
Putting aside all other fancy features this thing could have, I have an issue with how the Progressilator currently performs.
The idea of this device is meant for realtime transposition to different keys based on a base (root) pattern.
I have it so that the destination key can be automated via CC, or switchable by midi note on a separate channel from the base pattern.
However, I get all sorts of horrific stuck notes when the destination key is altered at the same time as a note is being played in the base pattern.
Eg. Base pattern sends a C3 minim to the Progressilator and exactly the same time as automation is sent to change the destination key. This will result in C3 becoming stuck.
I can avoid this if I send the automation data after one note off and before the next note on, but this isn't terribly practical - especially as there won't always be such a gap between notes in the base pattern.
So this is my next challenge.
Regards
Caleb
Wrote something here? To have a post removed or your name hidden, write to [email protected].