The Micropitch formula device gives you precise control over a sample-based instrument’s tuning, in semitones and cents. It allows you to pitch sounds up and down without the bending sound of the Uxx and Dxx commands.
It requires a bit of setup:
-
Create a modulation set, and add an Operand as a pitch modulator
-
Set an instrument macro to automate the Operand pitch value
-
Add an instrument automation device, and set the Micropitch formula device’s output to the pitch macro
-
If you change the modulation pitch range from its default of 12 semitones, you’ll need to update the formula’s pitchRange() function to match it
Now you have precise, immediate control over the tuning. The micropitch device provides three controls:
-
Semitones
-
Cents
-
Polarity
You can automate them using track effects commands. The formula device converts track effect values to semitone and cents offsets. For example (assuming the Micropitch device is the first in the list):
1104 1203 -- will tune the pitch modulator +4 semitones +3 cents
Any non-zero value for polarity makes it negative:
1104 1203 1310 -- will tune the pitch modulator -4 semitones -3 cents
note: I just worked out the numbers by trial and__error They seem to work just fine… but maybe someone better at math than me can figure out better numbers if needed.
Example project: 7934 micropitch-example.xrns
The formula device code:
<?xml version="1.0" encoding="UTF-8"?><FilterDeviceClipboard doc_version="0">
<DeviceSlot type="FormulaMetaDevice">
<CustomDeviceName>Micropitch</CustomDeviceName>
<IsMaximized>true</IsMaximized>
<IsSelected>true</IsSelected>
<SelectedPresetName>Micropitch</SelectedPresetName>
<SelectedPresetLibrary>User Library</SelectedPresetLibrary>
<SelectedPresetIsModified>false</SelectedPresetIsModified>
<IsActive>
<Value>1.0</Value>
<Visualization>Device only</Visualization>
</IsActive>
<FormulaParagraphs>
<FormulaParagraph>calculatePitch(A, B, C)</FormulaParagraph>
</FormulaParagraphs>
<FunctionsParagraphs>
<FunctionsParagraph>function pitchRange()</FunctionsParagraph>
<FunctionsParagraph> return 12</FunctionsParagraph>
<FunctionsParagraph>end</FunctionsParagraph>
<FunctionsParagraph/>
<FunctionsParagraph>function calculatePitch(semitones, cents, negative)</FunctionsParagraph>
<FunctionsParagraph> local offset = 0.5</FunctionsParagraph>
<FunctionsParagraph> local semiOffset = 0</FunctionsParagraph>
<FunctionsParagraph> local centsOffset = 0</FunctionsParagraph>
<FunctionsParagraph> local polarity = 1</FunctionsParagraph>
<FunctionsParagraph> </FunctionsParagraph>
<FunctionsParagraph> if semitones > 0 then</FunctionsParagraph>
<FunctionsParagraph> semiOffset = semitones * (10.625 / (pitchRange() / 12))</FunctionsParagraph>
<FunctionsParagraph> end</FunctionsParagraph>
<FunctionsParagraph> </FunctionsParagraph>
<FunctionsParagraph> if cents > 0 then</FunctionsParagraph>
<FunctionsParagraph> centsOffset = cents / (9.375 * (pitchRange() / 12))</FunctionsParagraph>
<FunctionsParagraph> end</FunctionsParagraph>
<FunctionsParagraph> </FunctionsParagraph>
<FunctionsParagraph> if negative > 0 then</FunctionsParagraph>
<FunctionsParagraph> polarity = -1</FunctionsParagraph>
<FunctionsParagraph> end</FunctionsParagraph>
<FunctionsParagraph> </FunctionsParagraph>
<FunctionsParagraph> return offset + polarity * (semiOffset + centsOffset)</FunctionsParagraph>
<FunctionsParagraph>end</FunctionsParagraph>
</FunctionsParagraphs>
<InputNameA>Semitones</InputNameA>
<InputNameB>Cents</InputNameB>
<InputNameC>Negative</InputNameC>
<EditorVisible>true</EditorVisible>
<InputA>
<Value>0.0</Value>
<Visualization>Device only</Visualization>
</InputA>
<InputB>
<Value>0.0</Value>
<Visualization>Device only</Visualization>
</InputB>
<InputC>
<Value>0.0</Value>
<Visualization>Device only</Visualization>
</InputC>
<DestTrack>
<Value>1.0</Value>
<Visualization>Device only</Visualization>
</DestTrack>
<DestEffect>
<Value>1.0</Value>
<Visualization>Device only</Visualization>
</DestEffect>
<DestParameter>
<Value>1.0</Value>
<Visualization>Device only</Visualization>
</DestParameter>
</DeviceSlot>
</FilterDeviceClipboard>
(btw how do you do a “spoiler” so it doesn’t show the whole thing?)
SaveSave
SaveSave