![]() |
![]() ![]() ![]() ![]() ![]()
|
next newest topic | next oldest topic |
Author | Topic: Freezing hot parameters, and data-driven sequences |
Kelly Fitz Member |
![]() ![]() ![]() I hope it is not inappropriate to ask this kind of question here, please advise me if I should post this elsewhere. I am trying to achieve the following: I have a complex sound that evolves over time, say a sequence of notes, like maybe the MachautKyrie that I found in the MIDI scripting examples. I want this complex event to have some behavior specified parametrically, that is, I want to have a few sliders control parameters of the sound, but _not_ in real time. That is, I want to configure the sound, and then trigger it, but then I want to be able to move thhe sliders around _without_ affecting the sound that's playing. I want to do this so that I can then move the sliders and trigger another one of those sounds, but with new and different parameters. This seems like the sort of thing that I ought to be able to do with some combination of analog sequencers and MIDIVoices (although I don't want to trigger with MIDI, but rather with a hot parameter...don't know how to set that up either), but I cannot seem to find the right combination of those things. Another way of describing what I want, I think, is to make a sound with a bunch of variable parameters (the kind like ?Var, instead of !Var, right?) but then instead of prescheduling them with a script (which I find cannot contain hot parameters), I want to trigger them in real time, from something like the VCS. Can someone point me in the right direction? An example sound, a passage in the manual (yes, I'll even rtfm!), anything will help. -kel IP: Logged |
pete Member |
![]() ![]() ![]() I'm not sure if I fully understand, but are you looking for the sample and hold module? Here you would have a sample and hold for each paramiter you want to give this action to. Then you could play with the parramitors and nothing would happen to the sound, but as soon as you pressed the trigger paramitor(which would be common to all sample and holds), the setting you have set would be passed to the sound in one go. I don't know if I've understood what you want , so let me know. IP: Logged |
Kelly Fitz Member |
![]() ![]() ![]() quote: This would work, in part. It would freeze the parameters until I triggered, but I am thinking in more "object-oriented" terms: I want to fiddle with controls, instantiate an object with those settings, then change the settings, and then instantiate _another_ object with the new settings, without stopping or changing the first object. For example, I might want to trigger a series of temporally-overlapping melodies, and each new melody reflects the state of the parameters on the VCS at the time the melody started playing. So I need something more, I think. The sample and hold seems like the wrong tool... or maybe not. -kel IP: Logged |
photonal Member |
![]() ![]() ![]() My interpretation would be to use a multitrack timeline using the same sound in each track but using a combination of overlapping tracks and WaitUntil sounds to achieve your instantiations. I'm wondering if you could then 'fiddle' with a sound (in a particular track) and then trigger the WaitUntil to instantiate it. Andrew IP: Logged |
pete Member |
![]() ![]() ![]() I could be wrong but I think that instanses cannot be produced on the fly (while the sound is playing) but are made during the compile and down load time. If this is the case then you would have to choose the max number of instances to before hand but you could trigger them into action as and when you need them. I'm sure there are some scripts that will do this more neatly than I'm about to describe, But I can't help you there. Anyway. If you made one of your tune creating module clusters with sample and holds insterted in there parram paths and made sure that the S&H trigger parram was the same as the trigger that kicked off the tune. You could then feed that cluster into a mixer module and make copies (say 4 or 5) feeding into the same mixer. Then by renaming all the triggers in the second cluster to !trig2, and in the third cluster to !trig3 etc. Then as long as they where turned into buttons on the VCS ,you could start them in playing time when you wanted, and they would use the settings of the VCS at that time. Also if tune one came to an end, you could retrigger it with new settings. Is this closer to what you are trying to do? IP: Logged |
dennis Member |
![]() ![]() ![]() I believe Pete is correct, regarding object instantiation. Once the Sound structure is compiled, it is fixed. Using a Script to generate a maximum number of presetable Sounds should work, though that may not be what you want. You might also be able to use the real-time expressions "gateWhen:" and "hasChangedReset:" instead of TriggeredSampleAndHold modules. TriggeredSampleAndHold operates with sample-rate input, which is not necessary if the input is from hot parameters (save that processor juice!). But I've experimented with "gateWhen:" and "hasChangedReset:" only a little so take this comment with a grain of salt. IP: Logged |
Kelly Fitz Member |
![]() ![]() ![]() quote: I was afraid he might be. I am okay with the idea of having to preschedule my polyphony, but I am trying to avoid having N copies of the full set of controllers, which would be a nuisance
quote: I've not seen these things before, can you refer me to some documentation about the real time expressions? I'll start digging around in the manual. Maybe this will serve my purposes. Thanks, p.s. after digging throug my manual, I still cannot find any reference to "gateWhen:" or "hasChangedReset:". Where do I learn about these realtime expressions, and others like them that aren't listed in the Kyma Reference? [This message has been edited by Kelly Fitz (edited 21 November 2001).] IP: Logged |
pete Member |
![]() ![]() ![]() Kelly You would only get one set of controls because the controler names are the same in all the clusters. You would get a different trigger button for each cluster because you would have named them differently. I'm sure Dennis is right about the more eficiant coded alternative to S&H and there are also scripts that can make the multipul copies invisably and give the triggers a different random name. But this is all above me at the moment. sorry. IP: Logged |
Kelly Fitz Member |
![]() ![]() ![]() quote: True. I was hoping for something as easy as the MIDIVoice and MIDIMapper (is that what its called?) sounds, which schedule controller mapping and polyphony without any effort on my part. They schedule as many instances of my sound as the polyphony I specify, and then they handle passing controllers (!KeyVelocity, !KeyNumber, etc) to the individual instances as they are triggered (I think). And when you run out of polyphony, it automatically recycles and retriggers the first one (I think). This is the sort of automation I was hoping for, but I don't want to use MIDI cables or messages for anything, I want instead to use hot parameters. Maybe all I need to do is remap the MIDI messages? So that a hot parameter is mapped to !KeyDown and so on? I wonder if that'll work...I'll try... -kel IP: Logged |
pete Member |
![]() ![]() ![]() If you used !KeyDown as your triggers for the S&Hs , you would only need one cluster, and it should work, just the same as the script. IP: Logged |
Kelly Fitz Member |
![]() ![]() ![]() I feel like I am really close to understanding how to do this, but something crucial is missing. I have kludged up with MIDIMapper prototype so that I can start two versions of its subsounds (polyphony of 2, and subsounds triggered/gated by !KeyDown) with different parameter settings (like !Speed). I can do this _if_ I use the map: !Speed is: (!Pitch inSOSPitch). or something like that involving !Pitch, and converting the note number into a value between 0 and 1 with inSOSPitch. Then I can trigger two versions with a script in the mapper like this: self keyDownAt: 0s duration: 0.5 s frequency: 127 nn. The critical part is that !Speed is expressed in terms of !Pitch which is set once for each MIDI event in the script. !Pitch is special that way. If I just let !Speed be a VCS controller, then it controls all active subsounds in real time, so they all have the same value of !Speed at all times. Another way of saying it, I guess, is that hot parameters _other_ than !Pitch (and its bretheren) and !KeyVelocity (both of which are individual to each MIDI event) are shared by all active subsounds. The other critical part is that I can use the script to make the polyphony happen (presumably I could also use a MIDI keyboard, but I don't have one). If I don't use the script then I get a number of instances of the subsound (2 in this case) playing simultaneously with the same parameters. So the fundamental hang-ups I have are these: 1) How can I elevate other event values to the exhalted status of !Pitch, so that I can have them "frozen" at the time of triggering, instead of changing in real time? (Or is my only option to use the few special parameters, velocity and pitch, and are specific to each MIDI note?) 2) How can I generate MIDI events, or otherwise use the polyphony represented by the MIDImapper, from the VCS or from external event sources? MIDI events appear to get special treatment, which is okay in a sound called MIDIMapper, as long as I have a sound like OtherKindsOfEventMapper that works more generally to schedule overlapping (i.e. with polyphony) events that aren't based on piano-like keyboard presses. I must be missing something.
IP: Logged |
pete Member |
![]() ![]() ![]() All the midi controlers are common to all the notes playing in the one midi channel. The only things that are pert to a single note are key down, key up ,key down velocity,key up velocity,the note number(key pitch) and poly aftertouch. And only four of them have values other than 0 and 1. It seems S&Hs or there counterparts are the easiest way. IP: Logged |
SSC Administrator |
![]() ![]() ![]() "1) How can I elevate other event values to the exhalted status of !Pitch, so that I can have them "frozen" at the time of triggering, instead of changing in real time? (Or is my only option to use the few special parameters, velocity and pitch, and are specific to each MIDI note?)" What about the following: Now you have a !Fader whose value is frozen at the time of the KeyDown. Is that what you want? IP: Logged |
Kelly Fitz Member |
![]() ![]() ![]() quote:
-kel IP: Logged |
dennis Member |
![]() ![]() ![]() Hi Kelly! I'm not sure if they'll do what you want, but take a look at Script and SoundToGlobalController. I think you can set up a Script to generate a sound structure like you describe. I.e., a set of nearly identical Sounds all feeding into a Mixer. Like the MIDIVoice Sound, the number is fixed at compile time. Generally, I create one Sound, get it working, "parameterize" it, then put it into the Script. The script in the Script starts the appropriate number of Sounds via some kind of loop. Also, I've found the "Expand" menu command helps me confirm the Script is working the way I want (i.e., generating the appropriate Sound structure). SoundToGlobalController used to be called SoundToEvent so look for it in the "sacred book" by that name. I use it many times for debugging purposes, too. Really handy! IP: Logged |
Bill Meadows Member |
![]() ![]() ![]() quote: They are new since the printed manual. Try the "Quick Expressions Guide" in the CD-ROM documents. ("Documentation" under the File menu, I believe, if you loaded everything.) IP: Logged |
All times are CT (US) | next newest topic | next oldest topic |
![]() ![]() |
This forum is provided solely for the support and edification of the customers of Symbolic Sound Corporation.