<effect>
  <name>vowels</name>
  <enabled>true</enabled>
  <numIns>2</numIns>
  <numOuts>2</numOuts>
  <code>if (&lt;vowelsON&gt; == 1) then
    kJoyX   =	&lt;vowels_JoyX&gt;                                                          ; XY controller
    kJoyY   =	&lt;vowels_JoyY&gt;

    iporttime	=	0.05
    kporttime	linseg	0,.001,iporttime,1,iporttime                            ;PORTAMENTO TIME                                                      
    kx	portk	kJoyX,kporttime
    ky	portk	kJoyY,kporttime

    kBWMlt  =   &lt;vowels_bandwidth&gt;
    ktrig	changed2	&lt;vowels_voice&gt;         
    if ktrig==1 then
	reinit update
    endif                                                                                         

    update:
	ivoice  =  i(&lt;vowels_voice&gt;)

	; FUNCTION TABLES STORING DATA FOR VARIOUS VOICE FORMANTS
	iBFA	ftgentmp	0,  0, 8, -2,	600,	400,	250,	400,	350	;FREQ
	iBFE	ftgentmp	0,  0, 8, -2,	1040,	1620,	1750,	750,	600	;FREQ
	iBFI	ftgentmp	0,  0, 8, -2,	2250,	2400,	2600,	2400,	2400	;FREQ
	iBFO	ftgentmp	0,  0, 8, -2,	2450,	2800,	3050,	2600,	2675	;FREQ
	iBFU	ftgentmp	0,  0, 8, -2,	2750,	3100,	3340,	2900,	2950	;FREQ
	        	
	iBDbA	ftgentmp	0, 0, 8, -2,	0,	0,	0,	0,	0	;dB
	iBDbE	ftgentmp	0, 0, 8, -2,	-7,	-12,	-30,	-11,	-20	;dB
	iBDbI	ftgentmp	0, 0, 8, -2,	-9,	-9,	-16,	-21,	-32	;dB
	iBDbO	ftgentmp	0, 0, 8, -2,	-9,	-12,	-22,	-20,	-28	;dB
	iBDbU	ftgentmp	0, 0, 8, -2,	-20,	-18,	-28,	-40,	-36	;dB
	        	
	iBBWA	ftgentmp	0, 0, 8, -2,	60,	40,	60,	40,	40	;BAND WIDTH
	iBBWE	ftgentmp	0, 0, 8, -2,	70,	80,	90,	80,	80	;BAND WIDTH
	iBBWI	ftgentmp	0, 0, 8, -2,	110,	100,	100,	100,	100	;BAND WIDTH
	iBBWO	ftgentmp	0, 0, 8, -2,	120,	120,	120,	120,	120	;BAND WIDTH
	iBBWU	ftgentmp	0, 0, 8, -2,	130,	120,	120,	120,	120	;BAND WIDTH
	;TENOR  	
	iTFA	ftgentmp	0, 0, 8, -2,	650, 	400,	290,	400,	350	;FREQ
	iTFE	ftgentmp	0, 0, 8, -2,	1080, 	1700,   1870,	800,	600	;FREQ
	iTFI	ftgentmp	0, 0, 8, -2,	2650,	2600,   2800,	2600,	2700	;FREQ
	iTFO	ftgentmp	0, 0, 8, -2,	2900,	3200,   3250,	2800,	2900	;FREQ
	iTFU	ftgentmp	0, 0, 8, -2,	3250,	3580,   3540,	3000,	3300	;FREQ
	        	
	iTDbA	ftgentmp	0, 0, 8, -2,	0,	0,	0,	0,	0	;dB
	iTDbE	ftgentmp	0, 0, 8, -2,	-6,	-14,	-15,	-10,	-20	;dB
	iTDbI	ftgentmp	0, 0, 8, -2,	-7,	-12,	-18,	-12,	-17	;dB
	iTDbO	ftgentmp	0, 0, 8, -2,	-8,	-14,	-20,	-12,	-14	;dB
	iTDbU	ftgentmp	0, 0, 8, -2,	-22,	-20,	-30,	-26,	-26	;dB
	        	
	iTBWA	ftgentmp	0, 0, 8, -2,	80,	70,	40,	40,	40	;BAND WIDTH
	iTBWE	ftgentmp	0, 0, 8, -2,	90,	80,	90,	80,	60	;BAND WIDTH
	iTBWI	ftgentmp	0, 0, 8, -2,	120,	100,	100,	100,	100	;BAND WIDTH
	iTBWO	ftgentmp	0, 0, 8, -2,	130,	120,	120,	120,	120	;BAND WIDTH                                         
	iTBWU	ftgentmp	0, 0, 8, -2,	140,	120,	120,	120,	120	;BAND WIDTH
	;COUNTER TENOR
	iCTFA	ftgentmp	0, 0, 8, -2,	660,	440,	270,	430,	370	;FREQ
	iCTFE	ftgentmp	0, 0, 8, -2,	1120,	1800,	1850,	820,	630	;FREQ
	iCTFI	ftgentmp	0, 0, 8, -2,	2750,	2700,	2900,	2700,	2750	;FREQ
	iCTFO	ftgentmp	0, 0, 8, -2,	3000,	3000,	3350,	3000,	3000	;FREQ
	iCTFU	ftgentmp	0, 0, 8, -2,	3350,	3300,	3590,	3300,	3400	;FREQ
	        	
	iTBDbA	ftgentmp	0, 0, 8, -2,	0,	0,	0,	0,	0	;dB
	iTBDbE	ftgentmp	0, 0, 8, -2,	-6,	-14,	-24,	-10,	-20	;dB
	iTBDbI	ftgentmp	0, 0, 8, -2,	-23,	-18,	-24,	-26,	-23	;dB
	iTBDbO	ftgentmp	0, 0, 8, -2,	-24,	-20,	-36,	-22,	-30	;dB
	iTBDbU	ftgentmp	0, 0, 8, -2,	-38,	-20,	-36,	-34,	-30	;dB
	        	
	iTBWA	ftgentmp	0, 0, 8, -2,	80,	70,	40,	40,	40	;BAND WIDTH
	iTBWE	ftgentmp	0, 0, 8, -2,	90,	80,	90,	80,	60	;BAND WIDTH
	iTBWI	ftgentmp	0, 0, 8, -2,	120,	100,	100,	100,	100	;BAND WIDTH
	iTBWO	ftgentmp	0, 0, 8, -2,	130,	120,	120,	120,	120	;BAND WIDTH
	iTBWU	ftgentmp	0, 0, 8, -2,	140,	120,	120,	120,	120	;BAND WIDTH
	;ALTO   	
	iAFA	ftgentmp	0, 0, 8, -2,	800,	400,	350,	450,	325	;FREQ
	iAFE	ftgentmp	0, 0, 8, -2,	1150,	1600,	1700,	800,	700	;FREQ
	iAFI	ftgentmp	0, 0, 8, -2,	2800,	2700,	2700,	2830,	2530	;FREQ
	iAFO	ftgentmp	0, 0, 8, -2,	3500,	3300,	3700,	3500,	2500	;FREQ
	iAFU	ftgentmp	0, 0, 8, -2,	4950,	4950,	4950,	4950,	4950	;FREQ
	        	
	iADbA	ftgentmp	0, 0, 8, -2,	0,	0,	0,	0,	0	;dB
	iADbE	ftgentmp	0, 0, 8, -2,	-4,	-24,	-20,	-9,	-12	;dB
	iADbI	ftgentmp	0, 0, 8, -2,	-20,	-30,	-30,	-16,	-30	;dB
	iADbO	ftgentmp	0, 0, 8, -2,	-36,	-35,	-36,	-28,	-40	;dB
	iADbU	ftgentmp	0, 0, 8, -2,	-60,	-60,	-60,	-55,	-64	;dB
	        	
	iABWA	ftgentmp	0, 0, 8, -2,	50,	60,	50,	70,	50	;BAND WIDTH
	iABWE	ftgentmp	0, 0, 8, -2,	60,	80,	100,	80,	60	;BAND WIDTH
	iABWI	ftgentmp	0, 0, 8, -2,	170,	120,	120,	100,	170	;BAND WIDTH
	iABWO	ftgentmp	0, 0, 8, -2,	180,	150,	150,	130,	180	;BAND WIDTH
	iABWU	ftgentmp	0, 0, 8, -2,	200,	200,	200,	135,	200	;BAND WIDTH
	;SOPRANO
	iSFA	ftgentmp	0, 0, 8, -2,	800,	350,	270,	450,	325	;FREQ
	iSFE	ftgentmp	0, 0, 8, -2,	1150,	2000,	2140,	800,	700	;FREQ
	iSFI	ftgentmp	0, 0, 8, -2,	2900,	2800,	2950,	2830,	2700	;FREQ
	iSFO	ftgentmp	0, 0, 8, -2,	3900,	3600,	3900,	3800,	3800	;FREQ
	iSFU	ftgentmp	0, 0, 8, -2,	4950,	4950,	4950,	4950,	4950	;FREQ
	        	
	iSDbA	ftgentmp	0, 0, 8, -2,	0,	0,	0,	0,	0	;dB
	iSDbE	ftgentmp	0, 0, 8, -2,	-6,	-20,	-12,	-11,	-16	;dB
	iSDbI	ftgentmp	0, 0, 8, -2,	-32,	-15,	-26,	-22,	-35	;dB
	iSDbO	ftgentmp	0, 0, 8, -2,	-20,	-40,	-26,	-22,	-40	;dB
	iSDbU	ftgentmp	0, 0, 8, -2,	-50,	-56,	-44,	-50,	-60	;dB
	        	
	iSBWA	ftgentmp	0, 0, 8, -2,	80,	60,	60,	70,	50	;BAND WIDTH
	iSBWE	ftgentmp	0, 0, 8, -2,	90,	90,	90,	80,	60	;BAND WIDTH
	iSBWI	ftgentmp	0, 0, 8, -2,	120,	100,	100,	100,	170	;BAND WIDTH
	iSBWO	ftgentmp	0, 0, 8, -2,	130,	150,	120,	130,	180	;BAND WIDTH
	iSBWU	ftgentmp	0, 0, 8, -2,	140,	200,	120,	135,	200	;BAND WIDTH
	
	;A TEXT MACRO IS DEFINED THAT WILL BE THE CODE FOR DERIVING DATA FOR EACH FORMANT. A MACRO IS USED TO AVOID HAVING TO USING CODE REPETITION AND TO EASIER FACICLITATE CODE MODIFICATION
#define	FORMANT_DATA(N)	
	#
	kfreq$N._U	tablei	kx*2, iBFA+(ivoice*15)+$N-1			; READ DATA FOR FREQUENCY (UPPER EDGE OF PANEL)
	kfreq$N._L	tablei	(1-kx)+3, iBFA+(ivoice*15)+$N-1			; READ DATA FOR FREQUENCY (LOWER EDGE OF PANEL)
	kfreq$N		ntrpol	kfreq$N._L, kfreq$N._U, ky			; INTERPOLATE BETWEEN UPPER VALUE AND LOWER VALUE (DETERMINED BY Y-LOCATION ON PANEL)                          
	kdbamp$N._U	tablei	kx*2, iBDbA+(ivoice*15)+$N-1			; READ DATA FOR INTENSITY (UPPER EDGE OF PANEL)                                      
	kdbamp$N._L	tablei	(1-kx)+3, iBDbA+(ivoice*15)+$N-1		; READ DATA FOR INTENSITY (LOWER EDGE OF PANEL)                                      
	kdbamp$N	ntrpol	kdbamp$N._L, kdbamp$N._U, ky                   	; INTERPOLATE BETWEEN UPPER VALUE AND LOWER VALUE (DETERMINED BY Y-LOCATION ON PANEL)
	kbw$N._U	tablei	kx*2, iBBWA+(ivoice*15)+$N-1			; READ DATA FOR BANDWIDTH (UPPER EDGE OF PANEL)                                      
	kbw$N._L	tablei	(1-kx)+3, iBBWA+(ivoice*15)+$N-1		; READ DATA FOR BANDWIDTH (LOWER EDGE OF PANEL)                                      
	kbw$N		ntrpol	kbw$N._L, kbw$N._U, ky				; INTERPOLATE BETWEEN UPPER VALUE AND LOWER VALUE (DETERMINED BY Y-LOCATION ON PANEL)
	#												;END OF MACRO!
;print iBFA+(ivoice*15)+$N-1
;READING DATA FOR FORMANTS (MACROS IMPLEMENTED)
	$FORMANT_DATA(1)
	$FORMANT_DATA(2)
	$FORMANT_DATA(3)
	$FORMANT_DATA(4)
	$FORMANT_DATA(5)

;left channel
	aBPF1	butbp	ain1, kfreq1, kbw1*kBWMlt                               ;FORMANT 1
	aBPF2	butbp	ain1, kfreq2, kbw1*kBWMlt                               ;FORMANT 2
	aBPF3	butbp	ain1, kfreq3, kbw1*kBWMlt                               ;FORMANT 3
	aBPF4	butbp	ain1, kfreq4, kbw1*kBWMlt                               ;FORMANT 4
	aBPF5	butbp	ain1, kfreq5, kbw1*kBWMlt                               ;FORMANT 5
;right channel
	aBPF6	butbp	ain2, kfreq1, kbw1*kBWMlt                               ;FORMANT 1
	aBPF7	butbp	ain2, kfreq2, kbw1*kBWMlt                               ;FORMANT 2
	aBPF8	butbp	ain2, kfreq3, kbw1*kBWMlt                               ;FORMANT 3
	aBPF9	butbp	ain2, kfreq4, kbw1*kBWMlt                               ;FORMANT 4
	aBPF10	butbp	ain2, kfreq5, kbw1*kBWMlt                               ;FORMANT 5
	
	;FORMANTS ARE MIXED AND MULTIPLIED BOTH BY INTENSITY VALUES DERIVED FROM TABLES 
	aout1	sum	aBPF1*(ampdbfs(kdbamp1)),aBPF2*(ampdbfs(kdbamp2)),aBPF3*(ampdbfs(kdbamp3)),aBPF4*(ampdbfs(kdbamp4)),aBPF5*(ampdbfs(kdbamp5))
	aout2	sum	aBPF6*(ampdbfs(kdbamp1)),aBPF7*(ampdbfs(kdbamp2)),aBPF8*(ampdbfs(kdbamp3)),aBPF9*(ampdbfs(kdbamp4)),aBPF10*(ampdbfs(kdbamp5))
	rireturn

    aout1 ntrpol ain1, aout1*8, &lt;vowels_Mix&gt;                                    ;mix direct/wet, amplify wet
    aout2 ntrpol ain2, aout2*8, &lt;vowels_Mix&gt;
else
    aout1   =   ain1
    aout2   =   ain2
endif</code>
  <comments>
DESCRIPTION:

a port for Blue effects, originally written as a UDO by Iain McCurdy, 2012.
The filters imitate the 5 vowels A, E, I, U and O - giving the incoming stereo signal a voice :)


CONTROLLERS:

ON/OFF          -       bypass
A, E, I, U, O   -       formant band approahing those vowels characteristcs
Drowpdown List  -       Bass, Tenor, Counter Tenor, Alto, Soprano 
bandwith        -       Bandwidth of the bandpass and bandreject filters
mix             -       mix direct signal with effect

---

version 1.02, July 2020
- added BSB information comments

version 1.01, May 2020
- added comments on controllers

version 1.0, JulY 2019
- initial version adapted for blue by Menno Knevel, originally written as a UDO by Iain McCurdy, 2012.

</comments>
  <opcodeList/>
  <graphicInterface editEnabled='false'>
    <gridSettings>
      <width>5</width>
      <height>5</height>
      <gridStyle>DOT</gridStyle>
      <snapGridEnabled>true</snapGridEnabled>
    </gridSettings>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBGroup'>
      <objectName></objectName>
      <x>0</x>
      <y>0</y>
      <groupName>Group</groupName>
      <backgroundColor>0x00000033</backgroundColor>
      <borderColor>0x000000ff</borderColor>
      <labelTextColor>0xffffffff</labelTextColor>
      <titleEnabled>true</titleEnabled>
      <width>20</width>
      <height>20</height>
      <bsbObject type='blue.orchestra.blueSynthBuilder.BSBCheckBox'>
        <objectName>vowelsON</objectName>
        <x>0</x>
        <y>0</y>
        <comment>bypass</comment>
        <automationAllowed>true</automationAllowed>
        <label/>
        <selected>true</selected>
        <randomizable>true</randomizable>
      </bsbObject>
      <bsbObject type='blue.orchestra.blueSynthBuilder.BSBGroup'>
        <objectName></objectName>
        <x>10</x>
        <y>10</y>
        <groupName>Group</groupName>
        <backgroundColor>0x4d8080ff</backgroundColor>
        <borderColor>0x000000ff</borderColor>
        <labelTextColor>0xffffffff</labelTextColor>
        <titleEnabled>false</titleEnabled>
        <width>20</width>
        <height>20</height>
        <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
          <objectName>vowels_bandwidth</objectName>
          <x>130</x>
          <y>55</y>
          <comment>Bandwidth of the bandpass and bandreject filters</comment>
          <automationAllowed>true</automationAllowed>
          <minimum>0.0</minimum>
          <maximum>2.0</maximum>
          <value>1.0</value>
          <knobWidth>40</knobWidth>
          <randomizable>true</randomizable>
          <valueDisplayEnabled>true</valueDisplayEnabled>
          <label>bandwidth</label>
          <labelEnabled>true</labelEnabled>
          <font>
            <name>System Regular</name>
            <size>12.0</size>
          </font>
        </bsbObject>
        <bsbObject type='blue.orchestra.blueSynthBuilder.BSBDropdown' version='2'>
          <objectName>vowels_voice</objectName>
          <x>130</x>
          <y>15</y>
          <comment>Bass, Tenor, Counter Tenor, Alto, Soprano</comment>
          <automationAllowed>true</automationAllowed>
          <selectedIndex>0</selectedIndex>
          <fontSize>12</fontSize>
          <randomizable>true</randomizable>
          <bsbDropdownItemList>
            <bsbDropdownItem uniqueId='-254202558'>
              <name>Bass</name>
              <value>0</value>
            </bsbDropdownItem>
            <bsbDropdownItem uniqueId='-254202557'>
              <name>Tenor</name>
              <value>1</value>
            </bsbDropdownItem>
            <bsbDropdownItem uniqueId='-254202556'>
              <name>Counter Tenor</name>
              <value>2</value>
            </bsbDropdownItem>
            <bsbDropdownItem uniqueId='-254202555'>
              <name>Alto</name>
              <value>3</value>
            </bsbDropdownItem>
            <bsbDropdownItem uniqueId='-254202554'>
              <name>Soprano</name>
              <value>4</value>
            </bsbDropdownItem>
          </bsbDropdownItemList>
        </bsbObject>
        <bsbObject type='blue.orchestra.blueSynthBuilder.BSBVSlider' version='2'>
          <objectName>vowels_Mix</objectName>
          <x>205</x>
          <y>70</y>
          <comment>mix direct signal with effect</comment>
          <automationAllowed>true</automationAllowed>
          <minimum>0.0</minimum>
          <maximum>1.0</maximum>
          <bdresolution>0.01</bdresolution>
          <value>1.0</value>
          <sliderHeight>50</sliderHeight>
          <randomizable>true</randomizable>
          <valueDisplayEnabled>false</valueDisplayEnabled>
        </bsbObject>
        <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel' version='2'>
          <objectName></objectName>
          <x>10</x>
          <y>10</y>
          <label>A</label>
          <font>
            <name>System Bold</name>
            <size>20.0</size>
          </font>
        </bsbObject>
        <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel' version='2'>
          <objectName></objectName>
          <x>95</x>
          <y>115</y>
          <label>O</label>
          <font>
            <name>System Bold</name>
            <size>20.0</size>
          </font>
        </bsbObject>
        <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel' version='2'>
          <objectName></objectName>
          <x>100</x>
          <y>10</y>
          <label>I</label>
          <font>
            <name>System Bold</name>
            <size>20.0</size>
          </font>
        </bsbObject>
        <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel' version='2'>
          <objectName></objectName>
          <x>10</x>
          <y>115</y>
          <label>U</label>
          <font>
            <name>System Bold</name>
            <size>20.0</size>
          </font>
        </bsbObject>
        <bsbObject type='blue.orchestra.blueSynthBuilder.BSBXYController' version='2'>
          <objectName>vowels_Joy</objectName>
          <x>10</x>
          <y>35</y>
          <comment>formant band approahing those vowels characteristcs</comment>
          <automationAllowed>true</automationAllowed>
          <width>100</width>
          <height>80</height>
          <xMin>0.0</xMin>
          <xMax>1.0</xMax>
          <yMin>0.0</yMin>
          <yMax>1.0</yMax>
          <xValue>0.53</xValue>
          <yValue>0.5875</yValue>
          <randomizable>true</randomizable>
          <valueDisplayEnabled>false</valueDisplayEnabled>
        </bsbObject>
        <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel' version='2'>
          <objectName></objectName>
          <x>210</x>
          <y>55</y>
          <label>mix</label>
          <font>
            <name>System Regular</name>
            <size>12.0</size>
          </font>
        </bsbObject>
        <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel' version='2'>
          <objectName></objectName>
          <x>55</x>
          <y>10</y>
          <label>E</label>
          <font>
            <name>System Bold</name>
            <size>20.0</size>
          </font>
        </bsbObject>
      </bsbObject>
    </bsbObject>
  </graphicInterface>
  <parameterList>
    <parameter uniqueId='-254202552' name='vowels_bandwidth' label='' min='0.0' max='2.0' bdresolution='-1' automationEnabled='false' value='1.0'>
      <line name='' version='2' max='2.0' min='0.0' bdresolution='-1' color='-8355712' rightBound='false' endPointsLinked='false'>
        <linePoint x='0.0' y='1.0'/>
      </line>
    </parameter>
    <parameter uniqueId='-254202550' name='vowels_JoyX' label='' min='0.0' max='1.0' bdresolution='-1' automationEnabled='false' value='0.53'>
      <line name='' version='2' max='1.0' min='0.0' bdresolution='-1' color='-8355712' rightBound='false' endPointsLinked='false'>
        <linePoint x='0.0' y='0.53'/>
      </line>
    </parameter>
    <parameter uniqueId='-254202548' name='vowels_JoyY' label='' min='0.0' max='1.0' bdresolution='-1' automationEnabled='false' value='0.5875'>
      <line name='' version='2' max='1.0' min='0.0' bdresolution='-1' color='-8355712' rightBound='false' endPointsLinked='false'>
        <linePoint x='0.0' y='0.5875'/>
      </line>
    </parameter>
    <parameter uniqueId='-254202546' name='vowels_Mix' label='' min='0.0' max='1.0' bdresolution='0.01' automationEnabled='false' value='1.0'>
      <line name='' version='2' max='1.0' min='0.0' bdresolution='0.01' color='-8355712' rightBound='false' endPointsLinked='false'>
        <linePoint x='0.0' y='1.0'/>
      </line>
    </parameter>
    <parameter uniqueId='-254202544' name='vowels_voice' label='' min='0.0' max='4.0' bdresolution='1' automationEnabled='false' value='0.0'>
      <line name='' version='2' max='4.0' min='0.0' bdresolution='1' color='-8355712' rightBound='false' endPointsLinked='false'>
        <linePoint x='0.0' y='0.0'/>
      </line>
    </parameter>
    <parameter uniqueId='-254202542' name='vowelsON' label='' min='0.0' max='1.0' bdresolution='1' automationEnabled='false' value='1.0'>
      <line name='' version='2' max='1.0' min='0.0' bdresolution='1' color='-8355712' rightBound='false' endPointsLinked='false'>
        <linePoint x='0.0' y='1.0'/>
      </line>
    </parameter>
  </parameterList>
</effect>