Organic: fix detuning

The detuning scale was incorrectly calculated: instead of measuring in cents as it claims to, it was actually
in 1/100th octaves, so I fixed it so that I set the units to actual cents (1/100 seminote). Then I set the
range to +/-1200 cents and added compat code so that old values get multiplied by 12, to maintain backwards compat.
This commit is contained in:
Vesa
2014-04-29 22:54:42 +03:00
parent dce6a26eb3
commit 63747787e4
2 changed files with 24 additions and 10 deletions

View File

@@ -171,7 +171,7 @@ void organicInstrument::saveSettings( QDomDocument & _doc, QDomElement & _this )
m_osc[i]->m_panModel.saveSettings( _doc, _this, "pan" + is );
m_osc[i]->m_harmModel.saveSettings( _doc, _this, "newharmonic" + is );
m_osc[i]->m_detuneModel.saveSettings( _doc, _this, "detune"
m_osc[i]->m_detuneModel.saveSettings( _doc, _this, "newdetune"
+ is );
m_osc[i]->m_oscModel.saveSettings( _doc, _this, "wavetype"
+ is );
@@ -190,7 +190,14 @@ void organicInstrument::loadSettings( const QDomElement & _this )
{
QString is = QString::number( i );
m_osc[i]->m_volModel.loadSettings( _this, "vol" + is );
m_osc[i]->m_detuneModel.loadSettings( _this, "detune" + is );
if( _this.hasAttribute( "detune" + is ) )
{
m_osc[i]->m_detuneModel.setValue( _this.attribute( "detune" ).toInt() * 12 );
}
else
{
m_osc[i]->m_detuneModel.loadSettings( _this, "newdetune" + is );
}
m_osc[i]->m_panModel.loadSettings( _this, "pan" + is );
m_osc[i]->m_oscModel.loadSettings( _this, "wavetype" + is );
@@ -410,7 +417,8 @@ public:
organicInstrumentView::organicInstrumentView( Instrument * _instrument,
QWidget * _parent ) :
InstrumentView( _instrument, _parent )
InstrumentView( _instrument, _parent ),
m_oscKnobs( NULL )
{
organicInstrument * oi = castModel<organicInstrument>();
@@ -426,6 +434,7 @@ organicInstrumentView::organicInstrumentView( Instrument * _instrument,
m_fx1Knob->setFixedSize( 37, 47 );
m_fx1Knob->setHintText( tr( "Distortion:" ) + " ", QString() );
m_fx1Knob->setObjectName( "fx1Knob" );
m_fx1Knob->setWhatsThis( tr( "The distortion knob adds distortion to the output of the instrument. " ) );
// setup volume-knob
m_volKnob = new organicKnob( this );
@@ -434,6 +443,8 @@ organicInstrumentView::organicInstrumentView( Instrument * _instrument,
m_volKnob->setFixedSize( 37, 47 );
m_volKnob->setHintText( tr( "Volume:" ) + " ", "%" );
m_volKnob->setObjectName( "volKnob" );
m_volKnob->setWhatsThis( tr( "The volume knob controls the volume of the output of the instrument. "
"It is cumulative with the instrument window's volume control. " ) );
// randomise
m_randBtn = new pixmapButton( this, tr( "Randomise" ) );
@@ -442,7 +453,9 @@ organicInstrumentView::organicInstrumentView( Instrument * _instrument,
"randomise_pressed" ) );
m_randBtn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap(
"randomise" ) );
m_randBtn->setWhatsThis( tr( "The randomize button randomizes all knobs except the harmonics,"
"main volume and distortion knobs. ") );
connect( m_randBtn, SIGNAL ( clicked() ),
oi, SLOT( randomiseSettings() ) );
@@ -515,11 +528,10 @@ void organicInstrumentView::modelChanged()
panKnob->setHintText( tr("Osc %1 panning:").arg(
i + 1 ) + " ", "" );
// setup knob for left fine-detuning
// setup knob for fine-detuning
knob * detuneKnob = new organicKnob( this );
detuneKnob->move( x + i * colWidth, y + rowHeight*3 );
detuneKnob->setHintText( tr( "Osc %1 fine detuning "
"left:" ).arg( i + 1 )
detuneKnob->setHintText( tr( "Osc %1 stereo detuning" ).arg( i + 1 )
+ " ", " " +
tr( "cents" ) );
@@ -565,7 +577,7 @@ OscillatorObject::OscillatorObject( Model * _parent, int _index ) :
this, tr( "Osc %1 volume" ).arg( _index + 1 ) ),
m_panModel( DefaultPanning, PanningLeft, PanningRight, 1.0f,
this, tr( "Osc %1 panning" ).arg( _index + 1 ) ),
m_detuneModel( 0.0f, -100.0f, 100.0f, 1.0f,
m_detuneModel( 0.0f, -1200.0f, 1200.0f, 1.0f,
this, tr( "Osc %1 fine detuning left" ).arg( _index + 1 ) )
{
}
@@ -614,10 +626,10 @@ void OscillatorObject::updateVolume()
void OscillatorObject::updateDetuning()
{
m_detuningLeft = powf( 2.0f, organicInstrument::s_harmonics[ static_cast<int>( m_harmModel.value() ) ]
+ (float)m_detuneModel.value() / 100.0f ) /
+ (float)m_detuneModel.value() * CENT ) /
engine::mixer()->processingSampleRate();
m_detuningRight = powf( 2.0f, organicInstrument::s_harmonics[ static_cast<int>( m_harmModel.value() ) ]
- (float)m_detuneModel.value() / 100.0f ) /
- (float)m_detuneModel.value() * CENT ) /
engine::mixer()->processingSampleRate();
}

View File

@@ -69,6 +69,8 @@ const QString WAVEFORM_NAMES[6] = {
"Moog saw wave",
"Exponential wave"
};
const float CENT = 1.0f / 1200.0f;
class OscillatorObject : public Model
{