microtonal midi– old saw I'm sure

Mar 6, 2009 at 5:50am

microtonal midi– old saw I'm sure

Hi all. I’m sure this is an often posted topic but I’m looking for a way to create midi messages that precisely reflect specific microtonal values. I thought the solution would involve using note messages and pitch-bend messages in tandem? Anyway, I came across this much older post which I believe purports to accomplish this task (with help from Magic Microtuner), but having opened the patches posted I can’t seem to ascertain how to use them. Perhaps someone can help me with these or with a different solution? Below is the older post with the patches. Thanks in advance.

Here’s a little hack I put together for using Max Magic Microtuner for
one of my students. Export your tuning file to a coll file in cents
from MMM. It’s not the definitive end-all be-all patch for this sort
of thing, but it will allow you to play up to fifteen notes each having
completely different tuning bases on any standard MIDI keyboard that
receives on 16 channels and understands pitchbend messages. (no need
for custom tuning specs) Right now it’s designed to receive from one
keyboard and send to another, but with local off, etc. you could
probably do it with one keyboard. (it doesn’t output on channel 10, so
you could use that for input) A more clever implementation would
probably compare the fractional parts of the tunings and find any
similarities in terms of magnitude of fractional parts and be able to
send more than one note per channel.

Peter McCulloch
http://www.petermcculloch.com

MicroVoice.pat:

max v2;
#N vpatcher 388 157 1280 728;
#P window setfont “Sans Serif” 12.;
#P window linecount 3;
#P comment 567 386 205 196620 8191 if max pitchbend = 2 half-steps.
Adjust accordingly for different bend sizes.;
#P window linecount 6;
#P comment 386 234 122 196620 Release time. Prevents tail of note from
being overlapped with new note. Set longer if needed.;
#P window linecount 2;
#P comment 589 346 205 196620 This avoids channel 10 (the percussion
channel);
#P window linecount 1;
#P newex 541 347 30 196620 + 0;
#P newex 561 319 46 196620 >= 10;
#P newex 408 447 67 196620 r setPort;
#P newex 91 413 67 196620 r setPort;
#P number 619 317 43 12 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P window linecount 2;
#P comment 634 203 205 196620 A bang causes thispoly~ to send out which
instance number it is.;
#P window linecount 1;
#P newex 318 232 62 196620 pipe 200;
#P message 318 205 16 196620 0;
#P newex 318 174 39 196620 sel 0;
#P window linecount 4;
#P comment 382 106 205 196620 Tell poly~ we’re busy when a note is
played , and tell it we’re free to play a new note once the current
note is released.;
#P window linecount 1;
#P newex 318 138 37 196620 != 0.;
#P window linecount 2;
#P comment 650 280 205 196620 Use thispoly~ to set the channel for
output;
#P window linecount 1;
#P newex 562 198 62 196620 loadbang;
#P newex 562 281 65 196620 thispoly~;
#P comment 577 449 193 196620 Fractional part sets pitch bend;
#P newex 487 413 54 196620 + 8192;
#P newex 487 382 57 196620 * 8191.;
#P newex 487 477 54 196620 midiout;
#P newex 487 446 85 196620 xbendout;
#P newex 170 458 160 196620 noteout;
#P comment 75 376 98 196620 The base pitch;
#P comment 272 342 168 196620 Return the fractional part;
#P newex 230 338 31 196620 – 0.;
#P comment 225 266 130 196620 Convert from cents;
#P newex 170 300 131 196620 t i f i;
#P newex 170 259 49 196620 / 100.;
#P message 199 197 37 196620 read;
#P newex 170 104 84 196620 unpack 0. 0.;
#N in 1;
#P newobj 170 67 32 196620 in 1;
#N coll tuning 1;
#P newobj 170 227 83 196620 coll tuning 1;
#P comment 210 67 100 196620 First inlet;
#P connect 2 0 3 0;
#P connect 4 0 1 0;
#P connect 3 0 1 0;
#P connect 1 0 5 0;
#P connect 5 0 6 0;
#P connect 27 0 11 0;
#P connect 6 0 11 0;
#P connect 6 1 8 0;
#P connect 3 1 11 1;
#P connect 6 2 8 1;
#P fasten 3 1 20 0 249 132 323 132;
#P connect 20 0 22 0;
#P connect 22 0 23 0;
#P connect 23 0 24 0;
#P connect 30 0 11 2;
#P fasten 8 0 14 0 235 369 492 369;
#P connect 14 0 15 0;
#P connect 15 0 12 0;
#P connect 28 0 13 0;
#P connect 12 0 13 0;
#P connect 17 0 30 0;
#P connect 17 0 29 0;
#P connect 29 0 30 1;
#P connect 24 0 17 0;
#P lcolor 7;
#P connect 22 1 17 0;
#P connect 18 0 17 0;
#P connect 30 0 12 1;
#P connect 17 0 26 0;
#P pop;

and MicroVoicePlayer.pat:

max v2;
#N vpatcher 20 74 891 394;
#P window setfont “Sans Serif” 12.;
#P comment 305 80 85 196620 Output;
#P window setfont “Sans Serif” 18.;
#P user umenu 44 103 188 196683 1 64 131 0;
#X add “AU DLS Synth 1″;
#X add “Traveler Midi Port”;
#X add QS6;
#X add “Roland RD-150″;
#X add “from MaxMSP 1″;
#X add “from MaxMSP 2″;
#P window setfont “Sans Serif” 12.;
#P number 152 198 35 12 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P number 59 199 35 12 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P window setfont “Sans Serif” 18.;
#N vpatcher 10 59 610 459;
#P window setfont “Sans Serif” 12.;
#P message 199 87 49 196620 set $1;
#P newex 129 50 80 196620 t b i;
#P number 64 122 35 12 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 129 85 48 196620 Uzi 16;
#P newex 50 158 127 196620 pgmout;
#P newex 50 78 67 196620 r setPort;
#P inlet 129 30 15 0;
#P connect 4 0 2 0;
#P connect 1 0 2 0;
#P fasten 3 0 4 0 134 114 69 114;
#P fasten 6 0 4 0 204 114 69 114;
#P connect 0 0 5 0;
#P connect 5 0 3 0;
#P connect 3 2 2 1;
#P connect 5 1 6 0;
#P pop;
#P newobj 450 103 130 196626 p SetProgram;
#P number 450 68 35 18 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P window setfont “Sans Serif” 9.;
#P hidden newex 250 23 48 196617 loadbang;
#B color 5;
#P window setfont “Sans Serif” 18.;
#N vpatcher 10 59 610 459;
#P window setfont “Sans Serif” 12.;
#P newex 161 86 34 196620 t b i;
#P newex 151 192 44 196620 zl reg;
#P newex 185 152 52 196620 pack i i;
#P newex 258 153 48 196620 Uzi 16;
#P newex 50 197 67 196620 r setPort;
#P newex 151 230 46 196620 ctlout;
#P newex 161 50 40 196620 ctlin;
#P connect 3 0 5 0;
#P connect 5 0 1 0;
#P fasten 2 0 1 0 55 224 156 224;
#P connect 0 0 6 0;
#P connect 6 1 4 0;
#P connect 4 0 5 1;
#P connect 3 2 1 2;
#P fasten 0 1 4 1 181 80 232 80;
#P fasten 6 0 3 0 166 130 263 130;
#P pop;
#P newobj 600 103 194 196626 p EchoControllerData;
#P user umenu 250 103 188 196683 1 64 131 0;
#X add “AU DLS Synth 1″;
#X add “Traveler Midi Port”;
#X add QS6;
#X add “Roland RD-150″;
#X add “from MaxMSP 1″;
#X add “from MaxMSP 2″;
#P window setfont “Sans Serif” 9.;
#P hidden newex 250 79 45 196617 midiinfo;
#B color 5;
#P hidden button 250 49 15 0;
#P window setfont “Sans Serif” 12.;
#P hidden newex 428 143 68 196620 s setPort;
#P newex 95 228 113 196620 prepend midinote;
#P newex 95 198 52 196620 pack i i;
#P window setfont “Sans Serif” 18.;
#P message 318 175 49 196626 read;
#N coll tuning 1;
#P newobj 318 212 116 196626 coll tuning 1;
#P window setfont “Sans Serif” 12.;
#P newex 95 171 95 196620 notein;
#P newex 95 257 131 196620 poly~ MicroVoice 15;
#P comment 376 181 166 196620 � Load tuning file in cents;
#P comment 91 79 85 196620 Input source;
#P hidden connect 10 0 18 0;
#P connect 3 0 16 0;
#P hidden fasten 18 1 3 0 227 141 100 141;
#P connect 3 0 6 0;
#P connect 6 0 7 0;
#P connect 7 0 2 0;
#P connect 3 1 6 1;
#P connect 3 1 17 0;
#P hidden connect 13 0 9 0;
#P hidden connect 9 0 10 0;
#P hidden connect 10 0 11 0;
#P connect 5 0 4 0;
#P hidden connect 11 1 8 0;
#P connect 14 0 15 0;
#P pop;

#42698
Mar 6, 2009 at 6:19pm

Nice, but I have a question. How useful is it to go MIDI-out? I think at a certain point, especially for microtonality, MIDI becomes a little obsolete. All of the workarounds that are necessary to make microtonal MIDI possible (such as one note per channel and cents-accurate tuning) are solved fairly easily if you just build your synths inside Max, or ChucK, or RTCmix, or any of the other languages that Max objects recognize. Also, I’ve found that almost every MIDI vst has so much built-in vibrato that the pure microtonal intervals (it seemed, based on your wording, that you were using rational tuning) are lost.

Anyway, I really am curious to know what external synths you’re using this with. I ended up building a tuner that just reads 12-tone ratios from a coll with dynamic re-tuning of the 12-tone modes, which has actually helped my composition process as I can separate (in my head) the 7-based modes from the 5-based, for example. The idea is to make an [mtof] that can be re-tuned dynamically, and I found that 12t Just scales are enough, as it lets me improvise on my keyboard with octave transposition. Best yet, it doesn’t take any external objects.

global_tuning

– Pasted Max Patch, click to expand. –

Where “tuning_files” is something like

0, 5limit_just;
1, 7limit_otone;
2, 7limit_utone; (with a wide major 2nd)

etc., and each of those files loads a different tuning coll.

-Andrew

#152855
Mar 15, 2009 at 8:25am
ACSmith wrote on Fri, 06 March 2009 11:19
The idea is to make an [mtof] that can be re-tuned dynamically, and I found that 12t Just scales are enough, as it lets me improvise on my keyboard with octave transposition. Best yet, it doesn’t take any external objects.

That’s interesting, by the way using a specific external like the microtuner object (http://homepage.mac.com/cerullo/.Public/mtx_file_specs.htm) can make life easier. This for several reasons including the fact that microtonal synthesizers should be endowed with pitch modulation sources that consider scale steps rather than 12-tET steps, so that performance-wise they can “feel” more natural when you play them. And of course achieving these features in Max/MSP is far easier with a dedicated external. You’ll find an example of what I mean at that URL as far as pitch bend modulation is concerned (i.e. the “clever bend” example, but the same would go for the LFO width etc.)

Ciao,
VC

#152856
Mar 15, 2009 at 7:02pm
Deranger Two wrote on Sun, 15 March 2009 01:25

This for several reasons including the fact that microtonal synthesizers should be endowed with pitch modulation sources that consider scale steps rather than 12-tET steps, so that performance-wise they can “feel” more natural when you play them.

Hm, I had checked MTX out maybe six months ago, but just didn’t have the Max experience to use it well, then decided to build my own more recently. One issue for me was that I just liked having everything in int ratio format instead of float frequencies. I actually understand that link now, though, so I’ll give it a shot soon.

And wsuchinsky, I completely misunderstood your question. I didn’t see that you were quoting, so sorry. The microtuner object won’t do that (at least with the functionality I know of), because it gives a keymap of specific frequencies or of cents-numbers. With the pitch bend thing you would have to parse a coll and scale that exponentially through the 12-bit (8192?) scale. I used to have the whole thing worked out using Finale (music notation software), pitch bend, and NI Kontakt 2 to get microtonal accidentals to play back (as long as I left out double-stops). If you still want that, it would be a cool project to make microtonality easy to use across all (most) vst instruments. Are you looking for equal-tempered microtonality or Just Intonation?

#152857

You must be logged in to reply to this topic.