can someone please explain in simple words how i am supposed to use the pink trombone patch on salt/salt+?
all i can control is the pitch with the fourth knob and a bit the timbre with knob 3, that's it, nothing else shows effect.

are the knobs attenuators for the cv inputs? are they offset to those cv inputs? the buttons, are they trigger ins? salt+ has no effect whatsoever on the pink trombone patch, correct?
where in the actual c++ patch can i SEE what a cv/trigger input/output DOES, i understand the pd patches in that regard but i would like to understand this pink trombone patch please.

i know i am a complete noob but it is a bit frustrating to have almost no simple documentation for these modules.

alt text

ok just to clarify, the blue and red circled knobs have an effect on the patch, red is for pitch and blue for "timbre". the button 2 is on (yellow) from start, when pressed the pitch stabilizes a bit, not randomly changing anymore. that's it, nothing else has an effect on this pink trombone patch. can someone please just verify that this is correct and that i'm not completely wrong here? thanks

Apologies for the late response annd the lack of documentation. The input/output channels are specified at this line and the following https://github.com/BelaPlatform/Bela/blob/master/examples/Salt/pink-trombone/render.cpp#L1393

In short, two knobs on Salt control the base pitch(CV4) and tenseness(CV3) of the oscillator (the x-y positons on the pink bar at the bottom in the original version). The other two knobs on Salt control the "diameter"(CV2) and "index" (CV1) of one touch, equivalent to clicking on the pink curved area in the original. On Salt+, two knobs give the same controls for diameter (CV6) and index(CV5) for another touch. This way you can have the equivalent of multiple touches on which deform the vocal tract. The other pair of knobs on Salt+ controls diameter (Cv8) and index (CV7) of one 'tongue touch', equivalent to moving the tongue in the original.

The oscillator (glottis) is sent out of output audio L. The filter (vocal tract) takes the two audio inputs summed together as its input and sends the output to audio out R. There is one button and respective trigger in to toggle the pitch wobble (as in the original)(T2), and another one to open/close the velum(T1), whose staatus is mirrored by the corresponding LEDs. LED 3 signals the occurrence of an occlusion of the vocal tract.

A basic setup would be to set the diameter of the touches on Salt+ to minimum, so that they have no effect on the sound, patch audio out L into audio in L and off you go.

There are also CV out (CV1) for the pitch, in case you want an external oscillator to track the characteristic pitch wobble.

I have a diagram that hopefully explains all of this better than I just did, but I will only be able to upoad it on Thursday

  • qree replied to this.

    Apologies for the late response annd the lack of documentation. The input/output channels are specified at this line and the following https://github.com/BelaPlatform/Bela/blob/master/examples/Salt/pink-trombone/render.cpp#L1393

    In short, two knobs on Salt control the base pitch(CV4) and tenseness(CV3) of the oscillator (the x-y positons on the pink bar at the bottom in the original version). The other two knobs on Salt control the "diameter"(CV2) and "index" (CV1) of one touch, equivalent to clicking on the pink curved area in the original. On Salt+, two knobs give the same controls for diameter (CV6) and index(CV5) for another touch. This way you can have the equivalent of multiple touches on which deform the vocal tract. The other pair of knobs on Salt+ controls diameter (Cv8) and index (CV7) of one 'tongue touch', equivalent to moving the tongue in the original.

    The oscillator (glottis) is sent out of output audio L. The filter (vocal tract) takes the two audio inputs summed together as its input and sends the output to audio out R. There is one button and respective trigger in to toggle the pitch wobble (as in the original)(T2), and another one to open/close the velum(T1), whose staatus is mirrored by the corresponding LEDs. LED 3 signals the occurrence of an occlusion of the vocal tract.

    A basic setup would be to set the diameter of the touches on Salt+ to minimum, so that they have no effect on the sound, patch audio out L into audio in L and off you go.

    There are also CV out (CV1) for the pitch, in case you want an external oscillator to track the characteristic pitch wobble.

    I have a diagram that hopefully explains all of this better than I just did, but I will only be able to upoad it on Thursday

    giuliomoro patch audio out L into audio in L and off you go.

    wow, ok thanks alot, i would never ever in a million years have figured this out!!
    button two (led 2), eg the pitch wobble is constantly on from start here, it reacts momentarily if pressed but goes back to pitch wobble after letting go. shouldn't it toggle between no wobble and wobble? thanks

    here is an explanatory picture. I am going to add this to the project in the repo as well.

    alt text

    thanks giulio, that's helpful! is there an easy way to re-invert the pitch wobble, so it starts with stable pitch?

    Yes, change this line so that it reads

    		autoWobble = wobbleInput;

    (that is: remove the !). This way it will only wobble if wobbleInput (that is the T2 input) is high (external gate signal or hold-press the button).

    This does not - however - guarantee a stable pitch. In the original, turning off the pitch wobble will cause the pitch to be mostly stable but with small variations around the base note. To turn this "vibrato" off, I think you should set this line to

    vibratoAmount = 0;
    4 months later

    unfortunately setting

    vibratoAmount = 0;
    vibratoFrequency = 0;

    does not remove vibrato completely. it seems to me, that under a certain threshold it does not matter what you set vibratoAmount to. higher values work, but 0 does not eliminate vibrato. vibratoFrequency at 0 does also not eliminate the vibrato. will look into this tomorrow.

    		static SimplexNoise noise;
            sample_t vibrato = 0;
            vibrato += this->vibratoAmount * Math::sin((sample_t)2*Math::PI * this->totalTime *this->vibratoFrequency);
            vibrato += (sample_t)0.02 * noise.simplex1(this->totalTime * 4.07);
            vibrato += (sample_t)0.04 * noise.simplex1(this->totalTime * 2.15);
            if (autoWobble)
            {
    			float autoWobbleVibrato =  0.2 * noise.simplex1(this->totalTime * 0.98);
    			autoWobbleVibrato +=  0.4 * noise.noise(this->totalTime * 0.5);
    			vibrato += autoWobbleVibrato;
            }
    		this->smoothFrequency = this->UIFrequency;
    		/*
    		 * this smoothing is just too smooth , use the above non-smoothing instead.
    		 * Actual smoothing is performed in setupWaveform anyhow
            if (this->UIFrequency>this->smoothFrequency)
                this->smoothFrequency = Math::min(this->smoothFrequency * (sample_t)1.1, this->UIFrequency);
            if (this->UIFrequency<this->smoothFrequency)
                this->smoothFrequency = Math::max(this->smoothFrequency / (sample_t)1.1, this->UIFrequency);
    		*/
            this->oldFrequency = this->newFrequency;
            this->newFrequency = this->smoothFrequency * ((sample_t)1+vibrato);

    you are right, it would seem that there is quite a lot of stuff being added into vibrato. Just remove vibrato from the last line.

      giuliomoro you are right, it would seem that there is quite a lot of stuff being added into vibrato. Just remove vibrato from the last line.

      thanks @giuliomoro i figured that much actually, but good to have it confirmed.

      i had a look at your midi code, and it mostly does nothing in the current state, right? at least most of the cc implementations you made do nothing (cc1 and cc2 and cc16) i successfully enabled midi control though by replacing the analogRead parts with floats i gathered from midi cc.

      regarding your midi implementation, what should this code do? (i assumed moving around a virtual finger in the mouth)

      if(message.getDataByte(0) == 1)
      				{
      					float x = message.getDataByte(1);
      					x = x*4 ;
      					rt_printf("x: %.3f\n", x);
      					t.x = x;
      				}
      
      				// Control change 2 : x
      				if(message.getDataByte(0) == 2)
      				{
      					float y = message.getDataByte(1);
      					y = y*4;
      					rt_printf("y: %.3f\n", y);
      					t.y = y;
      				}

      it does not change the sound here at all :-)

      i am still a bit overwhelmed by the code, so i don't really understand how everything interacts...

        lokki i had a look at your midi code, and it mostly does nothing in the current state, right?

        I think it currently does exactly nothing, because most (all?) the variables set in that first block that handles MIDI are then overridden by the analog/digital inputs in the block

        if(1) 
        	{
        		// handle I/O

        so if you change that if(1) to if(0), then MIDI should work 99 or 100% more.

          giuliomoro ah perfect. i actually changed the code in the if(1) section to make it react to midi