![]() |
![]() ![]() ![]() ![]() ![]()
|
next newest topic | next oldest topic |
Author | Topic: Sequenced Wavetables |
David McClain Member |
![]() ![]() ![]() I have in mind an idea that needs the use of multiplying wavetables but these tables are not static. Rather on some trigger at audio rates I need to step or change the wavetable in use. So far the only thing I can think of in Kyma for this purpose would be to compute all the wavetables in parallel and then use a threshold detector and a product at each wavetable output, finally sending all of these parallel streams to a mixer. The threshold would be comparing a control signal and its output (1 or 0) multiplies the result of the wavetable readout. But in effect, I need a 2-dimensional control. The audio samples feeding the wavetables is the first dimension, and the control signal selecting a particular wavetable is the second dimension. The parallel threshold idea is okay for just a few wavetables, but what if I need 30 or more? I think the Kyma/Capy will run out of gas at such a large number of thresholded wavetable elements. Any suggestions? - DM IP: Logged |
David McClain Member |
![]() ![]() ![]() I just thought of another way... If the wavetables don't need really fine resolution then we could pack, say 256 element tables, into one 4096 element wavetable. Then the control signal (nonlinear input to the MultiplyingWavetable) could be scaled down to (0,1/16) and could have an offset added in stepped sequence so that as the controller steps along, the wavetable is directed to use one of the 16 subtables. - DM IP: Logged |
David McClain Member |
![]() ![]() ![]() Another neat thing to have would be a collection of "digital" operators, as opposed to "audio" operators. These would be things like tapped delay lines, flip-flops, shift registers, etc. These would have 0 and 1 values for control purposes. You could make some killer sequencers with this collection applied to control signals. - DM IP: Logged |
pete Member |
![]() ![]() ![]() Hi David With regard to your lower resolution multi split (16 sub tables) idea. If you had a referance pointer that was not limited to the 16 steps but could point to imaginary tables between the steps. I wonder if you could then double up on the whole circuit, such that one circuit outputs a signal from the sub table just below the desired ref, and the other giveing an output from the sub table just above the desired ref. Then by interpolating between the two outputs at a ratio of (ref - lower table) : (upper table - ref), you could smooth out the gaps between the 16 tables. To save on all the amplifing,clipping and subtracting needed to derive the ratio , maybe this could be done with yet another table that contained 16 cycles of a sawtooth waveform. Subtracting this output (devided by 16) from the ref could give the 16 integer steps needed to offset the table pointers. Would it give you the desired effect ? [This message has been edited by pete (edited 27 September 2001).] [This message has been edited by pete (edited 27 September 2001).] IP: Logged |
SSC Administrator |
![]() ![]() ![]() If you place all of the wavetables into one sample, you can use either the Sample or Waveshaper. Using the Sample, constrain the LoopStart and LoopEnd to be multiples of 1/N (where N is the number of wavetables). Using the Waveshaper, use a FullRamp oscillator routed through a ScaleAndOffset as the Index. Then the Scale and Offset can be used to select the wavetable (Scale = 1/N, offset = -1 + (2m/N), where m is the wavetable to play). There are examples of both of these techniques in the Kyma Sound Library: Synthesis-Keyboard Controlled/Multiwave Synthesis KBD.kym and Synthesis-Backgrounds & Pads/Multiwave Synthesis.kym. Also, read the Class Description of GAOscillators. IP: Logged |
dennis Member |
![]() ![]() ![]() David McClain wrote: "Another neat thing to have would be a collection of "digital" operators, as opposed to "audio" operators. These would be things like tapped delay lines, flip-flops, shift registers, etc. These would have 0 and 1 values for control purposes." Dennis writes: What would be really nice would be a kind of execution/control flow de-multiplexer. Many times, I want to have a lot of Sounds in my signal flow diagram, but at any given time, I only need to compute one branch. The particular branch to compute must be chosen at runtime because the branch selection criteria is a hot parameter. It's a real-time performance decision. So I want to "turn-on" execution for exactly one of the branches. Currently, I have to compute all branches then select (via a mixer or similar facility) the desired outcome. While this works, it burns a lot of processor cycles computing unused numbers. I think this also describes your sequenced wavetables, David. Graphically, the "ExecutionSelector" could look sort of like a reverse mixer with multiple output lines. Each output line is a seperate execution branch. A hot parameter would select one of the branches to execute. This would not work with the current Sound Editor, I know, since each Sound generates two signals (which may have the same value for "mono" Sounds). So here are some other implementation ideas: Of course, I don't know if ANY of this is possible. IP: Logged |
pete Member |
![]() ![]() ![]() Dennis sounds interesting. If it downloaded all the branches to the cappy at load time then there would be no gain over doing it with a mixer. But if it would compile all the branches at download time but hold them in the host computer until a switch command took place, then I could see it working but for the situation where a some branches have ram type sample files , which couldn't be downloaded instantainiusly. Which is what would be needed to fullfill Davids wants.
Also these logical modules you were talking about, would they need to be sample rate (48Khz), or control rate (1Khz) ? IP: Logged |
pete Member |
![]() ![]() ![]() Hi Dennis again I've Just looked again at your posting and realized that I'm talking rubbish. Of cause, just because the compiled sound is living in cappy memory dosn't mean that its filling up prossesor time, which is the magic Kyma juice we all crave. The penny drops !! IP: Logged |
David McClain Member |
![]() ![]() ![]() Hey thanks for all the feedback fellas... Several items: 1. I tried the trick of putting multiple wavetables into one big (4096 element) wavetable. And it works... but... it turns out that space is cheaper than time, and the extra cycles that it cost to compute the scaled control value plus a subtable offset pushed the sound over the top of real-time available cycles. It turns out that I have more than enough memory to hold separate wavetables for as many as 30 or more. And simple direct use of these is fastest by far. 2. It appears that the MultiplyingWavetable does not interpolate the control value. That would be a nice feature, making possible the use of shorter, multiple, subtables when time allows. But without interpolation the results are too ratchety... 3. My thoughts about the "digital" effects are for audio rate (i.e., sample rate) control, not the 1 KHz control rate now employed. I need to switch among various branches of Sounds on a sample's notice. Doing these things at control rate is much easier since we have Smalltalk at our disposal. Pete, do I understand you to mean that Wavetables can be arbitrarily large, i.e,. greater than 4096 elements? I had been under the impression that all wavetables in Kyma were always 4096 elements, whether used for Wavetable multiplication or for use as oscillator waveforms. I'll have to try this one out... Cheers, - DM IP: Logged |
SSC Administrator |
![]() ![]() ![]() quote: Use the Waveshaper not the MultiplyingWaveshaper. It can use any sample file as the waveshape and it interpolates! Look at the above-cited examples in the Sound Library to see how to use the Waveshaper as an oscillator. IP: Logged |
dennis Member |
![]() ![]() ![]() Hey, Pete! I'm interested in seeing what you came up with for F-Fs, Gates, etc. Please post them to the Forum or directly to me at dennis@mail.worldserver.com. IP: Logged |
pete Member |
![]() ![]() ![]() Dennis It may take me a bit of time to fish them out but I will find them eventualy. I'm afraid my fileing system just isn't. IP: Logged |
Bill Meadows Member |
![]() ![]() ![]() quote: I am a little surprised that there aren't "AND/OR/INVERT" expressions in Smalltalk. I'd like to do that occassionally myself. Control rate would be o.k., I suppose. There is an "asLogicLevel" message that might fix your 0.9999 problem. IP: Logged |
pete Member |
![]() ![]() ![]() By the way bill ,the 0.99999 problem isn't there at control rate ,it's only a limit of sample rate signals. And in nearly all cases it isn't a problem. The reason I have a problem with the 0.99999, is that I am making use of the fact that signals get clipped at value one(ish) . So by adding two singals that have values one or zero only , I get one or zero at the output which follows the same rules as an OR gate . If I wanted to invert it I would amplify it by minus 1 and offset it by plus 1, but I don't the get exactly zero or exactly one , because of the 0.99999 clipping. An AND gate can be made by multiplying two signals that have values 0 and/or 1, but if the 0 values aren't exactly zero then it doesn't work. When flipflops use feedback paths, this error gets amplified every sample cycle and becomes unusable within half a second. The 0,99999 is not a fault, but I am just trying to use 24 bit limitation to my advantage. But there is no cliping in smalltalk control values and smalltalk has these gate funtions in any case. But I'll let a smalltalk expert tell you about these, as I might get it wrong. IP: Logged |
SSC Administrator |
![]() ![]() ![]() You can find expressions for implementing logic using arithmetic on page 479 of the on-line Kyma manual. 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.