Merge branch 'stable-1.1'

Conflicts:
	include/basic_filters.h
	src/core/FxMixer.cpp
This commit is contained in:
Vesa
2014-06-28 17:24:23 +03:00
22 changed files with 584 additions and 355 deletions

View File

@@ -142,7 +142,7 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf )
if( mod##_e1 != 0.0f ) car += m_env1_buf[f] * mod##_e1; \
if( mod##_e2 != 0.0f ) car += m_env2_buf[f] * mod##_e2; \
if( mod##_l1 != 0.0f ) car += m_lfo1_buf[f] * mod##_l1; \
if( mod##_l2 != 0.0f ) car += m_lfo2_buf[f] * mod##_l2;
if( mod##_l2 != 0.0f ) car += m_lfo2_buf[f] * mod##_l2;
#define modulatephs( car, mod ) \
if( mod##_e1 != 0.0f ) car += m_env1_buf[f] * mod##_e1; \
@@ -1673,12 +1673,29 @@ MonstroView::MonstroView( Instrument * _instrument,
m_opViewButton -> setActiveGraphic( PLUGIN_NAME::getIconPixmap( "opview_active" ) );
m_opViewButton -> setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "opview_inactive" ) );
toolTip::add( m_opViewButton, tr( "Operators view" ) );
m_opViewButton -> setWhatsThis( tr( "The Operators view contains all the operators. These include both audible "
"operators (oscillators) and inaudible operators, or modulators: "
"Low-frequency oscillators and Envelopes. "
"Knobs and other widgets in the Operators view have their own what's this -texts, "
"so you can get more specific help for them that way. " ) );
pixmapButton * m_matViewButton = new pixmapButton( this, NULL );
m_matViewButton -> move( 125,0 );
m_matViewButton -> setActiveGraphic( PLUGIN_NAME::getIconPixmap( "matview_active" ) );
m_matViewButton -> setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "matview_inactive" ) );
toolTip::add( m_matViewButton, tr( "Matrix view" ) );
m_matViewButton -> setWhatsThis( tr( "The Matrix view contains the modulation matrix. Here you can define "
"the modulation relationships between the various operators: Each "
"audible operator (oscillators 1-3) has 3-4 properties that can be "
"modulated by any of the modulators. Using more modulations consumes "
"more CPU power. "
"The view is divided to modulation targets, grouped by the target oscillator. "
"Available targets are volume, pitch, phase, pulse width and sub-osc ratio. "
"Note: some targets are specific to one oscillator only. "
"Each modulation target has 4 knobs, one for each modulator. By default "
"the knobs are at 0, which means no modulation. Turning a knob to 1 causes "
"that modulator to affect the modulation target as much as possible. Turning "
"it to -1 does the same, but the modulation is inversed. " ) );
m_selectedViewGroup = new automatableButtonGroup( this );
m_selectedViewGroup -> addButton( m_opViewButton );
@@ -1850,7 +1867,7 @@ QWidget * MonstroView::setupOperatorsView( QWidget * _parent )
makeknob( m_osc1VolKnob, KNOBCOL1, O1ROW, "Volume", "%", "osc1Knob" )
makeknob( m_osc1PanKnob, KNOBCOL2, O1ROW, "Panning", "", "osc1Knob" )
makeknob( m_osc1CrsKnob, KNOBCOL3, O1ROW, "Coarse detune", " seminotes", "osc1Knob" )
makeknob( m_osc1CrsKnob, KNOBCOL3, O1ROW, "Coarse detune", " semitones", "osc1Knob" )
makeknob( m_osc1FtlKnob, KNOBCOL4, O1ROW, "Finetune left", " cents", "osc1Knob" )
makeknob( m_osc1FtrKnob, KNOBCOL5, O1ROW, "Finetune right", " cents", "osc1Knob" )
makeknob( m_osc1SpoKnob, KNOBCOL6, O1ROW, "Stereo phase offset", " deg", "osc1Knob" )
@@ -1863,7 +1880,7 @@ QWidget * MonstroView::setupOperatorsView( QWidget * _parent )
makeknob( m_osc2VolKnob, KNOBCOL1, O2ROW, "Volume", "%", "osc2Knob" )
makeknob( m_osc2PanKnob, KNOBCOL2, O2ROW, "Panning", "", "osc2Knob" )
makeknob( m_osc2CrsKnob, KNOBCOL3, O2ROW, "Coarse detune", " seminotes", "osc2Knob" )
makeknob( m_osc2CrsKnob, KNOBCOL3, O2ROW, "Coarse detune", " semitones", "osc2Knob" )
makeknob( m_osc2FtlKnob, KNOBCOL4, O2ROW, "Finetune left", " cents", "osc2Knob" )
makeknob( m_osc2FtrKnob, KNOBCOL5, O2ROW, "Finetune right", " cents", "osc2Knob" )
makeknob( m_osc2SpoKnob, KNOBCOL6, O2ROW, "Stereo phase offset", " deg", "osc2Knob" )
@@ -1879,7 +1896,7 @@ QWidget * MonstroView::setupOperatorsView( QWidget * _parent )
makeknob( m_osc3VolKnob, KNOBCOL1, O3ROW, "Volume", "%", "osc3Knob" )
makeknob( m_osc3PanKnob, KNOBCOL2, O3ROW, "Panning", "", "osc3Knob" )
makeknob( m_osc3CrsKnob, KNOBCOL3, O3ROW, "Coarse detune", " seminotes", "osc3Knob" )
makeknob( m_osc3CrsKnob, KNOBCOL3, O3ROW, "Coarse detune", " semitones", "osc3Knob" )
makeknob( m_osc3SpoKnob, KNOBCOL4, O3ROW, "Stereo phase offset", " deg", "osc3Knob" )
makeknob( m_osc3SubKnob, KNOBCOL5, O3ROW, "Sub-osc mix", "", "osc3Knob" )
@@ -1957,6 +1974,130 @@ QWidget * MonstroView::setupOperatorsView( QWidget * _parent )
m_o23ModGroup-> addButton( m_fmButton );
m_o23ModGroup-> addButton( m_pmButton );
////////////////////////////////////
// //
// whatsthis-information strings //
// //
////////////////////////////////////
m_osc1CrsKnob -> setWhatsThis( tr( "The CRS knob changes the tuning of oscillator 1 in semitone steps. " ) );
m_osc2CrsKnob -> setWhatsThis( tr( "The CRS knob changes the tuning of oscillator 2 in semitone steps. " ) );
m_osc3CrsKnob -> setWhatsThis( tr( "The CRS knob changes the tuning of oscillator 3 in semitone steps. " ) );
m_osc1FtlKnob -> setWhatsThis( tr( "FTL and FTR change the finetuning of the oscillator for left and right "
"channels respectively. These can add stereo-detuning to the oscillator "
"which widens the stereo image and causes an illusion of space. " ) );
m_osc1FtrKnob -> setWhatsThis( tr( "FTL and FTR change the finetuning of the oscillator for left and right "
"channels respectively. These can add stereo-detuning to the oscillator "
"which widens the stereo image and causes an illusion of space. " ) );
m_osc2FtlKnob -> setWhatsThis( tr( "FTL and FTR change the finetuning of the oscillator for left and right "
"channels respectively. These can add stereo-detuning to the oscillator "
"which widens the stereo image and causes an illusion of space. " ) );
m_osc2FtrKnob -> setWhatsThis( tr( "FTL and FTR change the finetuning of the oscillator for left and right "
"channels respectively. These can add stereo-detuning to the oscillator "
"which widens the stereo image and causes an illusion of space. " ) );
m_osc1SpoKnob -> setWhatsThis( tr( "The SPO knob modifies the difference in phase between left and right "
"channels. Higher difference creates a wider stereo image. " ) );
m_osc2SpoKnob -> setWhatsThis( tr( "The SPO knob modifies the difference in phase between left and right "
"channels. Higher difference creates a wider stereo image. " ) );
m_osc3SpoKnob -> setWhatsThis( tr( "The SPO knob modifies the difference in phase between left and right "
"channels. Higher difference creates a wider stereo image. " ) );
m_osc1PwKnob -> setWhatsThis( tr( "The PW knob controls the pulse width, also known as duty cycle, "
"of oscillator 1. Oscillator 1 is a digital pulse wave oscillator, "
"it doesn't produce bandlimited output, which means that you can "
"use it as an audible oscillator but it will cause aliasing. You can "
"also use it as an inaudible source of a sync signal, which can be "
"used to synchronize oscillators 2 and 3. " ) );
m_osc1SSRButton -> setWhatsThis( tr( "Send Sync on Rise: When enabled, the Sync signal is sent every time "
"the state of oscillator 1 changes from low to high, ie. when the amplitude "
"changes from -1 to 1. "
"Oscillator 1's pitch, phase and pulse width may affect the timing of syncs, "
"but its volume has no effect on them. Sync signals are sent independently "
"for both left and right channels. " ) );
m_osc1SSFButton -> setWhatsThis( tr( "Send Sync on Fall: When enabled, the Sync signal is sent every time "
"the state of oscillator 1 changes from high to low, ie. when the amplitude "
"changes from 1 to -1. "
"Oscillator 1's pitch, phase and pulse width may affect the timing of syncs, "
"but its volume has no effect on them. Sync signals are sent independently "
"for both left and right channels. " ) );
m_osc2SyncHButton -> setWhatsThis( tr( "Hard sync: Every time the oscillator receives a sync signal from oscillator 1, "
"its phase is reset to 0 + whatever its phase offset is. " ) );
m_osc3SyncHButton -> setWhatsThis( tr( "Hard sync: Every time the oscillator receives a sync signal from oscillator 1, "
"its phase is reset to 0 + whatever its phase offset is. " ) );
m_osc2SyncRButton -> setWhatsThis( tr( "Reverse sync: Every time the oscillator receives a sync signal from oscillator 1, "
"the amplitude of the oscillator gets inverted. " ) );
m_osc3SyncRButton -> setWhatsThis( tr( "Reverse sync: Every time the oscillator receives a sync signal from oscillator 1, "
"the amplitude of the oscillator gets inverted. " ) );
m_osc2WaveBox -> setWhatsThis( tr( "Choose waveform for oscillator 2. " ) );
m_osc3Wave1Box -> setWhatsThis( tr( "Choose waveform for oscillator 3's first sub-osc. "
"Oscillator 3 can smoothly interpolate between two different waveforms. " ) );
m_osc3Wave2Box -> setWhatsThis( tr( "Choose waveform for oscillator 3's second sub-osc. "
"Oscillator 3 can smoothly interpolate between two different waveforms. " ) );
m_osc3SubKnob -> setWhatsThis( tr( "The SUB knob changes the mixing ratio of the two sub-oscs of oscillator 3. "
"Each sub-osc can be set to produce a different waveform, and oscillator 3 "
"can smoothly interpolate between them. All incoming modulations to oscillator 3 are applied "
"to both sub-oscs/waveforms in the exact same way. " ) );
m_mixButton -> setWhatsThis( tr( "In addition to dedicated modulators, Monstro allows oscillator 3 to be modulated by "
"the output of oscillator 2. "
"Mix mode means no modulation: the outputs of the oscillators are simply mixed together. " ) );
m_amButton -> setWhatsThis( tr( "In addition to dedicated modulators, Monstro allows oscillator 3 to be modulated by "
"the output of oscillator 2. "
"AM means amplitude modulation: Oscillator 3's amplitude (volume) is modulated by oscillator 2. " ) );
m_fmButton -> setWhatsThis( tr( "In addition to dedicated modulators, Monstro allows oscillator 3 to be modulated by "
"the output of oscillator 2. "
"FM means frequency modulation: Oscillator 3's frequency (pitch) is modulated by oscillator 2. "
"The frequency modulation is implemented as phase modulation, which gives a more stable overall pitch "
"than \"pure\" frequency modulation. " ) );
m_pmButton -> setWhatsThis( tr( "In addition to dedicated modulators, Monstro allows oscillator 3 to be modulated by "
"the output of oscillator 2. "
"PM means phase modulation: Oscillator 3's phase is modulated by oscillator 2. "
"It differs from frequency modulation in that the phase changes are not cumulative. " ) );
m_lfo1WaveBox -> setWhatsThis( tr( "Select the waveform for LFO 1. "
"\"Random\" and \"Random smooth\" are special waveforms: "
"they produce random output, where the rate of the LFO controls how often "
"the state of the LFO changes. The smooth version interpolates between these "
"states with cosine interpolation. These random modes can be used to give "
"\"life\" to your presets - add some of that analog unpredictability... " ) );
m_lfo2WaveBox -> setWhatsThis( tr( "Select the waveform for LFO 2. "
"\"Random\" and \"Random smooth\" are special waveforms: "
"they produce random output, where the rate of the LFO controls how often "
"the state of the LFO changes. The smooth version interpolates between these "
"states with cosine interpolation. These random modes can be used to give "
"\"life\" to your presets - add some of that analog unpredictability... " ) );
m_lfo1AttKnob -> setWhatsThis( tr( "Attack causes the LFO to come on gradually from the start of the note. " ) );
m_lfo2AttKnob -> setWhatsThis( tr( "Attack causes the LFO to come on gradually from the start of the note. " ) );
m_lfo1RateKnob -> setWhatsThis( tr( "Rate sets the speed of the LFO, measured in milliseconds per cycle. Can be synced to tempo. " ) );
m_lfo2RateKnob -> setWhatsThis( tr( "Rate sets the speed of the LFO, measured in milliseconds per cycle. Can be synced to tempo. " ) );
m_lfo1PhsKnob -> setWhatsThis( tr( "PHS controls the phase offset of the LFO. " ) );
m_lfo2PhsKnob -> setWhatsThis( tr( "PHS controls the phase offset of the LFO. " ) );
m_env1PreKnob -> setWhatsThis( tr( "PRE, or pre-delay, delays the start of the envelope from the start of the note. 0 means no delay. " ) );
m_env2PreKnob -> setWhatsThis( tr( "PRE, or pre-delay, delays the start of the envelope from the start of the note. 0 means no delay. " ) );
m_env1AttKnob -> setWhatsThis( tr( "ATT, or attack, controls how fast the envelope ramps up at start, measured in milliseconds. "
"A value of 0 means instant. " ) );
m_env2AttKnob -> setWhatsThis( tr( "ATT, or attack, controls how fast the envelope ramps up at start, measured in milliseconds. "
"A value of 0 means instant. " ) );
m_env1HoldKnob -> setWhatsThis( tr( "HOLD controls how long the envelope stays at peak after the attack phase. " ) );
m_env2HoldKnob -> setWhatsThis( tr( "HOLD controls how long the envelope stays at peak after the attack phase. " ) );
m_env1DecKnob -> setWhatsThis( tr( "DEC, or decay, controls how fast the envelope falls off from its peak, measured in milliseconds "
"it would take to go from peak to zero. The actual decay may be shorter if sustain is used. ") );
m_env2DecKnob -> setWhatsThis( tr( "DEC, or decay, controls how fast the envelope falls off from its peak, measured in milliseconds "
"it would take to go from peak to zero. The actual decay may be shorter if sustain is used. ") );
m_env1SusKnob -> setWhatsThis( tr( "SUS, or sustain, controls the sustain level of the envelope. The decay phase will not go below this level "
"as long as the note is held. " ) );
m_env2SusKnob -> setWhatsThis( tr( "SUS, or sustain, controls the sustain level of the envelope. The decay phase will not go below this level "
"as long as the note is held. " ) );
m_env1RelKnob -> setWhatsThis( tr( "REL, or release, controls how long the release is for the note, measured in how long it would take to "
"fall from peak to zero. Actual release may be shorter, depending on at what phase the note is released. ") );
m_env2RelKnob -> setWhatsThis( tr( "REL, or release, controls how long the release is for the note, measured in how long it would take to "
"fall from peak to zero. Actual release may be shorter, depending on at what phase the note is released. ") );
m_env1SlopeKnob -> setWhatsThis( tr( "The slope knob controls the curve or shape of the envelope. A value of 0 creates straight rises and falls. "
"Negative values create curves that start slowly, peak quickly and fall of slowly again. "
"Positive values create curves that start and end quickly, and stay longer near the peaks. " ) );
m_env2SlopeKnob -> setWhatsThis( tr( "The slope knob controls the curve or shape of the envelope. A value of 0 creates straight rises and falls. "
"Negative values create curves that start slowly, peak quickly and fall of slowly again. "
"Positive values create curves that start and end quickly, and stay longer near the peaks. " ) );
return( view );
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 367 B

After

Width:  |  Height:  |  Size: 522 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 402 B

After

Width:  |  Height:  |  Size: 599 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 478 B

After

Width:  |  Height:  |  Size: 563 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 333 B

After

Width:  |  Height:  |  Size: 520 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 407 B

After

Width:  |  Height:  |  Size: 500 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 365 B

After

Width:  |  Height:  |  Size: 529 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 398 B

After

Width:  |  Height:  |  Size: 578 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 399 B

After

Width:  |  Height:  |  Size: 468 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 342 B

After

Width:  |  Height:  |  Size: 427 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 393 B

After

Width:  |  Height:  |  Size: 539 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 380 B

After

Width:  |  Height:  |  Size: 602 B