Noob Trying to Create a MIDI Chorder/Harmonizer
Newbie alert! Been interested in Pd for quite a while, though long after hearing a lot about Max in college (ca. 1990). But my attempts to do anything in it were thwarted by many factors, including the lack of a clear plan. As is often the case, the most appropriate approach to learning a new language is to find a use for it.
Now got what sounds to me like the ideal project: should be simple enough but it teaches me important lessons about Pure data.
Been trying to create a basic chorder/harmonizer taking input from a MIDI keyboard or wind controller and outputting multiple notes to an external synth connected via MIDI as well. Later on, this project might end up with Pd-synthesized sounds, but my first need is for a simple tool which generates different chords based on incoming MIDI notes.
More specifically, the idea is to create something like the “Michael Brecker Effect”, based on something the sax player would do with his Akai EWI and Oberheim Xpander. Brecker would play melodic lines on his (monophonic) EWI and the Xpander would generate random chords under that. There are tools out there which do this but it’s probably best for me to create my own. Been using a tool which does something a bit different (using the incoming MIDI notes as chord roots instead of top notes) and it’s just too much fun. Creating my own chorder/harmonizer would allow me to appropriate the whole thing to my own context.
My sense is that much of this is really trivial, by Pd standards. Even surprised not to readily find multiple examples of just this thing. Maybe my search skills are off. But my understanding of Pure data is so fragmentary that it quickly gets me stuck.
Here’s where things stand at this point. Can easily generate a given chord type (say, a major chord) under any incoming note. Offset the [notein] MIDI note number by a certain amount does create an interval, obviously. And sending multiple numbers to [noteout] actually works. Quite neat. It even deals correctly with note off messages, which was somewhat surprising to me. So far, so good. Can play major chords on any note, which is already a fun effect for a monodic instrument (but something which is already possible for me to easily do).
Where things get really tricky really quickly is in generating different chord types for each incoming note. For instance, in a C major context, would like an incoming C or G to produce major chords, but an incoming D or E should produce minor chords. A non-scale incoming note could work as a passing tone (not producing a chord). Basically, each of the 12 notes in the 12TET octave would trigger a different set of notes.
Therein lies the rub. Triggering different events based on different notes is easy enough with [mod] and [select]. But, for some unobvious-to-me reason, sending those “mixed messages” breaks the whole thing. This is when note off messages stop being interpreted correctly (so: stuck notes). It’s also been impossible to produce passing tones (an offset of 0 for each voice doesn’t appear to have an effect).
It’s fairly clear to me that there’s a basic misunderstanding on my part. About many things. Like which inlet produces which results and how/when messages are interpreted. To my surprise, it sounds like Pd objects have memory, which is reset by closing the patch and opening it again.
Lots to learn!
At any rate, here’s my current attempt at making a chorder/harmonizer patch. Tried many different things leading to different problems. This version gives me stuck notes. Which is what got me stuck.
Any help would be greatly appreciated!
Phonetic Gating Patch
Does anybody know of a function or patch out there for gating speech so that the vowels would be silenced ? By attempting to keep as much of the percussive elements of the speech in as possible. (or vice-versa would be cool too)
I've tried spectral gating and bands etc, but I wondered if there'd be something more contrast like to isolate percussive parts of speech
Any help would be massively welcome, or if anyone has the interest in a new patch I'd happily talk about putting a small thankyou payment their way
Ewolverine 4 U
New version 6.2
- added TARGET DRIVE (you need [timbreID] !)
- changed designations of control assemblies to fit better with their functionality
- improved GUI functions for mouse control
- added display that shows the distance of evolved sounds to the target sample
Now you can use Ewolverine to re-synthesize a sample with any synth you own. Of course not every synth is able to convincingly synthesize any sound, but you can now get as close as possible with it. Just loop back the audio of your DAW into PureData using a virtual audio cable and send MIDI from PureData to your DAW using a virtual MIDI cable and let Ewolverine do the rest!
The re-synthesizing of samples using Ewolverine can take VERY long and I don't guarantee you that it works good, but as it is a free patch, see it as a Bonus!
EWOLVERINE v.6.2 by Henry Dalcke.pd
BEST POSSIBLE BREEDING FUNCTIONALITY NOW ENSURED!
- storage for user SPLICER pattern
- 4 more random sounds per set (A/B) to select from (to save time)
- discontinuous MIDI messaging interrupted by assignment switching CC events to enable breeding especially for FMheaven VST
- possibility to interpolate between new random population sounds to smoothly re-direct the modwheel-morphing path while morphing
Working Peaks for VU
The documentation for the GUI VU meter is pretty vague and I couldn't find any info on how to use the peak indicator. So this is my idea for a working peak.
I would really like to have the peak indicator slowly reset (eg [line] but then you miss the peaks occurring during that time or get interference from the current values
Latest improv works using my pure data guitar rig patch
No time like the present to get started so I am going to go ahead and post the initial-ish sort of work I have done (see YouTube link below) using the guitar pedal patch I am now using.
It started out, that is to say, I initially envisioned it as a MobMuPlat guitar pedal app. But having spent 4 months attempting to make it work to no avail I opted out of that and just settled on using my laptop. The Android I had was too slow or my knowledge base was not large enough to make it happen.
The pedal rig uses mainly DIY2 pedals and some Guitar Extended stuff.
It's primary functional piece is a 4 tap delay with a pitchshifter per line. Makes some amazing sounds: guitar in 4 voices. And my hope is to post that patch as soon as I can.
Hope you enjoy the listen. May it find you in good cheer.
p.s. some of the pieces do not use much of effects and they are all improv pieces which is the only thing I do.
oh, yea: i did some post work on Audacity: noise removal, remove clips, normalize, but that is about it. And my youtube channel is almost all live improv poetry and music.
Problem with using $1,$2 and $3. "Argument out of Range"
@MatteoC47 Hello Matt...... Usually "argument out of range" means that the [pack] object does not have the same number of variables as the [message( that it feeds into..........so.....
[pack s f s f]
should be followed by......
[$1 $2 $3 $4( and if you put a $5........... you will see "argument out of range" in the terminal as the $5 will receive no value.........
But...........[pack] will not "pack" the message until it gets a "bang"....... or in fact "anything" on its left inlet (see the help file for what actually "happens").... and then it will execute..........
I have put a trigger so that the new data from the slider forces [pack f f] to output.........
Please come back here if that doesn't help.
If you are indeed new to Pd...... I always recommend http://puredata.info/docs/manuals/pd/x2.htm up to..... but not including chapter 2.9...... as great bedtime reading!!
pass a string to an abstraction
I try to pass a string parameter to an abstraction, the aim is to use different expr objects depending on the string
I use route to route a [integer string( message
that message is prepared with a [pack 0 $2] so it packs the integer and parameter 2 of my abstraction
so I got
[i 1324] | [pack 0 $2]______[print] | [$1 $2(_______[print] | [route name1 name2]
but it does not work and as I print the message or the pack, it outputs
print: 1234 symbol print: 1234 symbol print: 1234 symbol print: 1234 symbol print: 1234 symbol
how can I solve this ?
choose number from dynamic list
I'm in the process of blind-cloning/porting parc (for monome/max) to pd (for livid block).
Picture an 8x8 grid, each row represents a note, each column represents a step.
When I have multiple rows selected on a step, I want pd to randomly choose a note from those steps (rather than playing a chord).
For this, I think I need to use [list] rather than [pack] or a [table], because it is dynamic. How can I choose a random element from a list, and how can I have a dynamic pack object?
For example, if I only have 4 notes selected on a step, I do not want to have [pack f f f f f f], but
[pack f f f f].
edit: by dynamic, I mean that it does not have a fixed length.