From 78bcb8423f535956d5c6b067658b52cba91f168c Mon Sep 17 00:00:00 2001 From: Vesa Date: Sat, 29 Mar 2014 23:01:44 +0200 Subject: [PATCH 01/11] New instrument... Codename: Monstro. May be subject to a rename later. --- data/themes/default/style.css | 10 + plugins/CMakeLists.txt | 1 + plugins/monstro/CMakeLists.txt | 3 + plugins/monstro/Monstro.cpp | 1594 ++++++++++++++++++++++++++ plugins/monstro/Monstro.h | 593 ++++++++++ plugins/monstro/am_active.png | Bin 0 -> 730 bytes plugins/monstro/am_inactive.png | Bin 0 -> 525 bytes plugins/monstro/artwork_mat.png | Bin 0 -> 61598 bytes plugins/monstro/artwork_op.png | Bin 0 -> 58075 bytes plugins/monstro/exp.png | Bin 0 -> 367 bytes plugins/monstro/fm_active.png | Bin 0 -> 678 bytes plugins/monstro/fm_inactive.png | Bin 0 -> 484 bytes plugins/monstro/logo.png | Bin 0 -> 3335 bytes plugins/monstro/matview_active.png | Bin 0 -> 1992 bytes plugins/monstro/matview_inactive.png | Bin 0 -> 1501 bytes plugins/monstro/mix_active.png | Bin 0 -> 776 bytes plugins/monstro/mix_inactive.png | Bin 0 -> 510 bytes plugins/monstro/moog.png | Bin 0 -> 402 bytes plugins/monstro/noise.png | Bin 0 -> 478 bytes plugins/monstro/opview_active.png | Bin 0 -> 2129 bytes plugins/monstro/opview_inactive.png | Bin 0 -> 1519 bytes plugins/monstro/pm_active.png | Bin 0 -> 724 bytes plugins/monstro/pm_inactive.png | Bin 0 -> 481 bytes plugins/monstro/ramp.png | Bin 0 -> 333 bytes plugins/monstro/saw.png | Bin 0 -> 365 bytes plugins/monstro/sin.png | Bin 0 -> 398 bytes plugins/monstro/sqr.png | Bin 0 -> 342 bytes plugins/monstro/tri.png | Bin 0 -> 380 bytes 28 files changed, 2201 insertions(+) create mode 100644 plugins/monstro/CMakeLists.txt create mode 100644 plugins/monstro/Monstro.cpp create mode 100644 plugins/monstro/Monstro.h create mode 100644 plugins/monstro/am_active.png create mode 100644 plugins/monstro/am_inactive.png create mode 100644 plugins/monstro/artwork_mat.png create mode 100644 plugins/monstro/artwork_op.png create mode 100644 plugins/monstro/exp.png create mode 100644 plugins/monstro/fm_active.png create mode 100644 plugins/monstro/fm_inactive.png create mode 100644 plugins/monstro/logo.png create mode 100644 plugins/monstro/matview_active.png create mode 100644 plugins/monstro/matview_inactive.png create mode 100644 plugins/monstro/mix_active.png create mode 100644 plugins/monstro/mix_inactive.png create mode 100644 plugins/monstro/moog.png create mode 100644 plugins/monstro/noise.png create mode 100644 plugins/monstro/opview_active.png create mode 100644 plugins/monstro/opview_inactive.png create mode 100644 plugins/monstro/pm_active.png create mode 100644 plugins/monstro/pm_inactive.png create mode 100644 plugins/monstro/ramp.png create mode 100644 plugins/monstro/saw.png create mode 100644 plugins/monstro/sin.png create mode 100644 plugins/monstro/sqr.png create mode 100644 plugins/monstro/tri.png diff --git a/data/themes/default/style.css b/data/themes/default/style.css index b68ef0658..bab240bf3 100644 --- a/data/themes/default/style.css +++ b/data/themes/default/style.css @@ -644,6 +644,16 @@ WatsynView knob#xtalkKnob { qproperty-outerColor: #fb50fb; } +MonstroView knob { + color: #ffffff; + qproperty-outerColor: #aaaaaa; + qproperty-outerRadius: 9; + qproperty-innerRadius: 6; + qproperty-centerPointX: 10; + qproperty-centerPointY: 10; + qproperty-lineWidth: 2.5; +} + /* palette information - each colour definition must be on a single line, and the line must begin with "palette:", with no leading whitespace * colour codes MUST be of the form #RRGGBB */ diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index b1247ce18..c5bf9175f 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -12,6 +12,7 @@ ADD_SUBDIRECTORY(LadspaEffect) ADD_SUBDIRECTORY(lb302) #ADD_SUBDIRECTORY(lb303) ADD_SUBDIRECTORY(midi_import) +ADD_SUBDIRECTORY(monstro) ADD_SUBDIRECTORY(organic) ADD_SUBDIRECTORY(opl2) ADD_SUBDIRECTORY(papu) diff --git a/plugins/monstro/CMakeLists.txt b/plugins/monstro/CMakeLists.txt new file mode 100644 index 000000000..6a9195b75 --- /dev/null +++ b/plugins/monstro/CMakeLists.txt @@ -0,0 +1,3 @@ +INCLUDE(BuildPlugin) + +BUILD_PLUGIN(monstro Monstro.cpp Monstro.h MOCFILES Monstro.h EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png") diff --git a/plugins/monstro/Monstro.cpp b/plugins/monstro/Monstro.cpp new file mode 100644 index 000000000..e3b843891 --- /dev/null +++ b/plugins/monstro/Monstro.cpp @@ -0,0 +1,1594 @@ +/* + * Monstro.cpp - a monstrous semi-modular 3-osc synth with modulation matrix + * + * Copyright (c) 2014 Vesa Kivimäki + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + + +#include + +#include "Monstro.h" +#include "engine.h" +#include "InstrumentTrack.h" +#include "templates.h" +#include "gui_templates.h" +#include "tooltip.h" +#include "song.h" +#include "lmms_math.h" + +#include "embed.cpp" + + +extern "C" +{ + +Plugin::Descriptor PLUGIN_EXPORT monstro_plugin_descriptor = +{ + STRINGIFY( PLUGIN_NAME ), + "Monstro", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Monstrous 3-oscillator synth with modulation matrix" ), + "Vesa Kivimäki ", + 0x0100, + Plugin::Instrument, + new PluginPixmapLoader( "logo" ), + NULL, + NULL +} ; + +} + + + + +MonstroSynth::MonstroSynth( MonstroInstrument * _i, NotePlayHandle * _nph, + const sample_rate_t _samplerate, fpp_t _frames ) : + m_parent( _i ), + m_nph( _nph ), + m_samplerate( _samplerate ), + m_fpp( _frames ) +{ + m_env1_buf = new sample_t[_frames]; + m_env2_buf = new sample_t[_frames]; + m_lfo1_buf = new sample_t[_frames]; + m_lfo2_buf = new sample_t[_frames]; + + m_osc1l_phase = 0.0; + m_osc1r_phase = 0.0; + m_osc2l_phase = 0.0; + m_osc2r_phase = 0.0; + m_osc3l_phase = 0.0; + m_osc3r_phase = 0.0; + + m_env1_phase = 0.0; + m_env2_phase = 0.0; +} + + +MonstroSynth::~MonstroSynth() +{ + delete[] m_env1_buf; + delete[] m_env2_buf; + delete[] m_lfo1_buf; + delete[] m_lfo2_buf; + +} + + +void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) +{ +// macros for modulating with env/lfos +#define modulatefreq( car, mod, min, max ) \ + if( mod##_e1 != 0.0 ) car = qBound( min, car * static_cast( fastPow( 2, m_env1_buf[f] * mod##_e1 ) ), max ); \ + if( mod##_e2 != 0.0 ) car = qBound( min, car * static_cast( fastPow( 2, m_env2_buf[f] * mod##_e2 ) ), max ); \ + if( mod##_l1 != 0.0 ) car = qBound( min, car * static_cast( fastPow( 2, m_lfo1_buf[f] * mod##_l1 ) ), max ); \ + if( mod##_l2 != 0.0 ) car = qBound( min, car * static_cast( fastPow( 2, m_lfo2_buf[f] * mod##_l2 ) ), max ); + +#define modulateabs( car, mod, min, max ) \ + if( mod##_e1 != 0.0 ) car = qBound( min, car + mod##_e1 / 2 * m_env1_buf[f], max ); \ + if( mod##_e2 != 0.0 ) car = qBound( min, car + mod##_e2 / 2 * m_env2_buf[f], max ); \ + if( mod##_l1 != 0.0 ) car = qBound( min, car + mod##_l1 / 2 * m_lfo1_buf[f], max ); \ + if( mod##_l2 != 0.0 ) car = qBound( min, car + mod##_l2 / 2 * m_lfo2_buf[f], max ); + +#define modulatevol( car, mod ) \ + if( mod##_e1 > 0.0 ) car = qBound( 0.0f, car * ( 1.0f - mod##_e1 + mod##_e1 * m_env1_buf[f] ), MODCLIP ); \ + if( mod##_e1 < 0.0 ) car = qBound( 0.0f, car * ( 0.0f - mod##_e1 + mod##_e1 * m_env1_buf[f] ), MODCLIP ); \ + if( mod##_e2 > 0.0 ) car = qBound( 0.0f, car * ( 1.0f - mod##_e2 + mod##_e2 * m_env2_buf[f] ), MODCLIP ); \ + if( mod##_e2 < 0.0 ) car = qBound( 0.0f, car * ( 0.0f - mod##_e2 + mod##_e2 * m_env2_buf[f] ), MODCLIP ); \ + if( mod##_l1 != 0.0 ) car = qBound( 0.0f, car * ( 1.0f + mod##_l1 * m_lfo1_buf[f] ), MODCLIP ); \ + if( mod##_l2 != 0.0 ) car = qBound( 0.0f, car * ( 1.0f + mod##_l2 * m_lfo2_buf[f] ), MODCLIP ); + + // pre-render env's and lfo's + renderModulators( _frames ); + + // get updated osc1 values + // get pulse width + const float pw = ( m_parent->m_osc1Pw.value() / 100.0 ); + const float o1pw_e1 = ( m_parent->m_pw1env1.value() ); + const float o1pw_e2 = ( m_parent->m_pw1env2.value() ); + const float o1pw_l1 = ( m_parent->m_pw1lfo1.value() ); + const float o1pw_l2 = ( m_parent->m_pw1lfo2.value() ); + + // get phases + const float o1lpo = m_parent->m_osc1l_po; + const float o1rpo = m_parent->m_osc1r_po; + const float o1p_e1 = ( m_parent->m_phs1env1.value() ); + const float o1p_e2 = ( m_parent->m_phs1env2.value() ); + const float o1p_l1 = ( m_parent->m_phs1lfo1.value() ); + const float o1p_l2 = ( m_parent->m_phs1lfo2.value() ); + + // get pitch + const float o1lfb = ( m_parent->m_osc1l_freq * m_nph->frequency() ); + const float o1rfb = ( m_parent->m_osc1r_freq * m_nph->frequency() ); + const float o1f_e1 = ( m_parent->m_pit1env1.value() ); + const float o1f_e2 = ( m_parent->m_pit1env2.value() ); + const float o1f_l1 = ( m_parent->m_pit1lfo1.value() ); + const float o1f_l2 = ( m_parent->m_pit1lfo2.value() ); + + // get volumes + const float o1lv = m_parent->m_osc1l_vol; + const float o1rv = m_parent->m_osc1r_vol; + const float o1v_e1 = ( m_parent->m_vol1env1.value() ); + const float o1v_e2 = ( m_parent->m_vol1env2.value() ); + const float o1v_l1 = ( m_parent->m_vol1lfo1.value() ); + const float o1v_l2 = ( m_parent->m_vol1lfo2.value() ); + + + // update osc2 + // get waveform + const int o2w = m_parent->m_osc2Wave.value(); + + // get phases + const float o2lpo = m_parent->m_osc2l_po; + const float o2rpo = m_parent->m_osc2r_po; + const float o2p_e1 = ( m_parent->m_phs2env1.value() ); + const float o2p_e2 = ( m_parent->m_phs2env2.value() ); + const float o2p_l1 = ( m_parent->m_phs2lfo1.value() ); + const float o2p_l2 = ( m_parent->m_phs2lfo2.value() ); + + // get pitch + const float o2lfb = ( m_parent->m_osc2l_freq * m_nph->frequency() ); + const float o2rfb = ( m_parent->m_osc2r_freq * m_nph->frequency() ); + const float o2f_e1 = ( m_parent->m_pit2env1.value() ); + const float o2f_e2 = ( m_parent->m_pit2env2.value() ); + const float o2f_l1 = ( m_parent->m_pit2lfo2.value() ); + const float o2f_l2 = ( m_parent->m_pit2lfo2.value() ); + + // get volumes + const float o2lv = m_parent->m_osc2l_vol; + const float o2rv = m_parent->m_osc2r_vol; + const float o2v_e1 = ( m_parent->m_vol2env1.value() ); + const float o2v_e2 = ( m_parent->m_vol2env2.value() ); + const float o2v_l1 = ( m_parent->m_vol2lfo2.value() ); + const float o2v_l2 = ( m_parent->m_vol2lfo2.value() ); + + + + // update osc3 + // get waveforms + const int o3w1 = m_parent->m_osc3Wave1.value(); + const int o3w2 = m_parent->m_osc3Wave2.value(); + + // get phases + const float o3lpo = m_parent->m_osc3l_po; + const float o3rpo = m_parent->m_osc3r_po; + const float o3p_e1 = ( m_parent->m_phs3env1.value() ); + const float o3p_e2 = ( m_parent->m_phs3env2.value() ); + const float o3p_l1 = ( m_parent->m_phs3lfo1.value() ); + const float o3p_l2 = ( m_parent->m_phs3lfo2.value() ); + + // get pitch modulators + const float o3fb = ( m_parent->m_osc3_freq * m_nph->frequency() ); + const float o3f_e1 = ( m_parent->m_pit3env1.value() ); + const float o3f_e2 = ( m_parent->m_pit3env2.value() ); + const float o3f_l1 = ( m_parent->m_pit3lfo1.value() ); + const float o3f_l2 = ( m_parent->m_pit3lfo2.value() ); + + // get volumes + const float o3lv = m_parent->m_osc3l_vol; + const float o3rv = m_parent->m_osc3r_vol; + const float o3v_e1 = ( m_parent->m_vol3env1.value() ); + const float o3v_e2 = ( m_parent->m_vol3env2.value() ); + const float o3v_l1 = ( m_parent->m_vol3lfo1.value() ); + const float o3v_l2 = ( m_parent->m_vol3lfo2.value() ); + + // get sub + const float o3sub = ( m_parent->m_osc3Sub.value() + 100.0 ) / 200.0; + const float o3s_e1 = ( m_parent->m_sub3env1.value() ); + const float o3s_e2 = ( m_parent->m_sub3env2.value() ); + const float o3s_l1 = ( m_parent->m_sub3lfo1.value() ); + const float o3s_l2 = ( m_parent->m_sub3lfo2.value() ); + + + //o2-o3 modulation + + const int omod = m_parent->m_o23Mod.value(); + + /////////////////////////// + // // + // start buffer loop // + // // + /////////////////////////// + + + + for( f_cnt_t f = 0; f < _frames; f++ ) + { + +/* + // debug code + if( f % 10 == 0 ) { + qDebug( "env1 %f -- env1 phase %f", m_env1_buf[f], m_env1_phase ); + qDebug( "env1 pre %f att %f dec %f rel %f ", m_parent->m_env1_pre, m_parent->m_env1_att, + m_parent->m_env1_dec, m_parent->m_env1_rel ); + } +*/ + + ///////////////////////////// + // // + // OSC 1 // + // // + ///////////////////////////// + + // calc and mod frequencies + float o1l_f = o1lfb; + float o1r_f = o1rfb; + modulatefreq( o1l_f, o1f, 20.0f, 20000.0f ) + modulatefreq( o1r_f, o1f, 20.0f, 20000.0f ) + + // calc and modulate phase + float o1l_p = m_osc1l_phase + o1lpo; + float o1r_p = m_osc1r_phase + o1rpo; + modulateabs( o1l_p, o1p, 0.0f, 1.0f ) + modulateabs( o1r_p, o1p, 0.0f, 1.0f ) + + // calc and modulate pulse + float o1_pw = pw; + modulateabs( o1_pw, o1pw, -1.0f, 1.0f ) + + // pulse wave osc + sample_t O1L = ( o1l_p < o1_pw ) ? 1.0f : -1.0f; + sample_t O1R = ( o1r_p < o1_pw ) ? 1.0f : -1.0f; + + // modulate volume + O1L *= o1lv; + O1R *= o1rv; + modulatevol( O1L, o1v ) + modulatevol( O1R, o1v ) + + // update osc1 phases + m_osc1l_phase = fraction( m_osc1l_phase + ( 1.0 / ( static_cast( m_samplerate ) / o1l_f ) ) ); + m_osc1r_phase = fraction( m_osc1r_phase + ( 1.0 / ( static_cast( m_samplerate ) / o1r_f ) ) ); + + ///////////////////////////// + // // + // OSC 2 // + // // + ///////////////////////////// + + // calc and mod frequencies + float o2l_f = o2lfb; + float o2r_f = o2rfb; + modulatefreq( o2l_f, o2f, 20.0f, 20000.0f ) + modulatefreq( o2r_f, o2f, 20.0f, 20000.0f ) + + // calc and modulate phase + float o2l_p = m_osc2l_phase + o2lpo; + float o2r_p = m_osc2r_phase + o2rpo; + modulateabs( o2l_p, o2p, 0.0f, 1.0f ) + modulateabs( o2r_p, o2p, 0.0f, 1.0f ) + + // multi-wave DC Oscillator + sample_t O2L = oscillate( o2w, o2l_p ); + sample_t O2R = oscillate( o2w, o2r_p ); + + // modulate volume + O2L *= o2lv; + O2R *= o2rv; + modulatevol( O2L, o2v ) + modulatevol( O2R, o2v ) + + // update osc2 phases + m_osc2l_phase = fraction( m_osc2l_phase + ( 1.0 / ( static_cast( m_samplerate ) / o2l_f ) ) ); + m_osc2r_phase = fraction( m_osc2r_phase + ( 1.0 / ( static_cast( m_samplerate ) / o2r_f ) ) ); + + ///////////////////////////// + // // + // OSC 3 // + // // + ///////////////////////////// + + // calc and mod frequencies + float o3l_f = o3fb; + float o3r_f = o3fb; + modulatefreq( o3l_f, o3f, 20.0f, 20000.0f ) + modulatefreq( o3r_f, o3f, 20.0f, 20000.0f ) + // o2 modulation? + if( omod == MOD_FM ) + { + o3l_f = qBound( 20.0f, o3l_f * static_cast( fastPow( 2, O2L ) ), 20000.0f ); + o3r_f = qBound( 20.0f, o3r_f * static_cast( fastPow( 2, O2R ) ), 20000.0f ); + } + + // calc and modulate phase + float o3l_p = m_osc3l_phase + o3lpo; + float o3r_p = m_osc3r_phase + o3rpo; + modulateabs( o3l_p, o3p, 0.0f, 1.0f ) + modulateabs( o3r_p, o3p, 0.0f, 1.0f ) + // o2 modulation? + if( omod == MOD_PM ) + { + o3l_p = qBound( 0.0f, o3l_p + O2L/2, 1.0f ); + o3r_p = qBound( 0.0f, o3r_p + O2R/2, 1.0f ); + } + + // multi-wave DC Oscillator, sub-osc 1 + sample_t O3AL = oscillate( o3w1, o3l_p ); + sample_t O3AR = oscillate( o3w1, o3r_p ); + + // multi-wave DC Oscillator, sub-osc 2 + sample_t O3BL = oscillate( o3w2, o3l_p ); + sample_t O3BR = oscillate( o3w2, o3r_p ); + + // calc and modulate sub + float sub = o3sub; + modulateabs( sub, o3s, 0.0f, 1.0f ) + + sample_t O3L = interpolate( O3AL, O3BL, sub ); + sample_t O3R = interpolate( O3AR, O3BR, sub ); + + // modulate volume + O3L *= o3lv; + O3R *= o3rv; + modulatevol( O3L, o3v ) + modulatevol( O3R, o3v ) + // o2 modulation? + if( omod == MOD_AM ) + { + O3L = qBound( -MODCLIP, O3L * qMax( 0.0f, 1.0f + O2L ), MODCLIP ); + O3R = qBound( -MODCLIP, O3R * qMax( 0.0f, 1.0f + O2R ), MODCLIP ); + } + + // update osc3 phases + m_osc3l_phase = fraction( m_osc3l_phase + ( 1.0f / ( static_cast( m_samplerate ) / o3l_f ) ) ); + m_osc3r_phase = fraction( m_osc3r_phase + ( 1.0f / ( static_cast( m_samplerate ) / o3r_f ) ) ); + + _buf[f][0] = O1L + O3L + ( omod == MOD_MIX ? O2L : 0.0f ); + _buf[f][1] = O1R + O3R + ( omod == MOD_MIX ? O2R : 0.0f ); + } +} + + +void MonstroSynth::renderModulators( fpp_t _frames ) +{ + // LFO phase offsets + const float lfo1_p = m_parent->m_lfo1Phs.value() / 360.0f; + const float lfo2_p = m_parent->m_lfo2Phs.value() / 360.0f; + + // LFO rates + const float lfo1_r = m_parent->m_lfo1Rate.value() / 1000.0f * m_samplerate; + const float lfo2_r = m_parent->m_lfo2Rate.value() / 1000.0f * m_samplerate; + + // LFOs + + sample_t lfo1_s; + sample_t lfo2_s; + + // LFO 1 + + switch( m_parent->m_lfo1Wave.value() ) + { + case WAVE_SINE: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo1_s = Oscillator::sinSample( lfo1_p + static_cast( t ) / lfo1_r ); + if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent-> m_lfo1_att ); + m_lfo1_buf[f] = lfo1_s; + } + break; + case WAVE_TRI: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo1_s = Oscillator::triangleSample( lfo1_p + static_cast( t ) / lfo1_r ); + if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); + m_lfo1_buf[f] = lfo1_s; + } + break; + case WAVE_SAW: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo1_s = Oscillator::sawSample( lfo1_p + static_cast( t ) / lfo1_r ); + if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); + m_lfo1_buf[f] = lfo1_s; + } + break; + case WAVE_RAMP: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo1_s = Oscillator::sawSample( lfo1_p + static_cast( t ) / lfo1_r ) * -1.0f; + if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); + m_lfo1_buf[f] = lfo1_s; + } + break; + case WAVE_SQR: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo1_s = Oscillator::squareSample( lfo1_p + static_cast( t ) / lfo1_r ); + if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); + m_lfo1_buf[f] = lfo1_s; + } + break; + case WAVE_MOOG: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo1_s = Oscillator::moogSawSample( lfo1_p + static_cast( t ) / lfo1_r ); + if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); + m_lfo1_buf[f] = lfo1_s; + } + break; + case WAVE_EXP: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo1_s = Oscillator::expSample( lfo1_p + static_cast( t ) / lfo1_r ); + if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent-> m_lfo1_att ); + m_lfo1_buf[f] = lfo1_s; + } + break; + case WAVE_NOISE: + default: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + if( t % static_cast( lfo1_r ) == 0 ) m_lfo1_last = Oscillator::noiseSample( 0.0f ); + lfo1_s = m_lfo1_last; + if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); + m_lfo1_buf[f] = lfo1_s; + } + break; + } + + // LFO 2 + + switch( m_parent->m_lfo2Wave.value() ) + { + case WAVE_SINE: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo2_s = Oscillator::sinSample( lfo2_p + static_cast( t ) / lfo2_r ); + if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); + m_lfo2_buf[f] = lfo2_s; + } + break; + case WAVE_TRI: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo2_s = Oscillator::triangleSample( lfo2_p + static_cast( t ) / lfo2_r ); + if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); + m_lfo2_buf[f] = lfo2_s; + } + break; + case WAVE_SAW: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo2_s = Oscillator::sawSample( lfo2_p + static_cast( t ) / lfo2_r ); + if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); + m_lfo2_buf[f] = lfo2_s; + } + break; + case WAVE_RAMP: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo2_s = Oscillator::sawSample( lfo2_p + static_cast( t ) / lfo2_r ) * -1.0f; + if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); + m_lfo2_buf[f] = lfo2_s; + } + break; + case WAVE_SQR: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo2_s = Oscillator::squareSample( lfo2_p + static_cast( t ) / lfo2_r ); + if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); + m_lfo2_buf[f] = lfo2_s; + } + break; + case WAVE_MOOG: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo2_s = Oscillator::moogSawSample( lfo2_p + static_cast( t ) / lfo2_r ); + if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); + m_lfo2_buf[f] = lfo2_s; + } + break; + case WAVE_EXP: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo2_s = Oscillator::expSample( lfo2_p + static_cast( t ) / lfo2_r ); + if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); + m_lfo2_buf[f] = lfo2_s; + } + break; + case WAVE_NOISE: + default: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + if( t % static_cast( lfo2_r ) == 0 ) m_lfo2_last = Oscillator::noiseSample( 0.0f ); + lfo2_s = m_lfo2_last; + if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); + m_lfo2_buf[f] = lfo2_s; + } + break; + } + + ///////////////////////////////////////////// + // + // + // envelopes + // + // + ///////////////////////////////////////////// + + const float env1_s = m_parent-> m_env1Slope.value(); + const float env2_s = m_parent-> m_env2Slope.value(); + + const float env1_sus = m_parent-> m_env1Sus.value(); + const float env2_sus = m_parent-> m_env2Sus.value(); + + for( f_cnt_t f = 0; f < _frames; f++ ) + { + // envelope 1 + + // adjust phase for release + if( m_nph->isReleased() && m_env1_phase < 4.0f ) + { + if( m_env1_phase < 1.0f ) m_env1_phase = 5.0f; + else if( m_env1_phase < 2.0f ) m_env1_phase = 5.0f - fraction( m_env1_phase ); + else if( m_env1_phase < 3.0f ) m_env1_phase = 4.0f; + else m_env1_phase = 4.0f + fraction( m_env1_phase ); + } + + // process envelope + if( m_env1_phase < 1.0f ) // pre-delay phase + { + m_env1_buf[f] = 0.0f; + m_env1_phase = qMin( 1.0f, m_env1_phase + m_parent->m_env1_pre ); + } + else if( m_env1_phase < 2.0f ) // attack phase + { + m_env1_buf[f] = calcSlope( fraction( m_env1_phase ), env1_s ); + m_env1_phase = qMin( 2.0f, m_env1_phase + m_parent->m_env1_att ); + } + else if( m_env1_phase < 3.0f ) // hold phase + { + m_env1_buf[f] = 1.0f; + m_env1_phase = qMin( 3.0f, m_env1_phase + m_parent->m_env1_hold ); + } + else if( m_env1_phase < 4.0f ) // decay phase + { + const sample_t s = 1.0f - fraction( m_env1_phase ); + if( s <= env1_sus ) + { + m_env1_buf[f] = env1_sus; + } + else + { + m_env1_buf[f] = calcSlope( s, env1_s ); + m_env1_phase = qMin( 4.0f - env1_sus, m_env1_phase + m_parent->m_env1_dec ); + } + } + else if( m_env1_phase < 5.0f ) // release phase + { + m_env1_buf[f] = calcSlope( 1.0f - fraction( m_env1_phase ), env1_s ); + m_env1_phase += m_parent->m_env1_rel; + } + else m_env1_buf[f] = 0.0f; + +// qDebug( "env1 %f", m_env1_buf[f] ); + + // envelope 2 + + + + // adjust phase for release + if( m_nph->isReleased() && m_env2_phase < 4.0f ) + { + if( m_env2_phase < 1.0f ) m_env2_phase = 5.0f; + else if( m_env2_phase < 2.0f ) m_env2_phase = 5.0f - fraction( m_env2_phase ); + else if( m_env2_phase < 3.0f ) m_env2_phase = 4.0f; + else m_env2_phase = 4.0f + fraction( m_env2_phase ); + } + + // process envelope + if( m_env2_phase < 1.0f ) // pre-delay phase + { + m_env2_buf[f] = 0.0f; + m_env2_phase = qMin( 1.0f, m_env2_phase + m_parent->m_env2_pre ); + } + else if( m_env2_phase < 2.0f ) // attack phase + { + m_env2_buf[f] = calcSlope( fraction( m_env2_phase ), env2_s ); + m_env2_phase = qMin( 2.0f, m_env2_phase + m_parent->m_env2_att ); + } + else if( m_env2_phase < 3.0f ) // hold phase + { + m_env2_buf[f] = 1.0f; + m_env2_phase = qMin( 3.0f, m_env2_phase + m_parent->m_env2_hold ); + } + else if( m_env2_phase < 4.0f ) // decay phase + { + const sample_t s = 1.0f - fraction( m_env2_phase ); + if( s <= env2_sus ) + { + m_env2_buf[f] = env2_sus; + } + else + { + m_env2_buf[f] = calcSlope( s, env2_s ); + m_env2_phase = qMin( 4.0f - env2_sus, m_env2_phase + m_parent->m_env2_dec ); + } + } + else if( m_env2_phase < 5.0f ) // release phase + { + m_env2_buf[f] = calcSlope( 1.0f - fraction( m_env2_phase), env2_s ); + m_env2_phase += m_parent->m_env2_rel; + } + else m_env2_buf[f] = 0.0f; + + } + +} + + + +MonstroInstrument::MonstroInstrument( InstrumentTrack * _instrument_track ) : + Instrument( _instrument_track, &monstro_plugin_descriptor ), + + m_osc1Vol( 33.0, 0.0, 200.0, 0.1, this, tr( "Osc 1 Volume" ) ), + m_osc1Pan( 0.0, -100.0, 100.0, 0.1, this, tr( "Osc 1 Panning" ) ), + m_osc1Crs( 0.0, -24.0, 24.0, 1.0, this, tr( "Osc 1 Coarse detune" ) ), + m_osc1Ftl( 0.0, -100.0, 100.0, 1.0, this, tr( "Osc 1 Fine detune left" ) ), + m_osc1Ftr( 0.0, -100.0, 100.0, 1.0, this, tr( "Osc 1 Fine detune right" ) ), + m_osc1Spo( 0.0, -180.0, 180.0, 0.1, this, tr( "Osc 1 Stereo phase offset" ) ), + m_osc1Pw( 50.0, 0.0, 100.0, 0.01, this, tr( "Osc 1 Pulse width" ) ), + + m_osc2Vol( 33.0, 0.0, 200.0, 0.1, this, tr( "Osc 2 Volume" ) ), + m_osc2Pan( 0.0, -100.0, 100.0, 0.1, this, tr( "Osc 2 Panning" ) ), + m_osc2Crs( 0.0, -24.0, 24.0, 1.0, this, tr( "Osc 2 Coarse detune" ) ), + m_osc2Ftl( 0.0, -100.0, 100.0, 1.0, this, tr( "Osc 2 Fine detune left" ) ), + m_osc2Ftr( 0.0, -100.0, 100.0, 1.0, this, tr( "Osc 2 Fine detune right" ) ), + m_osc2Spo( 0.0, -180.0, 180.0, 0.1, this, tr( "Osc 2 Stereo phase offset" ) ), + m_osc2Wave( this, tr( "Osc 2 Waveform" ) ), + + m_osc3Vol( 33.0, 0.0, 200.0, 0.1, this, tr( "Osc 3 Volume" ) ), + m_osc3Pan( 0.0, -100.0, 100.0, 0.1, this, tr( "Osc 3 Panning" ) ), + m_osc3Crs( 0.0, -24.0, 24.0, 1.0, this, tr( "Osc 3 Coarse detune" ) ), + m_osc3Spo( 0.0, -180.0, 180.0, 0.1, this, tr( "Osc 3 Stereo phase offset" ) ), + m_osc3Sub( 0.0, -100.0, 100.0, 0.1, this, tr( "Osc 3 Sub-oscillator mix" ) ), + m_osc3Wave1( this, tr( "Osc 3 Waveform 1" ) ), + m_osc3Wave2( this, tr( "Osc 3 Waveform 2" ) ), + + m_lfo1Wave( this, tr( "LFO 1 Waveform" ) ), + m_lfo1Att( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "LFO 1 Attack" ) ), + m_lfo1Rate( 1.0f, 0.1, 20000.0, 0.1, 20000.0f, this, tr( "LFO 1 Rate" ) ), + m_lfo1Phs( 0.0, -180.0, 180.0, 0.1, this, tr( "LFO 1 Phase" ) ), + + m_lfo2Wave( this, tr( "LFO 2 Waveform" ) ), + m_lfo2Att( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "LFO 2 Attack" ) ), + m_lfo2Rate( 1.0f, 0.1, 20000.0, 0.1, 20000.0f, this, tr( "LFO 2 Rate" ) ), + m_lfo2Phs( 0.0, -180.0, 180.0, 0.1, this, tr( "LFO 2 Phase" ) ), + + m_env1Pre( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "Env 1 Pre-delay" ) ), + m_env1Att( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "Env 1 Attack" ) ), + m_env1Hold( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "Env 1 Hold" ) ), + m_env1Dec( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "Env 1 Decay" ) ), + m_env1Sus( 1.0f, 0.0f, 1.0f, 0.001f, this, tr( "Env 1 Sustain" ) ), + m_env1Rel( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "Env 1 Release" ) ), + m_env1Slope( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Env 1 Slope" ) ), + + m_env2Pre( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "Env 2 Pre-delay" ) ), + m_env2Att( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "Env 2 Attack" ) ), + m_env2Hold( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "Env 2 Hold" ) ), + m_env2Dec( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "Env 2 Decay" ) ), + m_env2Sus( 1.0f, 0.0f, 1.0f, 0.001f, this, tr( "Env 2 Sustain" ) ), + m_env2Rel( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "Env 2 Release" ) ), + m_env2Slope( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Env 2 Slope" ) ), + + m_o23Mod( 0, 0, NUM_MODS - 1, this, tr( "Osc2-3 modulation" ) ), + + m_selectedView( 0, 0, 1, this, tr( "Selected view" ) ), + + m_vol1env1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Vol1-Env1" ) ), + m_vol1env2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Vol1-Env2" ) ), + m_vol1lfo1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Vol1-LFO1" ) ), + m_vol1lfo2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Vol1-LFO2" ) ), + + m_vol2env1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Vol2-Env1" ) ), + m_vol2env2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Vol2-Env2" ) ), + m_vol2lfo1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Vol2-LFO1" ) ), + m_vol2lfo2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Vol2-LFO2" ) ), + + m_vol3env1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Vol3-Env1" ) ), + m_vol3env2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Vol3-Env2" ) ), + m_vol3lfo1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Vol3-LFO1" ) ), + m_vol3lfo2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Vol3-LFO2" ) ), + + m_phs1env1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Phs1-Env1" ) ), + m_phs1env2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Phs1-Env2" ) ), + m_phs1lfo1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Phs1-LFO1" ) ), + m_phs1lfo2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Phs1-LFO2" ) ), + + m_phs2env1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Phs2-Env1" ) ), + m_phs2env2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Phs2-Env2" ) ), + m_phs2lfo1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Phs2-LFO1" ) ), + m_phs2lfo2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Phs2-LFO2" ) ), + + m_phs3env1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Phs3-Env1" ) ), + m_phs3env2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Phs3-Env2" ) ), + m_phs3lfo1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Phs3-LFO1" ) ), + m_phs3lfo2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Phs3-LFO2" ) ), + + m_pit1env1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Pit1-Env1" ) ), + m_pit1env2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Pit1-Env2" ) ), + m_pit1lfo1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Pit1-LFO1" ) ), + m_pit1lfo2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Pit1-LFO2" ) ), + + m_pit2env1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Pit2-Env1" ) ), + m_pit2env2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Pit2-Env2" ) ), + m_pit2lfo1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Pit2-LFO1" ) ), + m_pit2lfo2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Pit2-LFO2" ) ), + + m_pit3env1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Pit3-Env1" ) ), + m_pit3env2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Pit3-Env2" ) ), + m_pit3lfo1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Pit3-LFO1" ) ), + m_pit3lfo2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Pit3-LFO2" ) ), + + m_pw1env1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "PW1-Env1" ) ), + m_pw1env2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "PW1-Env2" ) ), + m_pw1lfo1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "PW1-LFO1" ) ), + m_pw1lfo2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "PW1-LFO2" ) ), + + m_sub3env1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Sub3-Env1" ) ), + m_sub3env2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Sub3-Env2" ) ), + m_sub3lfo1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Sub3-LFO1" ) ), + m_sub3lfo2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Sub3-LFO2" ) ) + +{ +// setup waveboxes + setwavemodel( m_osc2Wave ) + setwavemodel( m_osc3Wave1 ) + setwavemodel( m_osc3Wave2 ) + setwavemodel( m_lfo1Wave ) + setwavemodel( m_lfo2Wave ) + +// make connections: + +// updateVolumes + + connect( &m_osc1Vol, SIGNAL( dataChanged() ), this, SLOT( updateVolumes() ) ); + connect( &m_osc1Pan, SIGNAL( dataChanged() ), this, SLOT( updateVolumes() ) ); + connect( &m_osc2Vol, SIGNAL( dataChanged() ), this, SLOT( updateVolumes() ) ); + connect( &m_osc2Pan, SIGNAL( dataChanged() ), this, SLOT( updateVolumes() ) ); + connect( &m_osc3Vol, SIGNAL( dataChanged() ), this, SLOT( updateVolumes() ) ); + connect( &m_osc3Pan, SIGNAL( dataChanged() ), this, SLOT( updateVolumes() ) ); + +// updateFreq + + connect( &m_osc1Crs, SIGNAL( dataChanged() ), this, SLOT( updateFreq() ) ); + connect( &m_osc2Crs, SIGNAL( dataChanged() ), this, SLOT( updateFreq() ) ); + connect( &m_osc3Crs, SIGNAL( dataChanged() ), this, SLOT( updateFreq() ) ); + + connect( &m_osc1Ftl, SIGNAL( dataChanged() ), this, SLOT( updateFreq() ) ); + connect( &m_osc2Ftl, SIGNAL( dataChanged() ), this, SLOT( updateFreq() ) ); + + connect( &m_osc1Ftr, SIGNAL( dataChanged() ), this, SLOT( updateFreq() ) ); + connect( &m_osc2Ftr, SIGNAL( dataChanged() ), this, SLOT( updateFreq() ) ); + +// updatePO + connect( &m_osc1Spo, SIGNAL( dataChanged() ), this, SLOT( updatePO() ) ); + connect( &m_osc2Spo, SIGNAL( dataChanged() ), this, SLOT( updatePO() ) ); + connect( &m_osc3Spo, SIGNAL( dataChanged() ), this, SLOT( updatePO() ) ); + +// updateEnvelope1 + + connect( &m_env1Pre, SIGNAL( dataChanged() ), this, SLOT( updateEnvelope1() ) ); + connect( &m_env1Att, SIGNAL( dataChanged() ), this, SLOT( updateEnvelope1() ) ); + connect( &m_env1Hold, SIGNAL( dataChanged() ), this, SLOT( updateEnvelope1() ) ); + connect( &m_env1Dec, SIGNAL( dataChanged() ), this, SLOT( updateEnvelope1() ) ); + connect( &m_env1Rel, SIGNAL( dataChanged() ), this, SLOT( updateEnvelope1() ) ); + +// updateEnvelope2 + + connect( &m_env2Pre, SIGNAL( dataChanged() ), this, SLOT( updateEnvelope2() ) ); + connect( &m_env2Att, SIGNAL( dataChanged() ), this, SLOT( updateEnvelope2() ) ); + connect( &m_env2Hold, SIGNAL( dataChanged() ), this, SLOT( updateEnvelope2() ) ); + connect( &m_env2Dec, SIGNAL( dataChanged() ), this, SLOT( updateEnvelope2() ) ); + connect( &m_env2Rel, SIGNAL( dataChanged() ), this, SLOT( updateEnvelope2() ) ); + +// updateLFOAtts + + connect( &m_lfo1Att, SIGNAL( dataChanged() ), this, SLOT( updateLFOAtts() ) ); + connect( &m_lfo2Att, SIGNAL( dataChanged() ), this, SLOT( updateLFOAtts() ) ); + +// updateSampleRate + + connect( engine::mixer(), SIGNAL( sampleRateChanged() ), this, SLOT( updateSamplerate() ) ); + + m_fpp = engine::mixer()->framesPerPeriod(); + + updateSamplerate(); + updateVolumes(); + updateFreq(); + updatePO(); +} + + +MonstroInstrument::~MonstroInstrument() +{ +} + + +void MonstroInstrument::playNote( NotePlayHandle * _n, + sampleFrame * _working_buffer ) +{ + if ( _n->totalFramesPlayed() == 0 || _n->m_pluginData == NULL ) + { + const sample_rate_t samplerate = m_samplerate; + _n->m_pluginData = new MonstroSynth( this, _n, samplerate, m_fpp ); + } + + const fpp_t frames = _n->framesLeftForCurrentPeriod(); + + MonstroSynth * ms = static_cast( _n->m_pluginData ); + + ms->renderOutput( frames, _working_buffer ); + + //applyRelease( _working_buffer, _n ); + + instrumentTrack()->processAudioBuffer( _working_buffer, frames, _n ); +} + +void MonstroInstrument::deleteNotePluginData( NotePlayHandle * _n ) +{ + delete static_cast( _n->m_pluginData ); +} + + +void MonstroInstrument::saveSettings( QDomDocument & _doc, + QDomElement & _this ) +{ + m_osc1Vol.saveSettings( _doc, _this, "o1vol" ); + m_osc1Pan.saveSettings( _doc, _this, "o1pan" ); + m_osc1Crs.saveSettings( _doc, _this, "o1crs" ); + m_osc1Ftl.saveSettings( _doc, _this, "o1ftl" ); + m_osc1Ftr.saveSettings( _doc, _this, "o1ftr" ); + m_osc1Spo.saveSettings( _doc, _this, "o1spo" ); + m_osc1Pw.saveSettings( _doc, _this, "o1pw" ); + + m_osc2Vol.saveSettings( _doc, _this, "o2vol" ); + m_osc2Pan.saveSettings( _doc, _this, "o2pan" ); + m_osc2Crs.saveSettings( _doc, _this, "o2crs" ); + m_osc2Ftl.saveSettings( _doc, _this, "o2ftl" ); + m_osc2Ftr.saveSettings( _doc, _this, "o2ftr" ); + m_osc2Spo.saveSettings( _doc, _this, "o2spo" ); + m_osc2Wave.saveSettings( _doc, _this, "o2wav" ); + + m_osc3Vol.saveSettings( _doc, _this, "o3vol" ); + m_osc3Pan.saveSettings( _doc, _this, "o3pan" ); + m_osc3Crs.saveSettings( _doc, _this, "o3crs" ); + m_osc3Spo.saveSettings( _doc, _this, "o3spo" ); + m_osc3Sub.saveSettings( _doc, _this, "o3sub" ); + m_osc3Wave1.saveSettings( _doc, _this, "o3wav1" ); + m_osc3Wave2.saveSettings( _doc, _this, "o3wav2" ); + + m_lfo1Wave.saveSettings( _doc, _this, "l1wav" ); + m_lfo1Att.saveSettings( _doc, _this, "l1att" ); + m_lfo1Rate.saveSettings( _doc, _this, "l1rat" ); + m_lfo1Phs.saveSettings( _doc, _this, "l1phs" ); + + m_lfo2Wave.saveSettings( _doc, _this, "l2wav" ); + m_lfo2Att.saveSettings( _doc, _this, "l2att" ); + m_lfo2Rate.saveSettings( _doc, _this, "l2rat" ); + m_lfo2Phs.saveSettings( _doc, _this, "l2phs" ); + + m_env1Pre.saveSettings( _doc, _this, "e1pre" ); + m_env1Att.saveSettings( _doc, _this, "e1att" ); + m_env1Hold.saveSettings( _doc, _this, "e1hol" ); + m_env1Dec.saveSettings( _doc, _this, "e1dec" ); + m_env1Sus.saveSettings( _doc, _this, "e1sus" ); + m_env1Rel.saveSettings( _doc, _this, "e1rel" ); + m_env1Slope.saveSettings( _doc, _this, "e1slo" ); + + m_env2Pre.saveSettings( _doc, _this, "e2pre" ); + m_env2Att.saveSettings( _doc, _this, "e2att" ); + m_env2Hold.saveSettings( _doc, _this, "e2hol" ); + m_env2Dec.saveSettings( _doc, _this, "e2dec" ); + m_env2Sus.saveSettings( _doc, _this, "e2sus" ); + m_env2Rel.saveSettings( _doc, _this, "e2rel" ); + m_env2Slope.saveSettings( _doc, _this, "e2slo" ); + + m_o23Mod.saveSettings( _doc, _this, "o23mo" ); + + m_vol1env1.saveSettings( _doc, _this, "v1e1" ); + m_vol1env2.saveSettings( _doc, _this, "v1e2" ); + m_vol1lfo1.saveSettings( _doc, _this, "v1l1" ); + m_vol1lfo2.saveSettings( _doc, _this, "v1l2" ); + + m_vol2env1.saveSettings( _doc, _this, "v2e1" ); + m_vol2env2.saveSettings( _doc, _this, "v2e2" ); + m_vol2lfo1.saveSettings( _doc, _this, "v2l1" ); + m_vol2lfo2.saveSettings( _doc, _this, "v2l2" ); + + m_vol3env1.saveSettings( _doc, _this, "v3e1" ); + m_vol3env2.saveSettings( _doc, _this, "v3e2" ); + m_vol3lfo1.saveSettings( _doc, _this, "v3l1" ); + m_vol3lfo2.saveSettings( _doc, _this, "v3l2" ); + + m_phs1env1.saveSettings( _doc, _this, "p1e1" ); + m_phs1env2.saveSettings( _doc, _this, "p1e2" ); + m_phs1lfo1.saveSettings( _doc, _this, "p1l1" ); + m_phs1lfo2.saveSettings( _doc, _this, "p1l2" ); + + m_phs2env1.saveSettings( _doc, _this, "p2e1" ); + m_phs2env2.saveSettings( _doc, _this, "p2e2" ); + m_phs2lfo1.saveSettings( _doc, _this, "p2l1" ); + m_phs2lfo2.saveSettings( _doc, _this, "p2l2" ); + + m_phs3env1.saveSettings( _doc, _this, "p3e1" ); + m_phs3env2.saveSettings( _doc, _this, "p3e2" ); + m_phs3lfo1.saveSettings( _doc, _this, "p3l1" ); + m_phs3lfo2.saveSettings( _doc, _this, "p3l2" ); + + m_pit1env1.saveSettings( _doc, _this, "f1e1" ); + m_pit1env2.saveSettings( _doc, _this, "f1e2" ); + m_pit1lfo1.saveSettings( _doc, _this, "f1l1" ); + m_pit1lfo2.saveSettings( _doc, _this, "f1l2" ); + + m_pit2env1.saveSettings( _doc, _this, "f2e1" ); + m_pit2env2.saveSettings( _doc, _this, "f2e2" ); + m_pit2lfo1.saveSettings( _doc, _this, "f2l1" ); + m_pit2lfo2.saveSettings( _doc, _this, "f2l2" ); + + m_pit3env1.saveSettings( _doc, _this, "f3e1" ); + m_pit3env2.saveSettings( _doc, _this, "f3e2" ); + m_pit3lfo1.saveSettings( _doc, _this, "f3l1" ); + m_pit3lfo2.saveSettings( _doc, _this, "f3l2" ); + + m_pw1env1.saveSettings( _doc, _this, "w1e1" ); + m_pw1env2.saveSettings( _doc, _this, "w1e2" ); + m_pw1lfo1.saveSettings( _doc, _this, "w1l1" ); + m_pw1lfo2.saveSettings( _doc, _this, "w1l2" ); + + m_sub3env1.saveSettings( _doc, _this, "s3e1" ); + m_sub3env2.saveSettings( _doc, _this, "s3e2" ); + m_sub3lfo1.saveSettings( _doc, _this, "s3l1" ); + m_sub3lfo2.saveSettings( _doc, _this, "s3l2" ); + +} + +void MonstroInstrument::loadSettings( const QDomElement & _this ) +{ + m_osc1Vol.loadSettings( _this, "o1vol" ); + m_osc1Pan.loadSettings( _this, "o1pan" ); + m_osc1Crs.loadSettings( _this, "o1crs" ); + m_osc1Ftl.loadSettings( _this, "o1ftl" ); + m_osc1Ftr.loadSettings( _this, "o1ftr" ); + m_osc1Spo.loadSettings( _this, "o1spo" ); + m_osc1Pw.loadSettings( _this, "o1pw" ); + + m_osc2Vol.loadSettings( _this, "o2vol" ); + m_osc2Pan.loadSettings( _this, "o2pan" ); + m_osc2Crs.loadSettings( _this, "o2crs" ); + m_osc2Ftl.loadSettings( _this, "o2ftl" ); + m_osc2Ftr.loadSettings( _this, "o2ftr" ); + m_osc2Spo.loadSettings( _this, "o2spo" ); + m_osc2Wave.loadSettings( _this, "o2wav" ); + + m_osc3Vol.loadSettings( _this, "o3vol" ); + m_osc3Pan.loadSettings( _this, "o3pan" ); + m_osc3Crs.loadSettings( _this, "o3crs" ); + m_osc3Spo.loadSettings( _this, "o3spo" ); + m_osc3Sub.loadSettings( _this, "o3sub" ); + m_osc3Wave1.loadSettings( _this, "o3wav1" ); + m_osc3Wave2.loadSettings( _this, "o3wav2" ); + + m_lfo1Wave.loadSettings( _this, "l1wav" ); + m_lfo1Att.loadSettings( _this, "l1att" ); + m_lfo1Rate.loadSettings( _this, "l1rat" ); + m_lfo1Phs.loadSettings( _this, "l1phs" ); + + m_lfo2Wave.loadSettings( _this, "l2wav" ); + m_lfo2Att.loadSettings( _this, "l2att" ); + m_lfo2Rate.loadSettings( _this, "l2rat" ); + m_lfo2Phs.loadSettings( _this, "l2phs" ); + + m_env1Pre.loadSettings( _this, "e1pre" ); + m_env1Att.loadSettings( _this, "e1att" ); + m_env1Hold.loadSettings( _this, "e1hol" ); + m_env1Dec.loadSettings( _this, "e1dec" ); + m_env1Sus.loadSettings( _this, "e1sus" ); + m_env1Rel.loadSettings( _this, "e1rel" ); + m_env1Slope.loadSettings( _this, "e1slo" ); + + m_env2Pre.loadSettings( _this, "e2pre" ); + m_env2Att.loadSettings( _this, "e2att" ); + m_env2Hold.loadSettings( _this, "e2hol" ); + m_env2Dec.loadSettings( _this, "e2dec" ); + m_env2Sus.loadSettings( _this, "e2sus" ); + m_env2Rel.loadSettings( _this, "e2rel" ); + m_env2Slope.loadSettings( _this, "e2slo" ); + + m_o23Mod.loadSettings( _this, "o23mo" ); + + m_vol1env1.loadSettings( _this, "v1e1" ); + m_vol1env2.loadSettings( _this, "v1e2" ); + m_vol1lfo1.loadSettings( _this, "v1l1" ); + m_vol1lfo2.loadSettings( _this, "v1l2" ); + + m_vol2env1.loadSettings( _this, "v2e1" ); + m_vol2env2.loadSettings( _this, "v2e2" ); + m_vol2lfo1.loadSettings( _this, "v2l1" ); + m_vol2lfo2.loadSettings( _this, "v2l2" ); + + m_vol3env1.loadSettings( _this, "v3e1" ); + m_vol3env2.loadSettings( _this, "v3e2" ); + m_vol3lfo1.loadSettings( _this, "v3l1" ); + m_vol3lfo2.loadSettings( _this, "v3l2" ); + + m_phs1env1.loadSettings( _this, "p1e1" ); + m_phs1env2.loadSettings( _this, "p1e2" ); + m_phs1lfo1.loadSettings( _this, "p1l1" ); + m_phs1lfo2.loadSettings( _this, "p1l2" ); + + m_phs2env1.loadSettings( _this, "p2e1" ); + m_phs2env2.loadSettings( _this, "p2e2" ); + m_phs2lfo1.loadSettings( _this, "p2l1" ); + m_phs2lfo2.loadSettings( _this, "p2l2" ); + + m_phs3env1.loadSettings( _this, "p3e1" ); + m_phs3env2.loadSettings( _this, "p3e2" ); + m_phs3lfo1.loadSettings( _this, "p3l1" ); + m_phs3lfo2.loadSettings( _this, "p3l2" ); + + m_pit1env1.loadSettings( _this, "f1e1" ); + m_pit1env2.loadSettings( _this, "f1e2" ); + m_pit1lfo1.loadSettings( _this, "f1l1" ); + m_pit1lfo2.loadSettings( _this, "f1l2" ); + + m_pit2env1.loadSettings( _this, "f2e1" ); + m_pit2env2.loadSettings( _this, "f2e2" ); + m_pit2lfo1.loadSettings( _this, "f2l1" ); + m_pit2lfo2.loadSettings( _this, "f2l2" ); + + m_pit3env1.loadSettings( _this, "f3e1" ); + m_pit3env2.loadSettings( _this, "f3e2" ); + m_pit3lfo1.loadSettings( _this, "f3l1" ); + m_pit3lfo2.loadSettings( _this, "f3l2" ); + + m_pw1env1.loadSettings( _this, "w1e1" ); + m_pw1env2.loadSettings( _this, "w1e2" ); + m_pw1lfo1.loadSettings( _this, "w1l1" ); + m_pw1lfo2.loadSettings( _this, "w1l2" ); + + m_sub3env1.loadSettings( _this, "s3e1" ); + m_sub3env2.loadSettings( _this, "s3e2" ); + m_sub3lfo1.loadSettings( _this, "s3l1" ); + m_sub3lfo2.loadSettings( _this, "s3l2" ); + +} + + +QString MonstroInstrument::nodeName() const +{ + return monstro_plugin_descriptor.name; +} + + +f_cnt_t MonstroInstrument::desiredReleaseFrames() const +{ + return qMax( 64, qMax( m_env1_relF, m_env2_relF ) ); +} + + +PluginView * MonstroInstrument::instantiateView( QWidget * _parent ) +{ + return( new MonstroView( this, _parent ) ); +} + + +void MonstroInstrument::updateVolumes() +{ + m_osc1l_vol = leftCh( m_osc1Vol.value(), m_osc1Pan.value() ); + m_osc1r_vol = rightCh( m_osc1Vol.value(), m_osc1Pan.value() ); + + m_osc2l_vol = leftCh( m_osc2Vol.value(), m_osc2Pan.value() ); + m_osc2r_vol = rightCh( m_osc2Vol.value(), m_osc2Pan.value() ); + + m_osc3l_vol = leftCh( m_osc3Vol.value(), m_osc3Pan.value() ); + m_osc3r_vol = rightCh( m_osc3Vol.value(), m_osc3Pan.value() ); +} + + +void MonstroInstrument::updateFreq() +{ + m_osc1l_freq = powf( 2.0d, m_osc1Crs.value() / 12.0d ) * + powf( 2.0d, m_osc1Ftl.value() / 1200.0d ); + m_osc1r_freq = powf( 2.0d, m_osc1Crs.value() / 12.0d ) * + powf( 2.0d, m_osc1Ftr.value() / 1200.0d ); + + m_osc2l_freq = powf( 2.0d, m_osc2Crs.value() / 12.0d ) * + powf( 2.0d, m_osc2Ftl.value() / 1200.0d ); + m_osc2r_freq = powf( 2.0d, m_osc2Crs.value() / 12.0d ) * + powf( 2.0d, m_osc2Ftr.value() / 1200.0d ); + + m_osc3_freq = powf( 2.0d, m_osc3Crs.value() / 12.0d ); +} + + +void MonstroInstrument::updatePO() +{ + m_osc1l_po = m_osc1Spo.value() / 360.0; + m_osc1r_po = ( m_osc1Spo.value() * -1.0 ) / 360.0; + + m_osc2l_po = m_osc2Spo.value() / 360.0; + m_osc2r_po = ( m_osc2Spo.value() * -1.0 ) / 360.0; + + m_osc3l_po = m_osc3Spo.value() / 360.0; + m_osc3r_po = ( m_osc3Spo.value() * -1.0 ) / 360.0; +} + +void MonstroInstrument::updateEnvelope1() +{ + if( m_env1Pre.value() == 0.0f ) m_env1_pre = 1.0; + else m_env1_pre = 1.0 / ( m_env1Pre.value() / 1000.0f ) / m_samplerate; + if( m_env1Att.value() == 0.0f ) m_env1_att = 1.0; + else m_env1_att = 1.0 / ( m_env1Att.value() / 1000.0f ) / m_samplerate; + if( m_env1Hold.value() == 0.0f ) m_env1_hold = 1.0; + else m_env1_hold = 1.0 / ( m_env1Hold.value() / 1000.0f ) / m_samplerate; + if( m_env1Dec.value() == 0.0f ) m_env1_dec = 1.0; + else m_env1_dec = 1.0 / ( m_env1Dec.value() / 1000.0f ) / m_samplerate; + if( m_env1Rel.value() == 0.0f ) m_env1_rel = 1.0; + else m_env1_rel = 1.0 / ( m_env1Rel.value() / 1000.0f ) / m_samplerate; + + m_env1_len = ( m_env1Pre.value() + m_env1Att.value() + m_env1Hold.value() + m_env1Dec.value() ) * m_samplerate / 1000.0f; + m_env1_relF = m_env1Rel.value() * m_samplerate / 1000.0f; +} +void MonstroInstrument::updateEnvelope2() +{ + if( m_env2Pre.value() == 0.0f ) m_env2_pre = 1.0; + else m_env2_pre = 1.0 / ( m_env2Pre.value() / 1000.0f ) / m_samplerate; + if( m_env2Att.value() == 0.0f ) m_env2_att = 1.0; + else m_env2_att = 1.0 / ( m_env2Att.value() / 1000.0f ) / m_samplerate; + if( m_env2Hold.value() == 0.0f ) m_env2_hold = 1.0; + else m_env2_hold = 1.0 / ( m_env2Hold.value() / 1000.0f ) / m_samplerate; + if( m_env2Dec.value() == 0.0f ) m_env2_dec = 1.0; + else m_env2_dec = 1.0 / ( m_env2Dec.value() / 1000.0f ) / m_samplerate; + if( m_env2Rel.value() == 0.0f ) m_env2_rel = 1.0; + else m_env2_rel = 1.0 / ( m_env2Rel.value() / 1000.0f ) / m_samplerate; + + m_env2_len = ( m_env2Pre.value() + m_env2Att.value() + m_env2Hold.value() + m_env2Dec.value() ) * m_samplerate / 1000.0f; + m_env2_relF = m_env2Rel.value() * m_samplerate / 1000.0f; +} + + +void MonstroInstrument::updateLFOAtts() +{ + m_lfo1_att = m_lfo1Att.value() * m_samplerate / 1000.0f; + m_lfo2_att = m_lfo2Att.value() * m_samplerate / 1000.0f; +} + + +void MonstroInstrument::updateSamplerate() +{ + m_samplerate = engine::mixer()->processingSampleRate(); + updateEnvelope1(); + updateEnvelope2(); + updateLFOAtts(); +} + + +MonstroView::MonstroView( Instrument * _instrument, + QWidget * _parent ) : + InstrumentView( _instrument, _parent ) +{ + m_operatorsView = setupOperatorsView( this ); + setWidgetBackground( m_operatorsView, "artwork_op" ); + m_operatorsView->show(); + m_operatorsView->move( 0, 0 ); + + m_matrixView = setupMatrixView( this ); + setWidgetBackground( m_matrixView, "artwork_mat" ); + m_matrixView->hide(); + m_matrixView->move( 0, 0 ); + +// "tab buttons" + + pixmapButton * m_opViewButton = new pixmapButton( this, NULL ); + m_opViewButton -> move( 0,0 ); + m_opViewButton -> setActiveGraphic( PLUGIN_NAME::getIconPixmap( "opview_active" ) ); + m_opViewButton -> setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "opview_inactive" ) ); + toolTip::add( m_opViewButton, tr( "Operators view" ) ); + + 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_selectedViewGroup = new automatableButtonGroup( this ); + m_selectedViewGroup -> addButton( m_opViewButton ); + m_selectedViewGroup -> addButton( m_matViewButton ); + + connect( m_opViewButton, SIGNAL( clicked() ), this, SLOT( updateLayout() ) ); + connect( m_matViewButton, SIGNAL( clicked() ), this, SLOT( updateLayout() ) ); +} + + +MonstroView::~MonstroView() +{ +} + + +void MonstroView::updateLayout() +{ + switch( m_selectedViewGroup->model()->value() ) + { + case OPVIEW: + m_operatorsView->show(); + m_matrixView->hide(); + break; + case MATVIEW: + m_operatorsView->hide(); + m_matrixView->show(); + break; + } +} + + +void MonstroView::modelChanged() +{ + MonstroInstrument * m = castModel(); + + m_osc1VolKnob-> setModel( &m-> m_osc1Vol ); + m_osc1PanKnob-> setModel( &m-> m_osc1Pan ); + m_osc1CrsKnob-> setModel( &m-> m_osc1Crs ); + m_osc1FtlKnob-> setModel( &m-> m_osc1Ftl ); + m_osc1FtrKnob-> setModel( &m-> m_osc1Ftr ); + m_osc1SpoKnob-> setModel( &m-> m_osc1Spo ); + m_osc1PwKnob-> setModel( &m-> m_osc1Pw ); + + m_osc2VolKnob-> setModel( &m-> m_osc2Vol ); + m_osc2PanKnob-> setModel( &m-> m_osc2Pan ); + m_osc2CrsKnob-> setModel( &m-> m_osc2Crs ); + m_osc2FtlKnob-> setModel( &m-> m_osc2Ftl ); + m_osc2FtrKnob-> setModel( &m-> m_osc2Ftr ); + m_osc2SpoKnob-> setModel( &m-> m_osc2Spo ); + m_osc2WaveBox-> setModel( &m-> m_osc2Wave ); + + m_osc3VolKnob-> setModel( &m-> m_osc3Vol ); + m_osc3PanKnob-> setModel( &m-> m_osc3Pan ); + m_osc3CrsKnob-> setModel( &m-> m_osc3Crs ); + m_osc3SpoKnob-> setModel( &m-> m_osc3Spo ); + m_osc3SubKnob-> setModel( &m-> m_osc3Sub ); + m_osc3Wave1Box-> setModel( &m-> m_osc3Wave1 ); + m_osc3Wave2Box-> setModel( &m-> m_osc3Wave2 ); + + m_lfo1WaveBox-> setModel( &m-> m_lfo1Wave ); + m_lfo1AttKnob-> setModel( &m-> m_lfo1Att ); + m_lfo1RateKnob-> setModel( &m-> m_lfo1Rate ); + m_lfo1PhsKnob-> setModel( &m-> m_lfo1Phs ); + + m_lfo2WaveBox-> setModel( &m-> m_lfo2Wave ); + m_lfo2AttKnob-> setModel( &m-> m_lfo2Att ); + m_lfo2RateKnob-> setModel( &m-> m_lfo2Rate ); + m_lfo2PhsKnob-> setModel( &m-> m_lfo2Phs ); + + m_env1PreKnob-> setModel( &m-> m_env1Pre ); + m_env1AttKnob-> setModel( &m-> m_env1Att ); + m_env1HoldKnob-> setModel( &m-> m_env1Hold ); + m_env1DecKnob-> setModel( &m-> m_env1Dec ); + m_env1SusKnob-> setModel( &m-> m_env1Sus ); + m_env1RelKnob-> setModel( &m-> m_env1Rel ); + m_env1SlopeKnob-> setModel( &m-> m_env1Slope ); + + m_env2PreKnob-> setModel( &m-> m_env2Pre ); + m_env2AttKnob-> setModel( &m-> m_env2Att ); + m_env2HoldKnob-> setModel( &m-> m_env2Hold ); + m_env2DecKnob-> setModel( &m-> m_env2Dec ); + m_env2SusKnob-> setModel( &m-> m_env2Sus ); + m_env2RelKnob-> setModel( &m-> m_env2Rel ); + m_env2SlopeKnob-> setModel( &m-> m_env2Slope ); + + m_o23ModGroup-> setModel( &m-> m_o23Mod ); + m_selectedViewGroup-> setModel( &m-> m_selectedView ); + + m_vol1env1Knob-> setModel( &m-> m_vol1env1 ); + m_vol1env2Knob-> setModel( &m-> m_vol1env2 ); + m_vol1lfo1Knob-> setModel( &m-> m_vol1lfo1 ); + m_vol1lfo2Knob-> setModel( &m-> m_vol1lfo2 ); + + m_vol2env1Knob-> setModel( &m-> m_vol2env1 ); + m_vol2env2Knob-> setModel( &m-> m_vol2env2 ); + m_vol2lfo1Knob-> setModel( &m-> m_vol2lfo1 ); + m_vol2lfo2Knob-> setModel( &m-> m_vol2lfo2 ); + + m_vol3env1Knob-> setModel( &m-> m_vol3env1 ); + m_vol3env2Knob-> setModel( &m-> m_vol3env2 ); + m_vol3lfo1Knob-> setModel( &m-> m_vol3lfo1 ); + m_vol3lfo2Knob-> setModel( &m-> m_vol3lfo2 ); + + m_phs1env1Knob-> setModel( &m-> m_phs1env1 ); + m_phs1env2Knob-> setModel( &m-> m_phs1env2 ); + m_phs1lfo1Knob-> setModel( &m-> m_phs1lfo1 ); + m_phs1lfo2Knob-> setModel( &m-> m_phs1lfo2 ); + + m_phs2env1Knob-> setModel( &m-> m_phs2env1 ); + m_phs2env2Knob-> setModel( &m-> m_phs2env2 ); + m_phs2lfo1Knob-> setModel( &m-> m_phs2lfo1 ); + m_phs2lfo2Knob-> setModel( &m-> m_phs2lfo2 ); + + m_phs3env1Knob-> setModel( &m-> m_phs3env1 ); + m_phs3env2Knob-> setModel( &m-> m_phs3env2 ); + m_phs3lfo1Knob-> setModel( &m-> m_phs3lfo1 ); + m_phs3lfo2Knob-> setModel( &m-> m_phs3lfo2 ); + + m_pit1env1Knob-> setModel( &m-> m_pit1env1 ); + m_pit1env2Knob-> setModel( &m-> m_pit1env2 ); + m_pit1lfo1Knob-> setModel( &m-> m_pit1lfo1 ); + m_pit1lfo2Knob-> setModel( &m-> m_pit1lfo2 ); + + m_pit2env1Knob-> setModel( &m-> m_pit2env1 ); + m_pit2env2Knob-> setModel( &m-> m_pit2env2 ); + m_pit2lfo1Knob-> setModel( &m-> m_pit2lfo1 ); + m_pit2lfo2Knob-> setModel( &m-> m_pit2lfo2 ); + + m_pit3env1Knob-> setModel( &m-> m_pit3env1 ); + m_pit3env2Knob-> setModel( &m-> m_pit3env2 ); + m_pit3lfo1Knob-> setModel( &m-> m_pit3lfo1 ); + m_pit3lfo2Knob-> setModel( &m-> m_pit3lfo2 ); + + m_pw1env1Knob-> setModel( &m-> m_pw1env1 ); + m_pw1env2Knob-> setModel( &m-> m_pw1env2 ); + m_pw1lfo1Knob-> setModel( &m-> m_pw1lfo1 ); + m_pw1lfo2Knob-> setModel( &m-> m_pw1lfo2 ); + + m_sub3env1Knob-> setModel( &m-> m_sub3env1 ); + m_sub3env2Knob-> setModel( &m-> m_sub3env2 ); + m_sub3lfo1Knob-> setModel( &m-> m_sub3lfo1 ); + m_sub3lfo2Knob-> setModel( &m-> m_sub3lfo2 ); + +} + + +void MonstroView::setWidgetBackground( QWidget * _widget, const QString & _pic ) +{ + _widget->setAutoFillBackground( true ); + QPalette pal; + pal.setBrush( _widget->backgroundRole(), + PLUGIN_NAME::getIconPixmap( _pic.toAscii().constData() ) ); + _widget->setPalette( pal ); +} + + +QWidget * MonstroView::setupOperatorsView( QWidget * _parent ) +{ + // operators view + + QWidget * view = new QWidget( _parent ); + view-> setFixedSize( 250, 250 ); + + 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_osc1FtlKnob, KNOBCOL4, O1ROW, "Finetune left", " cents", "osc1Knob" ) + makeknob( m_osc1FtrKnob, KNOBCOL5, O1ROW, "Finetune right", " cents", "osc1Knob" ) + makeknob( m_osc1SpoKnob, KNOBCOL6, O1ROW, "Stereo phase offset", "°", "osc1Knob" ) + makeknob( m_osc1PwKnob, KNOBCOL7, O1ROW, "Pulse width", "%", "osc1Knob" ) + + m_osc1VolKnob -> setVolumeKnob( true ); + + 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_osc2FtlKnob, KNOBCOL4, O2ROW, "Finetune left", " cents", "osc2Knob" ) + makeknob( m_osc2FtrKnob, KNOBCOL5, O2ROW, "Finetune right", " cents", "osc2Knob" ) + makeknob( m_osc2SpoKnob, KNOBCOL6, O2ROW, "Stereo phase offset", "°", "osc2Knob" ) + + m_osc2VolKnob -> setVolumeKnob( true ); + + m_osc2WaveBox = new comboBox( view ); + m_osc2WaveBox -> setGeometry( KNOBCOL7, O2ROW + 4, 42, 22 ); + m_osc2WaveBox->setFont( pointSize<8>( m_osc2WaveBox->font() ) ); + + 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_osc3SpoKnob, KNOBCOL4, O3ROW, "Stereo phase offset", "°", "osc3Knob" ) + makeknob( m_osc3SubKnob, KNOBCOL5, O3ROW, "Sub-osc mix", "", "osc3Knob" ) + + m_osc3Wave1Box = new comboBox( view ); + m_osc3Wave1Box -> setGeometry( 160, O3ROW + 4, 42, 22 ); + m_osc3Wave1Box->setFont( pointSize<8>( m_osc3Wave1Box->font() ) ); + + m_osc3Wave2Box = new comboBox( view ); + m_osc3Wave2Box -> setGeometry( 204, O3ROW + 4, 42, 22 ); + m_osc3Wave2Box->setFont( pointSize<8>( m_osc3Wave2Box->font() ) ); + + m_lfo1WaveBox = new comboBox( view ); + m_lfo1WaveBox -> setGeometry( 2, LFOROW + 7, 42, 22 ); + m_lfo1WaveBox->setFont( pointSize<8>( m_lfo1WaveBox->font() ) ); + + maketsknob( m_lfo1AttKnob, LFOCOL1, LFOROW, "Attack", " ms", "lfoKnob" ) + maketsknob( m_lfo1RateKnob, LFOCOL2, LFOROW, "Rate", " ms", "lfoKnob" ) + makeknob( m_lfo1PhsKnob, LFOCOL3, LFOROW, "Phase", "°", "lfoKnob" ) + + m_lfo2WaveBox = new comboBox( view ); + m_lfo2WaveBox -> setGeometry( 127, LFOROW + 7, 42, 22 ); + m_lfo2WaveBox->setFont( pointSize<8>( m_lfo2WaveBox->font() ) ); + + maketsknob( m_lfo2AttKnob, LFOCOL4, LFOROW, "Attack", " ms", "lfoKnob" ) + maketsknob( m_lfo2RateKnob, LFOCOL5, LFOROW, "Rate", " ms", "lfoKnob" ) + makeknob( m_lfo2PhsKnob, LFOCOL6, LFOROW, "Phase", "°", "lfoKnob" ) + + maketsknob( m_env1PreKnob, KNOBCOL1, E1ROW, "Pre-delay", " ms", "envKnob" ) + maketsknob( m_env1AttKnob, KNOBCOL2, E1ROW, "Attack", " ms", "envKnob" ) + maketsknob( m_env1HoldKnob, KNOBCOL3, E1ROW, "Hold", " ms", "envKnob" ) + maketsknob( m_env1DecKnob, KNOBCOL4, E1ROW, "Decay", " ms", "envKnob" ) + makeknob( m_env1SusKnob, KNOBCOL5, E1ROW, "Sustain", "", "envKnob" ) + maketsknob( m_env1RelKnob, KNOBCOL6, E1ROW, "Release", " ms", "envKnob" ) + makeknob( m_env1SlopeKnob, KNOBCOL7, E1ROW, "Slope", "", "envKnob" ) + + maketsknob( m_env2PreKnob, KNOBCOL1, E2ROW, "Pre-delay", " ms", "envKnob" ) + maketsknob( m_env2AttKnob, KNOBCOL2, E2ROW, "Attack", " ms", "envKnob" ) + maketsknob( m_env2HoldKnob, KNOBCOL3, E2ROW, "Hold", " ms", "envKnob" ) + maketsknob( m_env2DecKnob, KNOBCOL4, E2ROW, "Decay", " ms", "envKnob" ) + makeknob( m_env2SusKnob, KNOBCOL5, E2ROW, "Sustain", "", "envKnob" ) + maketsknob( m_env2RelKnob, KNOBCOL6, E2ROW, "Release", " ms", "envKnob" ) + makeknob( m_env2SlopeKnob, KNOBCOL7, E2ROW, "Slope", "", "envKnob" ) + + // mod selector + pixmapButton * m_mixButton = new pixmapButton( view, NULL ); + m_mixButton -> move( 225, 185 ); + m_mixButton -> setActiveGraphic( PLUGIN_NAME::getIconPixmap( "mix_active" ) ); + m_mixButton -> setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "mix_inactive" ) ); + toolTip::add( m_mixButton, tr( "Mix Osc2 with Osc3" ) ); + + pixmapButton * m_amButton = new pixmapButton( view, NULL ); + m_amButton -> move( 225, 185 + 15 ); + m_amButton -> setActiveGraphic( PLUGIN_NAME::getIconPixmap( "am_active" ) ); + m_amButton -> setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "am_inactive" ) ); + toolTip::add( m_amButton, tr( "Modulate amplitude of Osc3 with Osc2" ) ); + + pixmapButton * m_fmButton = new pixmapButton( view, NULL ); + m_fmButton -> move( 225, 185 + 15*2 ); + m_fmButton -> setActiveGraphic( PLUGIN_NAME::getIconPixmap( "fm_active" ) ); + m_fmButton -> setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "fm_inactive" ) ); + toolTip::add( m_fmButton, tr( "Modulate frequency of Osc3 with Osc2" ) ); + + pixmapButton * m_pmButton = new pixmapButton( view, NULL ); + m_pmButton -> move( 225, 185 + 15*3 ); + m_pmButton -> setActiveGraphic( PLUGIN_NAME::getIconPixmap( "pm_active" ) ); + m_pmButton -> setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "pm_inactive" ) ); + toolTip::add( m_pmButton, tr( "Modulate phase of Osc3 with Osc2" ) ); + + m_o23ModGroup = new automatableButtonGroup( view ); + m_o23ModGroup-> addButton( m_mixButton ); + m_o23ModGroup-> addButton( m_amButton ); + m_o23ModGroup-> addButton( m_fmButton ); + m_o23ModGroup-> addButton( m_pmButton ); + + return( view ); +} + + +QWidget * MonstroView::setupMatrixView( QWidget * _parent ) +{ + // matrix view + + QWidget * view = new QWidget( _parent ); + view-> setFixedSize( 250, 250 ); + + makeknob( m_vol1env1Knob, MATCOL1, MATROW1, "Modulation amount", "", "matrixKnob" ) + makeknob( m_vol1env2Knob, MATCOL2, MATROW1, "Modulation amount", "", "matrixKnob" ) + makeknob( m_vol1lfo1Knob, MATCOL3, MATROW1, "Modulation amount", "", "matrixKnob" ) + makeknob( m_vol1lfo2Knob, MATCOL4, MATROW1, "Modulation amount", "", "matrixKnob" ) + + makeknob( m_vol2env1Knob, MATCOL1, MATROW3, "Modulation amount", "", "matrixKnob" ) + makeknob( m_vol2env2Knob, MATCOL2, MATROW3, "Modulation amount", "", "matrixKnob" ) + makeknob( m_vol2lfo1Knob, MATCOL3, MATROW3, "Modulation amount", "", "matrixKnob" ) + makeknob( m_vol2lfo2Knob, MATCOL4, MATROW3, "Modulation amount", "", "matrixKnob" ) + + makeknob( m_vol3env1Knob, MATCOL1, MATROW5, "Modulation amount", "", "matrixKnob" ) + makeknob( m_vol3env2Knob, MATCOL2, MATROW5, "Modulation amount", "", "matrixKnob" ) + makeknob( m_vol3lfo1Knob, MATCOL3, MATROW5, "Modulation amount", "", "matrixKnob" ) + makeknob( m_vol3lfo2Knob, MATCOL4, MATROW5, "Modulation amount", "", "matrixKnob" ) + + makeknob( m_phs1env1Knob, MATCOL1, MATROW2, "Modulation amount", "", "matrixKnob" ) + makeknob( m_phs1env2Knob, MATCOL2, MATROW2, "Modulation amount", "", "matrixKnob" ) + makeknob( m_phs1lfo1Knob, MATCOL3, MATROW2, "Modulation amount", "", "matrixKnob" ) + makeknob( m_phs1lfo2Knob, MATCOL4, MATROW2, "Modulation amount", "", "matrixKnob" ) + + makeknob( m_phs2env1Knob, MATCOL1, MATROW4, "Modulation amount", "", "matrixKnob" ) + makeknob( m_phs2env2Knob, MATCOL2, MATROW4, "Modulation amount", "", "matrixKnob" ) + makeknob( m_phs2lfo1Knob, MATCOL3, MATROW4, "Modulation amount", "", "matrixKnob" ) + makeknob( m_phs2lfo2Knob, MATCOL4, MATROW4, "Modulation amount", "", "matrixKnob" ) + + makeknob( m_phs3env1Knob, MATCOL1, MATROW6, "Modulation amount", "", "matrixKnob" ) + makeknob( m_phs3env2Knob, MATCOL2, MATROW6, "Modulation amount", "", "matrixKnob" ) + makeknob( m_phs3lfo1Knob, MATCOL3, MATROW6, "Modulation amount", "", "matrixKnob" ) + makeknob( m_phs3lfo2Knob, MATCOL4, MATROW6, "Modulation amount", "", "matrixKnob" ) + + makeknob( m_pit1env1Knob, MATCOL5, MATROW1, "Modulation amount", "", "matrixKnob" ) + makeknob( m_pit1env2Knob, MATCOL6, MATROW1, "Modulation amount", "", "matrixKnob" ) + makeknob( m_pit1lfo1Knob, MATCOL7, MATROW1, "Modulation amount", "", "matrixKnob" ) + makeknob( m_pit1lfo2Knob, MATCOL8, MATROW1, "Modulation amount", "", "matrixKnob" ) + + makeknob( m_pit2env1Knob, MATCOL5, MATROW3, "Modulation amount", "", "matrixKnob" ) + makeknob( m_pit2env2Knob, MATCOL6, MATROW3, "Modulation amount", "", "matrixKnob" ) + makeknob( m_pit2lfo1Knob, MATCOL7, MATROW3, "Modulation amount", "", "matrixKnob" ) + makeknob( m_pit2lfo2Knob, MATCOL8, MATROW3, "Modulation amount", "", "matrixKnob" ) + + makeknob( m_pit3env1Knob, MATCOL5, MATROW5, "Modulation amount", "", "matrixKnob" ) + makeknob( m_pit3env2Knob, MATCOL6, MATROW5, "Modulation amount", "", "matrixKnob" ) + makeknob( m_pit3lfo1Knob, MATCOL7, MATROW5, "Modulation amount", "", "matrixKnob" ) + makeknob( m_pit3lfo2Knob, MATCOL8, MATROW5, "Modulation amount", "", "matrixKnob" ) + + makeknob( m_pw1env1Knob, MATCOL5, MATROW2, "Modulation amount", "", "matrixKnob" ) + makeknob( m_pw1env2Knob, MATCOL6, MATROW2, "Modulation amount", "", "matrixKnob" ) + makeknob( m_pw1lfo1Knob, MATCOL7, MATROW2, "Modulation amount", "", "matrixKnob" ) + makeknob( m_pw1lfo2Knob, MATCOL8, MATROW2, "Modulation amount", "", "matrixKnob" ) + + makeknob( m_sub3env1Knob, MATCOL5, MATROW6, "Modulation amount", "", "matrixKnob" ) + makeknob( m_sub3env2Knob, MATCOL6, MATROW6, "Modulation amount", "", "matrixKnob" ) + makeknob( m_sub3lfo1Knob, MATCOL7, MATROW6, "Modulation amount", "", "matrixKnob" ) + makeknob( m_sub3lfo2Knob, MATCOL8, MATROW6, "Modulation amount", "", "matrixKnob" ) + + return( view ); +} + +extern "C" +{ + +// necessary for getting instance out of shared lib +Plugin * PLUGIN_EXPORT lmms_plugin_main( Model *, void * _data ) +{ + return new MonstroInstrument( static_cast( _data ) ); +} + + +} + + + +#include "moc_Monstro.cxx" diff --git a/plugins/monstro/Monstro.h b/plugins/monstro/Monstro.h new file mode 100644 index 000000000..094859f62 --- /dev/null +++ b/plugins/monstro/Monstro.h @@ -0,0 +1,593 @@ +/* + * Monstro.h - a semi-modular 3-osc synth with modulation matrix + * + * Copyright (c) 2014 Vesa Kivimäki + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + + +#ifndef MONSTRO_H +#define MONSTRO_H + + +#include "Instrument.h" +#include "InstrumentView.h" +#include "AutomatableModel.h" +#include "automatable_button.h" +#include "TempoSyncKnob.h" +#include "NotePlayHandle.h" +#include "pixmap_button.h" +#include "combobox.h" +#include "Oscillator.h" +// #include "fastpow.h" // once grejppi's fastpow gets merged + + +#define makeknob( name, x, y, hint, unit, oname ) \ + name = new knob( knobStyled, view ); \ + name ->move( x, y ); \ + name ->setHintText( tr( hint ) + " ", unit ); \ + name ->setObjectName( oname ); \ + name ->setFixedSize( 20, 20 ); + +#define maketsknob( name, x, y, hint, unit, oname ) \ + name = new TempoSyncKnob( knobStyled, view ); \ + name ->move( x, y ); \ + name ->setHintText( tr( hint ) + " ", unit ); \ + name ->setObjectName( oname ); \ + name ->setFixedSize( 20, 20 ); + +#define setwavemodel( name ) \ + name .addItem( tr( "Sine wave" ), static_cast( new PluginPixmapLoader( "sin" ) ) ); \ + name .addItem( tr( "Triangle wave" ), static_cast( new PluginPixmapLoader( "tri" ) ) ); \ + name .addItem( tr( "Saw wave" ), static_cast( new PluginPixmapLoader( "saw" ) ) ); \ + name .addItem( tr( "Ramp wave" ), static_cast( new PluginPixmapLoader( "ramp" ) ) ); \ + name .addItem( tr( "Square wave" ), static_cast( new PluginPixmapLoader( "sqr" ) ) ); \ + name .addItem( tr( "Moog saw wave" ), static_cast( new PluginPixmapLoader( "moog" ) ) ); \ + name .addItem( tr( "Exponential wave" ), static_cast( new PluginPixmapLoader( "exp" ) ) ); \ + name .addItem( tr( "White noise" ), static_cast( new PluginPixmapLoader( "noise" ) ) ); + + + + +const int O1ROW = 22; +const int O2ROW = 22 + 39; +const int O3ROW = 22 + 39 * 2; +const int LFOROW = 22 + 39 * 3; +const int E1ROW = 22 + 39 * 4; +const int E2ROW = 22 + 39 * 5; + +const int KNOBCOL1 = 16; +const int KNOBCOL2 = 16 + 30; +const int KNOBCOL3 = 16 + 30 * 2; +const int KNOBCOL4 = 16 + 30 * 3; +const int KNOBCOL5 = 16 + 30 * 4; +const int KNOBCOL6 = 16 + 30 * 5; +const int KNOBCOL7 = 16 + 30 * 6; + +const int LFOCOL1 = KNOBCOL2; +const int LFOCOL2 = KNOBCOL2 + 26; +const int LFOCOL3 = KNOBCOL2 + 26*2; +const int LFOCOL4 = 171; +const int LFOCOL5 = 171 + 26; +const int LFOCOL6 = 171 + 26*2; + +const int MATCOL1 = 32; +const int MATCOL2 = 32 + 25; +const int MATCOL3 = 32 + 25*2; +const int MATCOL4 = 32 + 25*3; +const int MATCOL5 = 149; +const int MATCOL6 = 149 + 25; +const int MATCOL7 = 149 + 25*2; +const int MATCOL8 = 149 + 25*3; + +const int MATROW1 = 22; +const int MATROW2 = 22 + 39; +const int MATROW3 = 22 + 39*2; +const int MATROW4 = 22 + 39*3; +const int MATROW5 = 22 + 39*4; +const int MATROW6 = 22 + 39*5; + +const int OPVIEW = 0; +const int MATVIEW = 1; + +const int WAVE_SINE = 0; +const int WAVE_TRI = 1; +const int WAVE_SAW = 2; +const int WAVE_RAMP = 3; +const int WAVE_SQR = 4; +const int WAVE_MOOG = 5; +const int WAVE_EXP = 6; +const int WAVE_NOISE = 7; +const int NUM_WAVES = 8; + +const int MOD_MIX = 0; +const int MOD_AM = 1; +const int MOD_FM = 2; +const int MOD_PM = 3; +const int NUM_MODS = 4; + +const float MODCLIP = 2.0; + +class MonstroInstrument; +class MonstroView; + +// use grejppi's once it's merged +inline double fastPow( double a, double b ) +{ + union + { + double d; + int32_t x[2]; + } u = { a }; + u.x[1] = static_cast( b * ( u.x[1] - 1072632447 ) + 1072632447 ); + u.x[0] = 0; + return u.d; +} + + +class MonstroSynth +{ +public: + MonstroSynth( MonstroInstrument * _i, NotePlayHandle * _nph, + const sample_rate_t _samplerate, fpp_t _frames ); + virtual ~MonstroSynth(); + + void renderOutput( fpp_t _frames, sampleFrame * _buf ); + + inline sample_rate_t samplerate() const + { + return m_samplerate; + } + +private: + + MonstroInstrument * m_parent; + NotePlayHandle * m_nph; + const sample_rate_t m_samplerate; + fpp_t m_fpp; + + sample_t * m_env1_buf; + sample_t * m_env2_buf; + sample_t * m_lfo1_buf; + sample_t * m_lfo2_buf; + + void renderModulators( fpp_t _frames ); + + // linear interpolation + inline sample_t interpolate( sample_t s1, sample_t s2, float x ) + { + return s1 + ( s2 - s1 ) * x; + } + + + inline sample_t calcSlope( sample_t _s, float _slope ) + { + if( _slope == 0.0f ) return _s; + const double exp = fastPow( 10.0, static_cast( _slope * -1.0 ) ); + return fastPow( _s, exp ); + } + + inline sample_t oscillate( int _wave, const float _ph ) + { + switch( _wave ) + { + case WAVE_SINE: + return Oscillator::sinSample( _ph ); + break; + case WAVE_TRI: + return Oscillator::triangleSample( _ph ); + break; + case WAVE_SAW: + return Oscillator::sawSample( _ph ); + break; + case WAVE_RAMP: + return Oscillator::sawSample( _ph ) * -1.0; + break; + case WAVE_SQR: + return Oscillator::squareSample( _ph ); + break; + case WAVE_MOOG: + return Oscillator::moogSawSample( _ph ); + break; + case WAVE_EXP: + return Oscillator::expSample( _ph ); + break; + case WAVE_NOISE: + default: + return Oscillator::noiseSample( _ph ); + break; + } + return 0.0; + } + + + float m_osc1l_phase; + float m_osc1r_phase; + float m_osc2l_phase; + float m_osc2r_phase; + float m_osc3l_phase; + float m_osc3r_phase; + + sample_t m_env1_phase; + sample_t m_env2_phase; + + sample_t m_lfo1_last; + sample_t m_lfo2_last; + +}; + +class MonstroInstrument : public Instrument +{ + Q_OBJECT +public: + MonstroInstrument( InstrumentTrack * _instrument_track ); + virtual ~MonstroInstrument(); + + virtual void playNote( NotePlayHandle * _n, + sampleFrame * _working_buffer ); + virtual void deleteNotePluginData( NotePlayHandle * _n ); + + virtual void saveSettings( QDomDocument & _doc, + QDomElement & _this ); + virtual void loadSettings( const QDomElement & _this ); + + virtual QString nodeName() const; + + virtual f_cnt_t desiredReleaseFrames() const; + + virtual PluginView * instantiateView( QWidget * _parent ); + +public slots: + void updateVolumes(); + void updateFreq(); + void updatePO(); + void updateEnvelope1(); + void updateEnvelope2(); + void updateLFOAtts(); + void updateSamplerate(); + +protected: + float m_osc1l_vol; + float m_osc1r_vol; + float m_osc2l_vol; + float m_osc2r_vol; + float m_osc3l_vol; + float m_osc3r_vol; + + float m_osc1l_freq; + float m_osc1r_freq; + float m_osc2l_freq; + float m_osc2r_freq; + float m_osc3_freq; + + float m_osc1l_po; + float m_osc1r_po; + float m_osc2l_po; + float m_osc2r_po; + float m_osc3l_po; + float m_osc3r_po; + + float m_env1_pre; + float m_env1_att; + float m_env1_hold; + float m_env1_dec; + float m_env1_rel; + + float m_env2_pre; + float m_env2_att; + float m_env2_hold; + float m_env2_dec; + float m_env2_rel; + + f_cnt_t m_env1_len; + f_cnt_t m_env2_len; + + f_cnt_t m_env1_relF; + f_cnt_t m_env2_relF; + + f_cnt_t m_lfo1_att; + f_cnt_t m_lfo2_att; + + sample_rate_t m_samplerate; + fpp_t m_fpp; + +private: + inline float leftCh( float _vol, float _pan ) + { + return ( _pan <= 0 ? 1.0 : 1.0 - ( _pan / 100.0 ) ) * _vol / 100.0; + } + + inline float rightCh( float _vol, float _pan ) + { + return ( _pan >= 0 ? 1.0 : 1.0 + ( _pan / 100.0 ) ) * _vol / 100.0; + } + +////////////////////////////////////// +// models of // +// operator view knobs // +// // +////////////////////////////////////// + + FloatModel m_osc1Vol; + FloatModel m_osc1Pan; + FloatModel m_osc1Crs; + FloatModel m_osc1Ftl; + FloatModel m_osc1Ftr; + FloatModel m_osc1Spo; + FloatModel m_osc1Pw; + + FloatModel m_osc2Vol; + FloatModel m_osc2Pan; + FloatModel m_osc2Crs; + FloatModel m_osc2Ftl; + FloatModel m_osc2Ftr; + FloatModel m_osc2Spo; + ComboBoxModel m_osc2Wave; + + FloatModel m_osc3Vol; + FloatModel m_osc3Pan; + FloatModel m_osc3Crs; + FloatModel m_osc3Spo; + FloatModel m_osc3Sub; + ComboBoxModel m_osc3Wave1; + ComboBoxModel m_osc3Wave2; + + ComboBoxModel m_lfo1Wave; + TempoSyncKnobModel m_lfo1Att; + TempoSyncKnobModel m_lfo1Rate; + FloatModel m_lfo1Phs; + + ComboBoxModel m_lfo2Wave; + TempoSyncKnobModel m_lfo2Att; + TempoSyncKnobModel m_lfo2Rate; + FloatModel m_lfo2Phs; + + TempoSyncKnobModel m_env1Pre; + TempoSyncKnobModel m_env1Att; + TempoSyncKnobModel m_env1Hold; + TempoSyncKnobModel m_env1Dec; + FloatModel m_env1Sus; + TempoSyncKnobModel m_env1Rel; + FloatModel m_env1Slope; + + TempoSyncKnobModel m_env2Pre; + TempoSyncKnobModel m_env2Att; + TempoSyncKnobModel m_env2Hold; + TempoSyncKnobModel m_env2Dec; + FloatModel m_env2Sus; + TempoSyncKnobModel m_env2Rel; + FloatModel m_env2Slope; + + IntModel m_o23Mod; + + IntModel m_selectedView; + +////////////////////////////////////// +// models of // +// modulation matrix view knobs // +// // +////////////////////////////////////// + + FloatModel m_vol1env1; + FloatModel m_vol1env2; + FloatModel m_vol1lfo1; + FloatModel m_vol1lfo2; + + FloatModel m_vol2env1; + FloatModel m_vol2env2; + FloatModel m_vol2lfo1; + FloatModel m_vol2lfo2; + + FloatModel m_vol3env1; + FloatModel m_vol3env2; + FloatModel m_vol3lfo1; + FloatModel m_vol3lfo2; + + FloatModel m_phs1env1; + FloatModel m_phs1env2; + FloatModel m_phs1lfo1; + FloatModel m_phs1lfo2; + + FloatModel m_phs2env1; + FloatModel m_phs2env2; + FloatModel m_phs2lfo1; + FloatModel m_phs2lfo2; + + FloatModel m_phs3env1; + FloatModel m_phs3env2; + FloatModel m_phs3lfo1; + FloatModel m_phs3lfo2; + + FloatModel m_pit1env1; + FloatModel m_pit1env2; + FloatModel m_pit1lfo1; + FloatModel m_pit1lfo2; + + FloatModel m_pit2env1; + FloatModel m_pit2env2; + FloatModel m_pit2lfo1; + FloatModel m_pit2lfo2; + + FloatModel m_pit3env1; + FloatModel m_pit3env2; + FloatModel m_pit3lfo1; + FloatModel m_pit3lfo2; + + FloatModel m_pw1env1; + FloatModel m_pw1env2; + FloatModel m_pw1lfo1; + FloatModel m_pw1lfo2; + + FloatModel m_sub3env1; + FloatModel m_sub3env2; + FloatModel m_sub3lfo1; + FloatModel m_sub3lfo2; + + friend class MonstroSynth; + friend class MonstroView; + +}; + +class MonstroView : public InstrumentView +{ + Q_OBJECT +public: + MonstroView( Instrument * _instrument, + QWidget * _parent ); + virtual ~MonstroView(); + +protected slots: + void updateLayout(); + +private: + virtual void modelChanged(); + + void setWidgetBackground( QWidget * _widget, const QString & _pic ); + QWidget * setupOperatorsView( QWidget * _parent ); + QWidget * setupMatrixView( QWidget * _parent ); + +////////////////////////////////////// +// // +// operator view knobs // +// // +////////////////////////////////////// + + knob * m_osc1VolKnob; + knob * m_osc1PanKnob; + knob * m_osc1CrsKnob; + knob * m_osc1FtlKnob; + knob * m_osc1FtrKnob; + knob * m_osc1SpoKnob; + knob * m_osc1PwKnob; + + knob * m_osc2VolKnob; + knob * m_osc2PanKnob; + knob * m_osc2CrsKnob; + knob * m_osc2FtlKnob; + knob * m_osc2FtrKnob; + knob * m_osc2SpoKnob; + comboBox * m_osc2WaveBox; + + knob * m_osc3VolKnob; + knob * m_osc3PanKnob; + knob * m_osc3CrsKnob; + knob * m_osc3SpoKnob; + knob * m_osc3SubKnob; + comboBox * m_osc3Wave1Box; + comboBox * m_osc3Wave2Box; + + comboBox * m_lfo1WaveBox; + TempoSyncKnob * m_lfo1AttKnob; + TempoSyncKnob * m_lfo1RateKnob; + knob * m_lfo1PhsKnob; + + comboBox * m_lfo2WaveBox; + TempoSyncKnob * m_lfo2AttKnob; + TempoSyncKnob * m_lfo2RateKnob; + knob * m_lfo2PhsKnob; + + TempoSyncKnob * m_env1PreKnob; + TempoSyncKnob * m_env1AttKnob; + TempoSyncKnob * m_env1HoldKnob; + TempoSyncKnob * m_env1DecKnob; + knob * m_env1SusKnob; + TempoSyncKnob * m_env1RelKnob; + knob * m_env1SlopeKnob; + + TempoSyncKnob * m_env2PreKnob; + TempoSyncKnob * m_env2AttKnob; + TempoSyncKnob * m_env2HoldKnob; + TempoSyncKnob * m_env2DecKnob; + knob * m_env2SusKnob; + TempoSyncKnob * m_env2RelKnob; + knob * m_env2SlopeKnob; + + automatableButtonGroup * m_o23ModGroup; + + automatableButtonGroup * m_selectedViewGroup; + + QWidget * m_operatorsView; + QWidget * m_matrixView; + +///////////////////////////////// +// // +// matrix view knobs // +// // +///////////////////////////////// + + knob * m_vol1env1Knob; + knob * m_vol1env2Knob; + knob * m_vol1lfo1Knob; + knob * m_vol1lfo2Knob; + + knob * m_vol2env1Knob; + knob * m_vol2env2Knob; + knob * m_vol2lfo1Knob; + knob * m_vol2lfo2Knob; + + knob * m_vol3env1Knob; + knob * m_vol3env2Knob; + knob * m_vol3lfo1Knob; + knob * m_vol3lfo2Knob; + + knob * m_phs1env1Knob; + knob * m_phs1env2Knob; + knob * m_phs1lfo1Knob; + knob * m_phs1lfo2Knob; + + knob * m_phs2env1Knob; + knob * m_phs2env2Knob; + knob * m_phs2lfo1Knob; + knob * m_phs2lfo2Knob; + + knob * m_phs3env1Knob; + knob * m_phs3env2Knob; + knob * m_phs3lfo1Knob; + knob * m_phs3lfo2Knob; + + knob * m_pit1env1Knob; + knob * m_pit1env2Knob; + knob * m_pit1lfo1Knob; + knob * m_pit1lfo2Knob; + + knob * m_pit2env1Knob; + knob * m_pit2env2Knob; + knob * m_pit2lfo1Knob; + knob * m_pit2lfo2Knob; + + knob * m_pit3env1Knob; + knob * m_pit3env2Knob; + knob * m_pit3lfo1Knob; + knob * m_pit3lfo2Knob; + + knob * m_pw1env1Knob; + knob * m_pw1env2Knob; + knob * m_pw1lfo1Knob; + knob * m_pw1lfo2Knob; + + knob * m_sub3env1Knob; + knob * m_sub3env2Knob; + knob * m_sub3lfo1Knob; + knob * m_sub3lfo2Knob; + +}; + + +#endif diff --git a/plugins/monstro/am_active.png b/plugins/monstro/am_active.png new file mode 100644 index 0000000000000000000000000000000000000000..785ac4faeacfee72670864a07d7a1f7c735a3801 GIT binary patch literal 730 zcmV<00ww*4P)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00KfuL_t(I%Z-#fYZXxxg}=4W z6hgH1i=RwiwFt|Lc|~%LlE&r z9ygDh*S#~_;+&aW3&nxMz?r?*UhAxNMzvba0VGw+-I2uqK4rbTlK~tY8An+s>c~)* zAq!YAkdO>YY>&+p1@1XTE5}*_n z+`P)B0=E@mnE}w?f2Vm}wLJ1a72rP}=p|!fq{NvH;+uHOb`RX!rw{IXB zzTTkm4Vsu{m#It3$&K&h-eUq&Vk)D7iN*f!i$IW>^nf&k6AmzJ`~oUga8 z5xRS@u5EExQuimr1iUbIm)g)UdoNw5d(VEB-j3sV#d2V1n0%#9@1Y}6suKq$it6w0 z_rV8K$<2@gonoLU2d|oMS|wI48z~@#I+?IFHmyp!klLn5 zcyc-0GDTIRYikRs0;(W99e}0cQiwb1>+5rO$I5%$cAo$GyZmkcH;A+BM6GX2-v9sr M07*qoM6N<$f)*e?a{vGU literal 0 HcmV?d00001 diff --git a/plugins/monstro/am_inactive.png b/plugins/monstro/am_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..4b177193048bd1b8a4f45b5d16926fd75fb3fdd5 GIT binary patch literal 525 zcmV+o0`mQdP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00DJLL_t(I%bk?H&gw7>Ku=mg z9gu(yh`s>>BQL|m3&I<~))g@$#E*(ZhYlT}Eow@Ar{>ZR`0fQuRwUa=j_o*VFc=7c zQp%`^pp@c&rHU638UT~Y1k18eN}2VYlx0a-mfY`milQLTbF|hJMZt2p#1at`{0UV> z^hgO{y$bwRMCAEE5kYIsd_L!VJ{$XLwPH4#al74&&G&tL-$z9L5ZJYgmU-NsO$9lb{)oNi`R;?i~36IAkqtS@*cucq3B@DxwzbZw)-+#&sK)J3f z)9Li%Nzq!HDXDa^SkzPg_EA6Xd--g>nGo|y^m;uJ5tC|l+i$e*AVh>eP7LxB%$8ki P00000NkvXXu0mjfT+P~| literal 0 HcmV?d00001 diff --git a/plugins/monstro/artwork_mat.png b/plugins/monstro/artwork_mat.png new file mode 100644 index 0000000000000000000000000000000000000000..1a4240b5102b959a79c8c0512a5a0778eaaf5b1d GIT binary patch literal 61598 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 z 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 Of6DS2a-6QB2eHV0l>Lb4zQv( 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

KTtJkY7M|93 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 N002ovPDHLkV1jQEkqiI; literal 0 HcmV?d00001 diff --git a/plugins/monstro/fm_active.png b/plugins/monstro/fm_active.png new file mode 100644 index 0000000000000000000000000000000000000000..cd4ee859d03bc5cca2f65fe23ad40b603efd2905 GIT binary patch literal 678 zcmV;X0$KfuP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00It4L_t(I%Z-#jYm`9{#(%SW z(VU#-L~N|Ikq}StL_4_;prw+=Phe$l=O?gGK?Jd|F{dD68U<0&!b&g~0-~r0fe0CONq(Nl!n zF?aSI!OH-7oLYqs;Pju|W%b^*!sE!5TWr34#>R_B%-wlI+_xVbK3+bDjkY*?^CrX4x>*!Y&c+j;W{FM4hIZBukds2TS-4<9{7XS&RQmB zu}1&(A~>vfZxCuzljNuZV&GN)+xCd%`4+tk#~8eO1;Et7L;UK02cZA*G4;cXpOUjP6A literal 0 HcmV?d00001 diff --git a/plugins/monstro/fm_inactive.png b/plugins/monstro/fm_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..a96128b7db2f1e72ac9d1748d58421947957a1d4 GIT binary patch literal 484 zcmVW02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00B%%L_t(I%dM2Xssb?(g}=-D;bhr=PK(}~03z-TnWS_{B(xg^Un27|#9X@&55y%IuTGMN-- zo6Uy%{myo~rQh%4z2|&B6Gc&_P#;T<Q5?wOV1VMMPfS z`BB?+yIpR#8|`-cZH{ryY1t{|m)|)hcSzYOkH>?>V(~M{b$NL#|7E);$$53lgQ0Ff a)Zq&^)wc^~=^|AC0000undR< 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 Am;e9( literal 0 HcmV?d00001 diff --git a/plugins/monstro/moog.png b/plugins/monstro/moog.png new file mode 100644 index 0000000000000000000000000000000000000000..1a657b161324cabb6a67bade9c17f35d366bc4b2 GIT binary patch literal 402 zcmV;D0d4+?P)UyOwITYqUl3@ z`^~&i!R-S}Kme{A8Pz_p4NQSWAZFN`aiChADNiZxQ(r8rSv)q_9oH&+XFsIIht w)2Lt68AAxiY5^Ppmp})#t9BcH&i6rl0^94WKmdLPuK)l507*qoM6N<$f>Z;NXaE2J literal 0 HcmV?d00001 diff --git a/plugins/monstro/noise.png b/plugins/monstro/noise.png new file mode 100644 index 0000000000000000000000000000000000000000..cd22af02b51a24ec51095a77b26008a3855a55f7 GIT binary patch literal 478 zcmV<40U`d0P)_CTR4a#c!5bTb=*}yP|ygMa1Ng<{}xM0rmeO0IUK8la2PwaKUuOz*jIO7 z!@DHc2P{<=ID}8wu8*@__l5H~h4+{YI9=d(%oq5z07*qoM6N<$g49yUp#T5? literal 0 HcmV?d00001 diff --git a/plugins/monstro/opview_active.png b/plugins/monstro/opview_active.png new file mode 100644 index 0000000000000000000000000000000000000000..d993b111b3572d509548e4cb671f5ce36e128950 GIT binary patch literal 2129 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 Xs^G$%TA4L+00000NkvXXu0mjffBDQl literal 0 HcmV?d00001 diff --git a/plugins/monstro/ramp.png b/plugins/monstro/ramp.png new file mode 100644 index 0000000000000000000000000000000000000000..94f23b59f4d3ae623724cea67c983c344ac83f9d GIT binary patch literal 333 zcmeAS@N?(olHy`uVBq!ia0vp^d_XL~!3HGNrubO_Db50q$YKTtZeb8+WSBKa0w~B{ z;_2(kevesJM4dk%t<4lDBw6AbQR1ARo12kkZ7lQxBL zd|)a2XXAI!%p$*`REtmX*bLVO^+|1>1_#&|F#4#PcE8&3tMKCAd)G^RZb{_4V^&|F zojISU*6jf6izBkrosxa{&NM{d*~pqz*Y!ax;+SdVf_KYfn-0%nn4b8JVa3Yyl-Lc^hNe^yeNp zV{=%{?)2J1?HMzV-_Tf?XnH-n@!P2nLd92WE;8gk-oTTu^k`39uuo%HVN0crZ*!fj zsj+xruc(d75zot^uVmM6XnWpq<8O9>>)F+%dmb$~yKK?3tJdF?A1&s6lbR+!duh11 z;KyrEO+{}UWRg>Uv~Fo#&-#-g{tGkTi1HTpU#zb?aVh05Z`>3A8;jprUjcfV!PC{x JWt~$(699#lkk9}C literal 0 HcmV?d00001 diff --git a/plugins/monstro/sin.png b/plugins/monstro/sin.png new file mode 100644 index 0000000000000000000000000000000000000000..f9441bdfbc0d9f2a9efe464ea1aee44d57522b95 GIT binary patch literal 398 zcmV;90df9`P)ABwe#cJ%<8t z2W$aL;D9cY^q@aIN*cO-zYYqLqNGo^gQPe2g*L7NYTyuf2BM#t`|4HT0O$kJ%#xWU zhx;CD1&@GlV3GM3-lSU6UQt$Py1D_(fk_5NAOXjoZgSw(AGoT3A#ek{6yO}#FY4R@ zHk(vOz{t$LnrKU%HLwl504L`@=J&6*RLk@Z|Hn0CpYh sw2DDelCkpKVy07*qoM6N<$f))^%egFUf literal 0 HcmV?d00001 diff --git a/plugins/monstro/sqr.png b/plugins/monstro/sqr.png new file mode 100644 index 0000000000000000000000000000000000000000..47748c66830d3acc5bd245bf6ea27e9e0c633166 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^d_XL~!3HGNrubO_Db50q$YKTtZeb8+WSBKa0w~B{ z;_2(kevesJL|xpOOD-8GBw6AbQR1ARo12%J#2SL$jpaJZWLW%oj0wfZ*!5{V}{+aY!zCw>;4DEKTJ+O k-cfPFXX?w)$99LzJ6{-{5?uZk=rslgPgg&ebxsLQ0OxsuO#lD@ literal 0 HcmV?d00001 diff --git a/plugins/monstro/tri.png b/plugins/monstro/tri.png new file mode 100644 index 0000000000000000000000000000000000000000..9764a36e8bdfdfb2eada0673e3e5846cbf1eabc9 GIT binary patch literal 380 zcmV-?0fYXDP)&L#D9n^!8)alC>DYJ06)S{NFn*2 zEv#&{uoP1Stc=})AVkDkun;633*XAByE_GPYG)s_FIR;#N&X{+H!3hNtSYI%^d7fEVDpkJvJ44eY2xVnU{w!+)Y4@n5LJ aX8#WK`s*geiHIEl0000 Date: Sat, 29 Mar 2014 23:08:25 +0200 Subject: [PATCH 02/11] Add applyrelease --- plugins/monstro/Monstro.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/monstro/Monstro.cpp b/plugins/monstro/Monstro.cpp index e3b843891..d74127089 100644 --- a/plugins/monstro/Monstro.cpp +++ b/plugins/monstro/Monstro.cpp @@ -874,7 +874,7 @@ void MonstroInstrument::playNote( NotePlayHandle * _n, ms->renderOutput( frames, _working_buffer ); - //applyRelease( _working_buffer, _n ); + applyRelease( _working_buffer, _n ); instrumentTrack()->processAudioBuffer( _working_buffer, frames, _n ); } From 460bb0420ccab24d7e3f8a3af78350b3631ffa92 Mon Sep 17 00:00:00 2001 From: Vesa Date: Sat, 29 Mar 2014 23:23:04 +0200 Subject: [PATCH 03/11] Negative volume env. fix --- plugins/monstro/Monstro.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/monstro/Monstro.cpp b/plugins/monstro/Monstro.cpp index d74127089..7e5364521 100644 --- a/plugins/monstro/Monstro.cpp +++ b/plugins/monstro/Monstro.cpp @@ -110,9 +110,9 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) #define modulatevol( car, mod ) \ if( mod##_e1 > 0.0 ) car = qBound( 0.0f, car * ( 1.0f - mod##_e1 + mod##_e1 * m_env1_buf[f] ), MODCLIP ); \ - if( mod##_e1 < 0.0 ) car = qBound( 0.0f, car * ( 0.0f - mod##_e1 + mod##_e1 * m_env1_buf[f] ), MODCLIP ); \ + if( mod##_e1 < 0.0 ) car = qBound( 0.0f, car * ( 1.0f + mod##_e1 * m_env1_buf[f] ), MODCLIP ); \ if( mod##_e2 > 0.0 ) car = qBound( 0.0f, car * ( 1.0f - mod##_e2 + mod##_e2 * m_env2_buf[f] ), MODCLIP ); \ - if( mod##_e2 < 0.0 ) car = qBound( 0.0f, car * ( 0.0f - mod##_e2 + mod##_e2 * m_env2_buf[f] ), MODCLIP ); \ + if( mod##_e2 < 0.0 ) car = qBound( 0.0f, car * ( 1.0f + mod##_e2 * m_env2_buf[f] ), MODCLIP ); \ if( mod##_l1 != 0.0 ) car = qBound( 0.0f, car * ( 1.0f + mod##_l1 * m_lfo1_buf[f] ), MODCLIP ); \ if( mod##_l2 != 0.0 ) car = qBound( 0.0f, car * ( 1.0f + mod##_l2 * m_lfo2_buf[f] ), MODCLIP ); From 8aad594cbd2d7052573cbd821b79d5aae0b4e2e2 Mon Sep 17 00:00:00 2001 From: Vesa Date: Sun, 30 Mar 2014 00:21:07 +0200 Subject: [PATCH 04/11] Monstro: algorithm tweaks, fixes, optimizations --- plugins/monstro/Monstro.cpp | 79 +++++++++++++++++++++---------------- plugins/monstro/Monstro.h | 3 ++ 2 files changed, 48 insertions(+), 34 deletions(-) diff --git a/plugins/monstro/Monstro.cpp b/plugins/monstro/Monstro.cpp index 7e5364521..2940813bc 100644 --- a/plugins/monstro/Monstro.cpp +++ b/plugins/monstro/Monstro.cpp @@ -96,17 +96,24 @@ MonstroSynth::~MonstroSynth() void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) { // macros for modulating with env/lfos -#define modulatefreq( car, mod, min, max ) \ - if( mod##_e1 != 0.0 ) car = qBound( min, car * static_cast( fastPow( 2, m_env1_buf[f] * mod##_e1 ) ), max ); \ - if( mod##_e2 != 0.0 ) car = qBound( min, car * static_cast( fastPow( 2, m_env2_buf[f] * mod##_e2 ) ), max ); \ - if( mod##_l1 != 0.0 ) car = qBound( min, car * static_cast( fastPow( 2, m_lfo1_buf[f] * mod##_l1 ) ), max ); \ - if( mod##_l2 != 0.0 ) car = qBound( min, car * static_cast( fastPow( 2, m_lfo2_buf[f] * mod##_l2 ) ), max ); +#define modulatefreq( car, mod ) \ + if( mod##_e1 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 10, m_env1_buf[f] * mod##_e1 ) ), MAX_FREQ ); \ + if( mod##_e2 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 10, m_env2_buf[f] * mod##_e2 ) ), MAX_FREQ ); \ + if( mod##_l1 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 10, m_lfo1_buf[f] * mod##_l1 ) ), MAX_FREQ ); \ + if( mod##_l2 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 10, m_lfo2_buf[f] * mod##_l2 ) ), MAX_FREQ ); + +#define modulateabs( car, mod ) \ + if( mod##_e1 != 0.0 ) car = qBound( 0.0f, car + mod##_e1 / 2 * m_env1_buf[f], 1.0f ); \ + if( mod##_e2 != 0.0 ) car = qBound( 0.0f, car + mod##_e2 / 2 * m_env2_buf[f], 1.0f ); \ + if( mod##_l1 != 0.0 ) car = qBound( 0.0f, car + mod##_l1 / 2 * m_lfo1_buf[f], 1.0f ); \ + if( mod##_l2 != 0.0 ) car = qBound( 0.0f, car + mod##_l2 / 2 * m_lfo2_buf[f], 1.0f ); + +#define modulatephs( car, mod ) \ + if( mod##_e1 != 0.0 ) car = fraction( car + mod##_e1 / 2 * m_env1_buf[f] ); \ + if( mod##_e2 != 0.0 ) car = fraction( car + mod##_e2 / 2 * m_env2_buf[f] ); \ + if( mod##_l1 != 0.0 ) car = fraction( car + mod##_l1 / 2 * m_lfo1_buf[f] ); \ + if( mod##_l2 != 0.0 ) car = fraction( car + mod##_l2 / 2 * m_lfo2_buf[f] ); -#define modulateabs( car, mod, min, max ) \ - if( mod##_e1 != 0.0 ) car = qBound( min, car + mod##_e1 / 2 * m_env1_buf[f], max ); \ - if( mod##_e2 != 0.0 ) car = qBound( min, car + mod##_e2 / 2 * m_env2_buf[f], max ); \ - if( mod##_l1 != 0.0 ) car = qBound( min, car + mod##_l1 / 2 * m_lfo1_buf[f], max ); \ - if( mod##_l2 != 0.0 ) car = qBound( min, car + mod##_l2 / 2 * m_lfo2_buf[f], max ); #define modulatevol( car, mod ) \ if( mod##_e1 > 0.0 ) car = qBound( 0.0f, car * ( 1.0f - mod##_e1 + mod##_e1 * m_env1_buf[f] ), MODCLIP ); \ @@ -221,6 +228,10 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) //o2-o3 modulation const int omod = m_parent->m_o23Mod.value(); + + // frequency helpers + + const int srquot = 1.0 / static_cast( m_samplerate ); /////////////////////////// // // @@ -251,18 +262,18 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) // calc and mod frequencies float o1l_f = o1lfb; float o1r_f = o1rfb; - modulatefreq( o1l_f, o1f, 20.0f, 20000.0f ) - modulatefreq( o1r_f, o1f, 20.0f, 20000.0f ) + modulatefreq( o1l_f, o1f ) + modulatefreq( o1r_f, o1f ) // calc and modulate phase float o1l_p = m_osc1l_phase + o1lpo; float o1r_p = m_osc1r_phase + o1rpo; - modulateabs( o1l_p, o1p, 0.0f, 1.0f ) - modulateabs( o1r_p, o1p, 0.0f, 1.0f ) + modulatephs( o1l_p, o1p ) + modulatephs( o1r_p, o1p ) // calc and modulate pulse float o1_pw = pw; - modulateabs( o1_pw, o1pw, -1.0f, 1.0f ) + modulateabs( o1_pw, o1pw ) // pulse wave osc sample_t O1L = ( o1l_p < o1_pw ) ? 1.0f : -1.0f; @@ -275,8 +286,8 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) modulatevol( O1R, o1v ) // update osc1 phases - m_osc1l_phase = fraction( m_osc1l_phase + ( 1.0 / ( static_cast( m_samplerate ) / o1l_f ) ) ); - m_osc1r_phase = fraction( m_osc1r_phase + ( 1.0 / ( static_cast( m_samplerate ) / o1r_f ) ) ); + m_osc1l_phase = fraction( m_osc1l_phase + srquot / o1l_f ); + m_osc1r_phase = fraction( m_osc1r_phase + srquot / o1r_f ); ///////////////////////////// // // @@ -287,14 +298,14 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) // calc and mod frequencies float o2l_f = o2lfb; float o2r_f = o2rfb; - modulatefreq( o2l_f, o2f, 20.0f, 20000.0f ) - modulatefreq( o2r_f, o2f, 20.0f, 20000.0f ) + modulatefreq( o2l_f, o2f ) + modulatefreq( o2r_f, o2f ) // calc and modulate phase float o2l_p = m_osc2l_phase + o2lpo; float o2r_p = m_osc2r_phase + o2rpo; - modulateabs( o2l_p, o2p, 0.0f, 1.0f ) - modulateabs( o2r_p, o2p, 0.0f, 1.0f ) + modulatephs( o2l_p, o2p ) + modulatephs( o2r_p, o2p ) // multi-wave DC Oscillator sample_t O2L = oscillate( o2w, o2l_p ); @@ -307,8 +318,8 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) modulatevol( O2R, o2v ) // update osc2 phases - m_osc2l_phase = fraction( m_osc2l_phase + ( 1.0 / ( static_cast( m_samplerate ) / o2l_f ) ) ); - m_osc2r_phase = fraction( m_osc2r_phase + ( 1.0 / ( static_cast( m_samplerate ) / o2r_f ) ) ); + m_osc2l_phase = fraction( m_osc2l_phase + srquot / o2l_f ); + m_osc2r_phase = fraction( m_osc2r_phase + srquot / o2r_f ); ///////////////////////////// // // @@ -319,25 +330,25 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) // calc and mod frequencies float o3l_f = o3fb; float o3r_f = o3fb; - modulatefreq( o3l_f, o3f, 20.0f, 20000.0f ) - modulatefreq( o3r_f, o3f, 20.0f, 20000.0f ) + modulatefreq( o3l_f, o3f ) + modulatefreq( o3r_f, o3f ) // o2 modulation? if( omod == MOD_FM ) { - o3l_f = qBound( 20.0f, o3l_f * static_cast( fastPow( 2, O2L ) ), 20000.0f ); - o3r_f = qBound( 20.0f, o3r_f * static_cast( fastPow( 2, O2R ) ), 20000.0f ); + o3l_f = qBound( MIN_FREQ, o3l_f * static_cast( fastPow( 4, O2L ) ), MAX_FREQ ); + o3r_f = qBound( MIN_FREQ, o3r_f * static_cast( fastPow( 4, O2R ) ), MAX_FREQ ); } // calc and modulate phase float o3l_p = m_osc3l_phase + o3lpo; float o3r_p = m_osc3r_phase + o3rpo; - modulateabs( o3l_p, o3p, 0.0f, 1.0f ) - modulateabs( o3r_p, o3p, 0.0f, 1.0f ) + modulatephs( o3l_p, o3p ) + modulatephs( o3r_p, o3p ) // o2 modulation? if( omod == MOD_PM ) { - o3l_p = qBound( 0.0f, o3l_p + O2L/2, 1.0f ); - o3r_p = qBound( 0.0f, o3r_p + O2R/2, 1.0f ); + o3l_p = fraction( o3l_p + O2L/2 ); + o3r_p = fraction( o3r_p + O2R/2 ); } // multi-wave DC Oscillator, sub-osc 1 @@ -350,7 +361,7 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) // calc and modulate sub float sub = o3sub; - modulateabs( sub, o3s, 0.0f, 1.0f ) + modulateabs( sub, o3s ) sample_t O3L = interpolate( O3AL, O3BL, sub ); sample_t O3R = interpolate( O3AR, O3BR, sub ); @@ -368,8 +379,8 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) } // update osc3 phases - m_osc3l_phase = fraction( m_osc3l_phase + ( 1.0f / ( static_cast( m_samplerate ) / o3l_f ) ) ); - m_osc3r_phase = fraction( m_osc3r_phase + ( 1.0f / ( static_cast( m_samplerate ) / o3r_f ) ) ); + m_osc3l_phase = fraction( m_osc3l_phase + srquot / o3l_f ); + m_osc3r_phase = fraction( m_osc3r_phase + srquot / o3r_f ); _buf[f][0] = O1L + O3L + ( omod == MOD_MIX ? O2L : 0.0f ); _buf[f][1] = O1R + O3R + ( omod == MOD_MIX ? O2R : 0.0f ); diff --git a/plugins/monstro/Monstro.h b/plugins/monstro/Monstro.h index 094859f62..e251b60b2 100644 --- a/plugins/monstro/Monstro.h +++ b/plugins/monstro/Monstro.h @@ -125,6 +125,9 @@ const int NUM_MODS = 4; const float MODCLIP = 2.0; +const float MIN_FREQ = 18.0f; +const float MAX_FREQ = 48000.0f; + class MonstroInstrument; class MonstroView; From c892c7a819473d01e9e65c4f2568669aa44c0ef7 Mon Sep 17 00:00:00 2001 From: Vesa Date: Sun, 30 Mar 2014 00:29:03 +0200 Subject: [PATCH 05/11] Monstro: Fix previous stupidity... --- plugins/monstro/Monstro.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/plugins/monstro/Monstro.cpp b/plugins/monstro/Monstro.cpp index 2940813bc..554756c97 100644 --- a/plugins/monstro/Monstro.cpp +++ b/plugins/monstro/Monstro.cpp @@ -231,8 +231,6 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) // frequency helpers - const int srquot = 1.0 / static_cast( m_samplerate ); - /////////////////////////// // // // start buffer loop // @@ -286,8 +284,8 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) modulatevol( O1R, o1v ) // update osc1 phases - m_osc1l_phase = fraction( m_osc1l_phase + srquot / o1l_f ); - m_osc1r_phase = fraction( m_osc1r_phase + srquot / o1r_f ); + m_osc1l_phase = fraction( m_osc1l_phase + 1.0f / ( static_cast( m_samplerate ) / o1l_f ) ); + m_osc1r_phase = fraction( m_osc1r_phase + 1.0f / ( static_cast( m_samplerate ) / o1r_f ) ); ///////////////////////////// // // @@ -318,8 +316,8 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) modulatevol( O2R, o2v ) // update osc2 phases - m_osc2l_phase = fraction( m_osc2l_phase + srquot / o2l_f ); - m_osc2r_phase = fraction( m_osc2r_phase + srquot / o2r_f ); + m_osc2l_phase = fraction( m_osc2l_phase + ( 1.0f / static_cast( m_samplerate ) / o2l_f ) ); + m_osc2r_phase = fraction( m_osc2r_phase + ( 1.0f / static_cast( m_samplerate ) / o2r_f ) ); ///////////////////////////// // // @@ -379,8 +377,8 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) } // update osc3 phases - m_osc3l_phase = fraction( m_osc3l_phase + srquot / o3l_f ); - m_osc3r_phase = fraction( m_osc3r_phase + srquot / o3r_f ); + m_osc3l_phase = fraction( m_osc3l_phase + ( 1.0f / static_cast( m_samplerate ) / o3l_f ) ); + m_osc3r_phase = fraction( m_osc3r_phase + ( 1.0f / static_cast( m_samplerate ) / o3r_f ) ); _buf[f][0] = O1L + O3L + ( omod == MOD_MIX ? O2L : 0.0f ); _buf[f][1] = O1R + O3R + ( omod == MOD_MIX ? O2R : 0.0f ); From 252e0609fa9bf31940f7d3fe96cb2c435b5a7b5a Mon Sep 17 00:00:00 2001 From: Vesa Date: Sun, 30 Mar 2014 00:32:26 +0200 Subject: [PATCH 06/11] Monstro: fix again... --- plugins/monstro/Monstro.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/monstro/Monstro.cpp b/plugins/monstro/Monstro.cpp index 554756c97..4b1149037 100644 --- a/plugins/monstro/Monstro.cpp +++ b/plugins/monstro/Monstro.cpp @@ -316,8 +316,8 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) modulatevol( O2R, o2v ) // update osc2 phases - m_osc2l_phase = fraction( m_osc2l_phase + ( 1.0f / static_cast( m_samplerate ) / o2l_f ) ); - m_osc2r_phase = fraction( m_osc2r_phase + ( 1.0f / static_cast( m_samplerate ) / o2r_f ) ); + m_osc2l_phase = fraction( m_osc2l_phase + 1.0f / ( static_cast( m_samplerate ) / o2l_f ) ); + m_osc2r_phase = fraction( m_osc2r_phase + 1.0f / ( static_cast( m_samplerate ) / o2r_f ) ); ///////////////////////////// // // @@ -377,8 +377,8 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) } // update osc3 phases - m_osc3l_phase = fraction( m_osc3l_phase + ( 1.0f / static_cast( m_samplerate ) / o3l_f ) ); - m_osc3r_phase = fraction( m_osc3r_phase + ( 1.0f / static_cast( m_samplerate ) / o3r_f ) ); + m_osc3l_phase = fraction( m_osc3l_phase + 1.0f / ( static_cast( m_samplerate ) / o3l_f ) ); + m_osc3r_phase = fraction( m_osc3r_phase + 1.0f / ( static_cast( m_samplerate ) / o3r_f ) ); _buf[f][0] = O1L + O3L + ( omod == MOD_MIX ? O2L : 0.0f ); _buf[f][1] = O1R + O3R + ( omod == MOD_MIX ? O2R : 0.0f ); From 9f594268c8fe8cce5f09286a640b3ff9a9facef4 Mon Sep 17 00:00:00 2001 From: Vesa Date: Sun, 30 Mar 2014 01:43:20 +0200 Subject: [PATCH 07/11] Monstro - More fixes.. --- plugins/monstro/Monstro.cpp | 53 ++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/plugins/monstro/Monstro.cpp b/plugins/monstro/Monstro.cpp index 4b1149037..708a31cb2 100644 --- a/plugins/monstro/Monstro.cpp +++ b/plugins/monstro/Monstro.cpp @@ -96,21 +96,21 @@ MonstroSynth::~MonstroSynth() void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) { // macros for modulating with env/lfos -#define modulatefreq( car, mod ) \ - if( mod##_e1 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 10, m_env1_buf[f] * mod##_e1 ) ), MAX_FREQ ); \ - if( mod##_e2 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 10, m_env2_buf[f] * mod##_e2 ) ), MAX_FREQ ); \ - if( mod##_l1 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 10, m_lfo1_buf[f] * mod##_l1 ) ), MAX_FREQ ); \ - if( mod##_l2 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 10, m_lfo2_buf[f] * mod##_l2 ) ), MAX_FREQ ); +#define modulatefreq( car, mod ) \ + if( mod##_e1 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 10.0, m_env1_buf[f] * mod##_e1 ) ), MAX_FREQ ); \ + if( mod##_e2 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 10.0, m_env2_buf[f] * mod##_e2 ) ), MAX_FREQ ); \ + if( mod##_l1 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 5.0, m_lfo1_buf[f] * mod##_l1 ) ), MAX_FREQ ); \ + if( mod##_l2 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 5.0, m_lfo2_buf[f] * mod##_l2 ) ), MAX_FREQ ); #define modulateabs( car, mod ) \ - if( mod##_e1 != 0.0 ) car = qBound( 0.0f, car + mod##_e1 / 2 * m_env1_buf[f], 1.0f ); \ - if( mod##_e2 != 0.0 ) car = qBound( 0.0f, car + mod##_e2 / 2 * m_env2_buf[f], 1.0f ); \ + if( mod##_e1 != 0.0 ) car = qBound( 0.0f, car + mod##_e1 * m_env1_buf[f], 1.0f ); \ + if( mod##_e2 != 0.0 ) car = qBound( 0.0f, car + mod##_e2 * m_env2_buf[f], 1.0f ); \ if( mod##_l1 != 0.0 ) car = qBound( 0.0f, car + mod##_l1 / 2 * m_lfo1_buf[f], 1.0f ); \ if( mod##_l2 != 0.0 ) car = qBound( 0.0f, car + mod##_l2 / 2 * m_lfo2_buf[f], 1.0f ); #define modulatephs( car, mod ) \ - if( mod##_e1 != 0.0 ) car = fraction( car + mod##_e1 / 2 * m_env1_buf[f] ); \ - if( mod##_e2 != 0.0 ) car = fraction( car + mod##_e2 / 2 * m_env2_buf[f] ); \ + if( mod##_e1 != 0.0 ) car = fraction( car + mod##_e1 * m_env1_buf[f] ); \ + if( mod##_e2 != 0.0 ) car = fraction( car + mod##_e2 * m_env2_buf[f] ); \ if( mod##_l1 != 0.0 ) car = fraction( car + mod##_l1 / 2 * m_lfo1_buf[f] ); \ if( mod##_l2 != 0.0 ) car = fraction( car + mod##_l2 / 2 * m_lfo2_buf[f] ); @@ -176,7 +176,7 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) const float o2rfb = ( m_parent->m_osc2r_freq * m_nph->frequency() ); const float o2f_e1 = ( m_parent->m_pit2env1.value() ); const float o2f_e2 = ( m_parent->m_pit2env2.value() ); - const float o2f_l1 = ( m_parent->m_pit2lfo2.value() ); + const float o2f_l1 = ( m_parent->m_pit2lfo1.value() ); const float o2f_l2 = ( m_parent->m_pit2lfo2.value() ); // get volumes @@ -229,7 +229,6 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) const int omod = m_parent->m_o23Mod.value(); - // frequency helpers /////////////////////////// // // @@ -333,8 +332,8 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) // o2 modulation? if( omod == MOD_FM ) { - o3l_f = qBound( MIN_FREQ, o3l_f * static_cast( fastPow( 4, O2L ) ), MAX_FREQ ); - o3r_f = qBound( MIN_FREQ, o3r_f * static_cast( fastPow( 4, O2R ) ), MAX_FREQ ); + o3l_f = qBound( MIN_FREQ, o3l_f * powf( 5, O2L ), MAX_FREQ ); + o3r_f = qBound( MIN_FREQ, o3r_f * powf( 5, O2R ), MAX_FREQ ); } // calc and modulate phase @@ -1151,17 +1150,17 @@ void MonstroInstrument::updateVolumes() void MonstroInstrument::updateFreq() { - m_osc1l_freq = powf( 2.0d, m_osc1Crs.value() / 12.0d ) * - powf( 2.0d, m_osc1Ftl.value() / 1200.0d ); - m_osc1r_freq = powf( 2.0d, m_osc1Crs.value() / 12.0d ) * - powf( 2.0d, m_osc1Ftr.value() / 1200.0d ); + m_osc1l_freq = powf( 2.0f, m_osc1Crs.value() / 12.0f ) * + powf( 2.0f, m_osc1Ftl.value() / 1200.0f ); + m_osc1r_freq = powf( 2.0f, m_osc1Crs.value() / 12.0f ) * + powf( 2.0f, m_osc1Ftr.value() / 1200.0f ); - m_osc2l_freq = powf( 2.0d, m_osc2Crs.value() / 12.0d ) * - powf( 2.0d, m_osc2Ftl.value() / 1200.0d ); - m_osc2r_freq = powf( 2.0d, m_osc2Crs.value() / 12.0d ) * - powf( 2.0d, m_osc2Ftr.value() / 1200.0d ); + m_osc2l_freq = powf( 2.0f, m_osc2Crs.value() / 12.0f ) * + powf( 2.0f, m_osc2Ftl.value() / 1200.0f ); + m_osc2r_freq = powf( 2.0f, m_osc2Crs.value() / 12.0f ) * + powf( 2.0f, m_osc2Ftr.value() / 1200.0f ); - m_osc3_freq = powf( 2.0d, m_osc3Crs.value() / 12.0d ); + m_osc3_freq = powf( 2.0f, m_osc3Crs.value() / 12.0f ); } @@ -1422,7 +1421,7 @@ QWidget * MonstroView::setupOperatorsView( QWidget * _parent ) makeknob( m_osc1CrsKnob, KNOBCOL3, O1ROW, "Coarse detune", " seminotes", "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", "°", "osc1Knob" ) + makeknob( m_osc1SpoKnob, KNOBCOL6, O1ROW, "Stereo phase offset", " deg", "osc1Knob" ) makeknob( m_osc1PwKnob, KNOBCOL7, O1ROW, "Pulse width", "%", "osc1Knob" ) m_osc1VolKnob -> setVolumeKnob( true ); @@ -1432,7 +1431,7 @@ QWidget * MonstroView::setupOperatorsView( QWidget * _parent ) makeknob( m_osc2CrsKnob, KNOBCOL3, O2ROW, "Coarse detune", " seminotes", "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", "°", "osc2Knob" ) + makeknob( m_osc2SpoKnob, KNOBCOL6, O2ROW, "Stereo phase offset", " deg", "osc2Knob" ) m_osc2VolKnob -> setVolumeKnob( true ); @@ -1443,7 +1442,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_osc3SpoKnob, KNOBCOL4, O3ROW, "Stereo phase offset", "°", "osc3Knob" ) + makeknob( m_osc3SpoKnob, KNOBCOL4, O3ROW, "Stereo phase offset", " deg", "osc3Knob" ) makeknob( m_osc3SubKnob, KNOBCOL5, O3ROW, "Sub-osc mix", "", "osc3Knob" ) m_osc3Wave1Box = new comboBox( view ); @@ -1460,7 +1459,7 @@ QWidget * MonstroView::setupOperatorsView( QWidget * _parent ) maketsknob( m_lfo1AttKnob, LFOCOL1, LFOROW, "Attack", " ms", "lfoKnob" ) maketsknob( m_lfo1RateKnob, LFOCOL2, LFOROW, "Rate", " ms", "lfoKnob" ) - makeknob( m_lfo1PhsKnob, LFOCOL3, LFOROW, "Phase", "°", "lfoKnob" ) + makeknob( m_lfo1PhsKnob, LFOCOL3, LFOROW, "Phase", " deg", "lfoKnob" ) m_lfo2WaveBox = new comboBox( view ); m_lfo2WaveBox -> setGeometry( 127, LFOROW + 7, 42, 22 ); @@ -1468,7 +1467,7 @@ QWidget * MonstroView::setupOperatorsView( QWidget * _parent ) maketsknob( m_lfo2AttKnob, LFOCOL4, LFOROW, "Attack", " ms", "lfoKnob" ) maketsknob( m_lfo2RateKnob, LFOCOL5, LFOROW, "Rate", " ms", "lfoKnob" ) - makeknob( m_lfo2PhsKnob, LFOCOL6, LFOROW, "Phase", "°", "lfoKnob" ) + makeknob( m_lfo2PhsKnob, LFOCOL6, LFOROW, "Phase", " deg", "lfoKnob" ) maketsknob( m_env1PreKnob, KNOBCOL1, E1ROW, "Pre-delay", " ms", "envKnob" ) maketsknob( m_env1AttKnob, KNOBCOL2, E1ROW, "Attack", " ms", "envKnob" ) From 32e981a518d8a4df7fcc441c2ed649b089954d41 Mon Sep 17 00:00:00 2001 From: Vesa Date: Sun, 30 Mar 2014 04:08:26 +0300 Subject: [PATCH 08/11] Monstro - more alg. tweaks - getting better --- plugins/monstro/Monstro.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/monstro/Monstro.cpp b/plugins/monstro/Monstro.cpp index 708a31cb2..28aa4c94e 100644 --- a/plugins/monstro/Monstro.cpp +++ b/plugins/monstro/Monstro.cpp @@ -99,8 +99,8 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) #define modulatefreq( car, mod ) \ if( mod##_e1 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 10.0, m_env1_buf[f] * mod##_e1 ) ), MAX_FREQ ); \ if( mod##_e2 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 10.0, m_env2_buf[f] * mod##_e2 ) ), MAX_FREQ ); \ - if( mod##_l1 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 5.0, m_lfo1_buf[f] * mod##_l1 ) ), MAX_FREQ ); \ - if( mod##_l2 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 5.0, m_lfo2_buf[f] * mod##_l2 ) ), MAX_FREQ ); + if( mod##_l1 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 2.5, m_lfo1_buf[f] * mod##_l1 ) ), MAX_FREQ ); \ + if( mod##_l2 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 2.5, m_lfo2_buf[f] * mod##_l2 ) ), MAX_FREQ ); #define modulateabs( car, mod ) \ if( mod##_e1 != 0.0 ) car = qBound( 0.0f, car + mod##_e1 * m_env1_buf[f], 1.0f ); \ @@ -332,8 +332,8 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) // o2 modulation? if( omod == MOD_FM ) { - o3l_f = qBound( MIN_FREQ, o3l_f * powf( 5, O2L ), MAX_FREQ ); - o3r_f = qBound( MIN_FREQ, o3r_f * powf( 5, O2R ), MAX_FREQ ); + o3l_f = qBound( MIN_FREQ, o3l_f * powf( 4.0f, O2L ), MAX_FREQ ); + o3r_f = qBound( MIN_FREQ, o3r_f * powf( 4.0f, O2R ), MAX_FREQ ); } // calc and modulate phase From 3b80ec74d1cd790a2529a01abfc541cbe4b0c940 Mon Sep 17 00:00:00 2001 From: Vesa Date: Sun, 30 Mar 2014 15:18:29 +0300 Subject: [PATCH 09/11] Monstro - fixes, new waveforms --- plugins/monstro/Monstro.cpp | 57 ++++++++++++++++++++++++++++++++---- plugins/monstro/Monstro.h | 36 +++++++++++++++++++---- plugins/monstro/rand.png | Bin 0 -> 407 bytes plugins/monstro/sinabs.png | Bin 0 -> 399 bytes plugins/monstro/sqrsoft.png | Bin 0 -> 393 bytes 5 files changed, 83 insertions(+), 10 deletions(-) create mode 100644 plugins/monstro/rand.png create mode 100644 plugins/monstro/sinabs.png create mode 100644 plugins/monstro/sqrsoft.png diff --git a/plugins/monstro/Monstro.cpp b/plugins/monstro/Monstro.cpp index 28aa4c94e..1ca3837be 100644 --- a/plugins/monstro/Monstro.cpp +++ b/plugins/monstro/Monstro.cpp @@ -99,8 +99,8 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) #define modulatefreq( car, mod ) \ if( mod##_e1 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 10.0, m_env1_buf[f] * mod##_e1 ) ), MAX_FREQ ); \ if( mod##_e2 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 10.0, m_env2_buf[f] * mod##_e2 ) ), MAX_FREQ ); \ - if( mod##_l1 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 2.5, m_lfo1_buf[f] * mod##_l1 ) ), MAX_FREQ ); \ - if( mod##_l2 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 2.5, m_lfo2_buf[f] * mod##_l2 ) ), MAX_FREQ ); + if( mod##_l1 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 2.0, m_lfo1_buf[f] * mod##_l1 ) ), MAX_FREQ ); \ + if( mod##_l2 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 2.0, m_lfo2_buf[f] * mod##_l2 ) ), MAX_FREQ ); #define modulateabs( car, mod ) \ if( mod##_e1 != 0.0 ) car = qBound( 0.0f, car + mod##_e1 * m_env1_buf[f], 1.0f ); \ @@ -113,7 +113,6 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) if( mod##_e2 != 0.0 ) car = fraction( car + mod##_e2 * m_env2_buf[f] ); \ if( mod##_l1 != 0.0 ) car = fraction( car + mod##_l1 / 2 * m_lfo1_buf[f] ); \ if( mod##_l2 != 0.0 ) car = fraction( car + mod##_l2 / 2 * m_lfo2_buf[f] ); - #define modulatevol( car, mod ) \ if( mod##_e1 > 0.0 ) car = qBound( 0.0f, car * ( 1.0f - mod##_e1 + mod##_e1 * m_env1_buf[f] ), MODCLIP ); \ @@ -272,6 +271,10 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) float o1_pw = pw; modulateabs( o1_pw, o1pw ) + // bounds check for phase + if( o1l_p < 0 ) o1l_p += 1.0f; + if( o1r_p < 0 ) o1r_p += 1.0f; + // pulse wave osc sample_t O1L = ( o1l_p < o1_pw ) ? 1.0f : -1.0f; sample_t O1R = ( o1r_p < o1_pw ) ? 1.0f : -1.0f; @@ -303,6 +306,10 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) float o2r_p = m_osc2r_phase + o2rpo; modulatephs( o2l_p, o2p ) modulatephs( o2r_p, o2p ) + + // bounds check for phase + if( o2l_p < 0 ) o2l_p += 1.0f; + if( o2r_p < 0 ) o2r_p += 1.0f; // multi-wave DC Oscillator sample_t O2L = oscillate( o2w, o2l_p ); @@ -347,6 +354,10 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) o3l_p = fraction( o3l_p + O2L/2 ); o3r_p = fraction( o3r_p + O2R/2 ); } + + // bounds check for phase + if( o3l_p < 0 ) o3l_p += 1.0f; + if( o3r_p < 0 ) o3r_p += 1.0f; // multi-wave DC Oscillator, sub-osc 1 sample_t O3AL = oscillate( o3w1, o3l_p ); @@ -449,6 +460,15 @@ void MonstroSynth::renderModulators( fpp_t _frames ) m_lfo1_buf[f] = lfo1_s; } break; + case WAVE_SQRSOFT: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo1_s = oscillate( WAVE_SQRSOFT, lfo1_p + static_cast( t ) / lfo1_r ); + if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); + m_lfo1_buf[f] = lfo1_s; + } + break; case WAVE_MOOG: for( f_cnt_t f = 0; f < _frames; f++ ) { @@ -458,6 +478,15 @@ void MonstroSynth::renderModulators( fpp_t _frames ) m_lfo1_buf[f] = lfo1_s; } break; + case WAVE_SINABS: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo1_s = oscillate( WAVE_SINABS, lfo1_p + static_cast( t ) / lfo1_r ); + if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); + m_lfo1_buf[f] = lfo1_s; + } + break; case WAVE_EXP: for( f_cnt_t f = 0; f < _frames; f++ ) { @@ -529,6 +558,15 @@ void MonstroSynth::renderModulators( fpp_t _frames ) m_lfo2_buf[f] = lfo2_s; } break; + case WAVE_SQRSOFT: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo2_s = oscillate( WAVE_SQRSOFT, lfo2_p + static_cast( t ) / lfo2_r ); + if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); + m_lfo2_buf[f] = lfo2_s; + } + break; case WAVE_MOOG: for( f_cnt_t f = 0; f < _frames; f++ ) { @@ -538,6 +576,15 @@ void MonstroSynth::renderModulators( fpp_t _frames ) m_lfo2_buf[f] = lfo2_s; } break; + case WAVE_SINABS: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo2_s = oscillate( WAVE_SINABS, lfo2_p + static_cast( t ) / lfo2_r ); + if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); + m_lfo2_buf[f] = lfo2_s; + } + break; case WAVE_EXP: for( f_cnt_t f = 0; f < _frames; f++ ) { @@ -797,8 +844,8 @@ MonstroInstrument::MonstroInstrument( InstrumentTrack * _instrument_track ) : setwavemodel( m_osc2Wave ) setwavemodel( m_osc3Wave1 ) setwavemodel( m_osc3Wave2 ) - setwavemodel( m_lfo1Wave ) - setwavemodel( m_lfo2Wave ) + setlfowavemodel( m_lfo1Wave ) + setlfowavemodel( m_lfo2Wave ) // make connections: diff --git a/plugins/monstro/Monstro.h b/plugins/monstro/Monstro.h index e251b60b2..43dc40b7c 100644 --- a/plugins/monstro/Monstro.h +++ b/plugins/monstro/Monstro.h @@ -59,11 +59,23 @@ name .addItem( tr( "Saw wave" ), static_cast( new PluginPixmapLoader( "saw" ) ) ); \ name .addItem( tr( "Ramp wave" ), static_cast( new PluginPixmapLoader( "ramp" ) ) ); \ name .addItem( tr( "Square wave" ), static_cast( new PluginPixmapLoader( "sqr" ) ) ); \ + name .addItem( tr( "Soft square wave" ), static_cast( new PluginPixmapLoader( "sqrsoft" ) ) ); \ name .addItem( tr( "Moog saw wave" ), static_cast( new PluginPixmapLoader( "moog" ) ) ); \ + name .addItem( tr( "Abs. sine wave" ), static_cast( new PluginPixmapLoader( "sinabs" ) ) ); \ name .addItem( tr( "Exponential wave" ), static_cast( new PluginPixmapLoader( "exp" ) ) ); \ name .addItem( tr( "White noise" ), static_cast( new PluginPixmapLoader( "noise" ) ) ); - +#define setlfowavemodel( name ) \ + name .addItem( tr( "Sine wave" ), static_cast( new PluginPixmapLoader( "sin" ) ) ); \ + name .addItem( tr( "Triangle wave" ), static_cast( new PluginPixmapLoader( "tri" ) ) ); \ + name .addItem( tr( "Saw wave" ), static_cast( new PluginPixmapLoader( "saw" ) ) ); \ + name .addItem( tr( "Ramp wave" ), static_cast( new PluginPixmapLoader( "ramp" ) ) ); \ + name .addItem( tr( "Square wave" ), static_cast( new PluginPixmapLoader( "sqr" ) ) ); \ + name .addItem( tr( "Soft square wave" ), static_cast( new PluginPixmapLoader( "sqrsoft" ) ) ); \ + name .addItem( tr( "Moog saw wave" ), static_cast( new PluginPixmapLoader( "moog" ) ) ); \ + name .addItem( tr( "Abs. sine wave" ), static_cast( new PluginPixmapLoader( "sinabs" ) ) ); \ + name .addItem( tr( "Exponential wave" ), static_cast( new PluginPixmapLoader( "exp" ) ) ); \ + name .addItem( tr( "Random" ), static_cast( new PluginPixmapLoader( "rand" ) ) ); const int O1ROW = 22; @@ -112,10 +124,12 @@ const int WAVE_TRI = 1; const int WAVE_SAW = 2; const int WAVE_RAMP = 3; const int WAVE_SQR = 4; -const int WAVE_MOOG = 5; -const int WAVE_EXP = 6; -const int WAVE_NOISE = 7; -const int NUM_WAVES = 8; +const int WAVE_SQRSOFT = 5; +const int WAVE_MOOG = 6; +const int WAVE_SINABS = 7; +const int WAVE_EXP = 8; +const int WAVE_NOISE = 9; +const int NUM_WAVES = 10; const int MOD_MIX = 0; const int MOD_AM = 1; @@ -206,9 +220,21 @@ private: case WAVE_SQR: return Oscillator::squareSample( _ph ); break; + case WAVE_SQRSOFT: + { + const float ph = fraction( _ph ); + if( ph < 0.1 ) return Oscillator::sinSample( ph * 5 + 0.75 ); + else if( ph < 0.5 ) return 1.0f; + else if( ph < 0.6 ) return Oscillator::sinSample( ph * 5 + 0.75 ); + else return -1.0f; + break; + } case WAVE_MOOG: return Oscillator::moogSawSample( _ph ); break; + case WAVE_SINABS: + return qAbs( Oscillator::sinSample( _ph ) ); + break; case WAVE_EXP: return Oscillator::expSample( _ph ); break; diff --git a/plugins/monstro/rand.png b/plugins/monstro/rand.png new file mode 100644 index 0000000000000000000000000000000000000000..b857b98820cfa9d95ab85e6f7be6a04487de29b4 GIT binary patch literal 407 zcmeAS@N?(olHy`uVBq!ia0vp^d_XL~!3HGNrubO_DYhhUcNZWH1V5d3*8?fe0*}aI z1_o|n5N2eUHAey{$X?><>&kwQS&my=GvZO*44{x?iEBiObAE1aYF-J0b5UwyNotBh zd1gt5g1e`0KzJjcI8f1lPZ!4!jq_6{>Uz5binv}+oR`?-d2qc=6i?XyhWdn6Zh{** zx+?3MeI1XeWo+R}+I&KSg?+NZEVkyZqlJ=t9KYN>KAU%X@!{AvwcmIrUGYt5&N6M} zPuTjAeHIJbfpj)0cDKgcPPxpl4@eiV%t^Z=*6_CEz1RUE1GYJ?N5b?Ldv$R-FqSmD z?zpkKVcDc)VF|{LuJ+=WTQ1FEPZQcKE%|~egW>Z2S#OpJxs|ShalK w6PeQoQn#+>yHZ}7JHs~o%Hf3zcKu=tm^|gQ&g9DFVdQ&MBb@09-|zZvX%Q literal 0 HcmV?d00001 diff --git a/plugins/monstro/sinabs.png b/plugins/monstro/sinabs.png new file mode 100644 index 0000000000000000000000000000000000000000..067fa0ddb04f4f27fd56baac0416ad8553d08c61 GIT binary patch literal 399 zcmeAS@N?(olHy`uVBq!ia0vp^d_XL~!3HGNrubO_DYhhUcNZWH1V5d3*8?fe0*}aI z1_o|n5N2eUHAey{$X?><>&kwQS&mywx>HXs5-22D;u=xnoS&PUnpeW$T$GwvlA5AW zo>`Ki;O^-g5Z=fq4pj8r)5S4FV*9sifkbhOd3^}9&K`&Afgv`{Lsx09Mh)7N!)vS?#}5wjV)En&Ry02y6l4f zRq?OWa#w8K6?FYoyOrjbu(y8>9*cQe&H9GX_<^WJ`0h8njp_+3GOJ5ne6+W+@im%1 zuxj_;bYg+^10`pM8;r+he&aBS{Cvgjr20?3#>@9ASa=%Llx}roT(;5p`p1pE=jvar z>wj3L9o;+4(q*Cff$DSp+6m$j4Ch-nGDaPEVjK1}lz-Ct?LFO1!h)9{UGinUlb*ae o%VkSeen$6!_V_LJezopr0C&opi2wiq literal 0 HcmV?d00001 diff --git a/plugins/monstro/sqrsoft.png b/plugins/monstro/sqrsoft.png new file mode 100644 index 0000000000000000000000000000000000000000..d04a739474efd2a478d60f3b7ed0a43a5ddce2d7 GIT binary patch literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^d_XL~!3HGNrubO_DYhhUcNZWH1V5d3*8?fe0*}aI z1_o|n5N2eUHAey{$X?><>&kwQS&my=>Ab;m0icj%iEBiObAE1aYF-J0b5UwyNotBh zd1gt5g1e`0KzJjcI8f0?PZ!4!jq`IS8G1Q8inyNt{m;oUaKlD{je#3BY%Aq#;?Q&O zSk3XyDW+j Date: Sun, 30 Mar 2014 16:11:12 +0300 Subject: [PATCH 10/11] Monstro - envelope fix --- plugins/monstro/Monstro.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/monstro/Monstro.cpp b/plugins/monstro/Monstro.cpp index 1ca3837be..8cd069f90 100644 --- a/plugins/monstro/Monstro.cpp +++ b/plugins/monstro/Monstro.cpp @@ -97,8 +97,8 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) { // macros for modulating with env/lfos #define modulatefreq( car, mod ) \ - if( mod##_e1 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 10.0, m_env1_buf[f] * mod##_e1 ) ), MAX_FREQ ); \ - if( mod##_e2 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 10.0, m_env2_buf[f] * mod##_e2 ) ), MAX_FREQ ); \ + if( mod##_e1 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 2.0, m_env1_buf[f] * mod##_e1 * 2 ) ), MAX_FREQ ); \ + if( mod##_e2 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 2.0, m_env2_buf[f] * mod##_e2 * 2 ) ), MAX_FREQ ); \ if( mod##_l1 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 2.0, m_lfo1_buf[f] * mod##_l1 ) ), MAX_FREQ ); \ if( mod##_l2 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 2.0, m_lfo2_buf[f] * mod##_l2 ) ), MAX_FREQ ); @@ -661,6 +661,7 @@ void MonstroSynth::renderModulators( fpp_t _frames ) { m_env1_buf[f] = calcSlope( s, env1_s ); m_env1_phase = qMin( 4.0f - env1_sus, m_env1_phase + m_parent->m_env1_dec ); + if( m_env1_phase == 4.0f ) m_env1_phase = 5.0f; // jump over release if sustain is zero - fix for clicking } } else if( m_env1_phase < 5.0f ) // release phase @@ -712,6 +713,7 @@ void MonstroSynth::renderModulators( fpp_t _frames ) { m_env2_buf[f] = calcSlope( s, env2_s ); m_env2_phase = qMin( 4.0f - env2_sus, m_env2_phase + m_parent->m_env2_dec ); + if( m_env1_phase == 4.0f ) m_env1_phase = 5.0f; // jump over release if sustain is zero - fix for clicking } } else if( m_env2_phase < 5.0f ) // release phase From 8f065c198af9e81f5e6e3828604e6f26812195d7 Mon Sep 17 00:00:00 2001 From: Vesa Date: Mon, 31 Mar 2014 01:37:38 +0300 Subject: [PATCH 11/11] Monstro: add sync mechanism, make LFOs running, fix remaining small bugs --- plugins/monstro/Monstro.cpp | 413 ++++++++++++++++++++------------ plugins/monstro/Monstro.h | 47 +++- plugins/monstro/artwork_op.png | Bin 58075 -> 59412 bytes plugins/monstro/tinyled_off.png | Bin 0 -> 397 bytes plugins/monstro/tinyled_on.png | Bin 0 -> 594 bytes 5 files changed, 297 insertions(+), 163 deletions(-) create mode 100644 plugins/monstro/tinyled_off.png create mode 100644 plugins/monstro/tinyled_on.png diff --git a/plugins/monstro/Monstro.cpp b/plugins/monstro/Monstro.cpp index 8cd069f90..900fb4b5d 100644 --- a/plugins/monstro/Monstro.cpp +++ b/plugins/monstro/Monstro.cpp @@ -80,6 +80,12 @@ MonstroSynth::MonstroSynth( MonstroInstrument * _i, NotePlayHandle * _nph, m_env1_phase = 0.0; m_env2_phase = 0.0; + + m_lfo1_phase = 0.0; + m_lfo2_phase = 0.0; + + m_osc1l_last = 0.0; + m_osc1r_last = 0.0; } @@ -100,20 +106,20 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) if( mod##_e1 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 2.0, m_env1_buf[f] * mod##_e1 * 2 ) ), MAX_FREQ ); \ if( mod##_e2 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 2.0, m_env2_buf[f] * mod##_e2 * 2 ) ), MAX_FREQ ); \ if( mod##_l1 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 2.0, m_lfo1_buf[f] * mod##_l1 ) ), MAX_FREQ ); \ - if( mod##_l2 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 2.0, m_lfo2_buf[f] * mod##_l2 ) ), MAX_FREQ ); + if( mod##_l2 != 0.0 ) car = qBound( MIN_FREQ, car * static_cast( fastPow( 2.0, m_lfo2_buf[f] * mod##_l2 ) ), MAX_FREQ ); #define modulateabs( car, mod ) \ if( mod##_e1 != 0.0 ) car = qBound( 0.0f, car + mod##_e1 * m_env1_buf[f], 1.0f ); \ if( mod##_e2 != 0.0 ) car = qBound( 0.0f, car + mod##_e2 * m_env2_buf[f], 1.0f ); \ if( mod##_l1 != 0.0 ) car = qBound( 0.0f, car + mod##_l1 / 2 * m_lfo1_buf[f], 1.0f ); \ if( mod##_l2 != 0.0 ) car = qBound( 0.0f, car + mod##_l2 / 2 * m_lfo2_buf[f], 1.0f ); - + #define modulatephs( car, mod ) \ if( mod##_e1 != 0.0 ) car = fraction( car + mod##_e1 * m_env1_buf[f] ); \ if( mod##_e2 != 0.0 ) car = fraction( car + mod##_e2 * m_env2_buf[f] ); \ if( mod##_l1 != 0.0 ) car = fraction( car + mod##_l1 / 2 * m_lfo1_buf[f] ); \ if( mod##_l2 != 0.0 ) car = fraction( car + mod##_l2 / 2 * m_lfo2_buf[f] ); - + #define modulatevol( car, mod ) \ if( mod##_e1 > 0.0 ) car = qBound( 0.0f, car * ( 1.0f - mod##_e1 + mod##_e1 * m_env1_buf[f] ), MODCLIP ); \ if( mod##_e1 < 0.0 ) car = qBound( 0.0f, car * ( 1.0f + mod##_e1 * m_env1_buf[f] ), MODCLIP ); \ @@ -121,7 +127,7 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) if( mod##_e2 < 0.0 ) car = qBound( 0.0f, car * ( 1.0f + mod##_e2 * m_env2_buf[f] ), MODCLIP ); \ if( mod##_l1 != 0.0 ) car = qBound( 0.0f, car * ( 1.0f + mod##_l1 * m_lfo1_buf[f] ), MODCLIP ); \ if( mod##_l2 != 0.0 ) car = qBound( 0.0f, car * ( 1.0f + mod##_l2 * m_lfo2_buf[f] ), MODCLIP ); - + // pre-render env's and lfo's renderModulators( _frames ); @@ -132,7 +138,7 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) const float o1pw_e2 = ( m_parent->m_pw1env2.value() ); const float o1pw_l1 = ( m_parent->m_pw1lfo1.value() ); const float o1pw_l2 = ( m_parent->m_pw1lfo2.value() ); - + // get phases const float o1lpo = m_parent->m_osc1l_po; const float o1rpo = m_parent->m_osc1r_po; @@ -140,8 +146,8 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) const float o1p_e2 = ( m_parent->m_phs1env2.value() ); const float o1p_l1 = ( m_parent->m_phs1lfo1.value() ); const float o1p_l2 = ( m_parent->m_phs1lfo2.value() ); - - // get pitch + + // get pitch const float o1lfb = ( m_parent->m_osc1l_freq * m_nph->frequency() ); const float o1rfb = ( m_parent->m_osc1r_freq * m_nph->frequency() ); const float o1f_e1 = ( m_parent->m_pit1env1.value() ); @@ -157,11 +163,10 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) const float o1v_l1 = ( m_parent->m_vol1lfo1.value() ); const float o1v_l2 = ( m_parent->m_vol1lfo2.value() ); - // update osc2 // get waveform const int o2w = m_parent->m_osc2Wave.value(); - + // get phases const float o2lpo = m_parent->m_osc2l_po; const float o2rpo = m_parent->m_osc2r_po; @@ -170,9 +175,9 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) const float o2p_l1 = ( m_parent->m_phs2lfo1.value() ); const float o2p_l2 = ( m_parent->m_phs2lfo2.value() ); - // get pitch + // get pitch const float o2lfb = ( m_parent->m_osc2l_freq * m_nph->frequency() ); - const float o2rfb = ( m_parent->m_osc2r_freq * m_nph->frequency() ); + const float o2rfb = ( m_parent->m_osc2r_freq * m_nph->frequency() ); const float o2f_e1 = ( m_parent->m_pit2env1.value() ); const float o2f_e2 = ( m_parent->m_pit2env2.value() ); const float o2f_l1 = ( m_parent->m_pit2lfo1.value() ); @@ -185,8 +190,8 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) const float o2v_e2 = ( m_parent->m_vol2env2.value() ); const float o2v_l1 = ( m_parent->m_vol2lfo2.value() ); const float o2v_l2 = ( m_parent->m_vol2lfo2.value() ); - - + + // update osc3 // get waveforms @@ -222,27 +227,33 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) const float o3s_e2 = ( m_parent->m_sub3env2.value() ); const float o3s_l1 = ( m_parent->m_sub3lfo1.value() ); const float o3s_l2 = ( m_parent->m_sub3lfo2.value() ); - - + + //o2-o3 modulation - + const int omod = m_parent->m_o23Mod.value(); - - + + // sync information + + const bool o1ssr = m_parent->m_osc1SSR.value(); + const bool o1ssf = m_parent->m_osc1SSF.value(); + const bool o2sync = m_parent->m_osc2Sync.value(); + const bool o3sync = m_parent->m_osc3Sync.value(); + /////////////////////////// // // // start buffer loop // // // /////////////////////////// - - - + + + for( f_cnt_t f = 0; f < _frames; f++ ) - { + { /* // debug code - if( f % 10 == 0 ) { + if( f % 10 == 0 ) { qDebug( "env1 %f -- env1 phase %f", m_env1_buf[f], m_env1_phase ); qDebug( "env1 pre %f att %f dec %f rel %f ", m_parent->m_env1_pre, m_parent->m_env1_att, m_parent->m_env1_dec, m_parent->m_env1_rel ); @@ -255,52 +266,80 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) // // ///////////////////////////// + // sync send "signals" + bool syncl = false; + bool syncr = false; + // calc and mod frequencies float o1l_f = o1lfb; float o1r_f = o1rfb; modulatefreq( o1l_f, o1f ) modulatefreq( o1r_f, o1f ) - + // calc and modulate phase float o1l_p = m_osc1l_phase + o1lpo; float o1r_p = m_osc1r_phase + o1rpo; modulatephs( o1l_p, o1p ) modulatephs( o1r_p, o1p ) - + // calc and modulate pulse float o1_pw = pw; modulateabs( o1_pw, o1pw ) - + // bounds check for phase if( o1l_p < 0 ) o1l_p += 1.0f; if( o1r_p < 0 ) o1r_p += 1.0f; - + // pulse wave osc sample_t O1L = ( o1l_p < o1_pw ) ? 1.0f : -1.0f; sample_t O1R = ( o1r_p < o1_pw ) ? 1.0f : -1.0f; - + + // check for rise/fall, and "send" sync if appropriate + // sync on rise + if( o1ssr ) + { + if( O1L > m_osc1l_last ) syncl = true; + if( O1R > m_osc1r_last ) syncr = true; + } + if( o1ssf ) + { + if( O1L < m_osc1l_last ) syncl = true; + if( O1R < m_osc1r_last ) syncr = true; + } + + // update last before signal is touched + m_osc1l_last = O1L; + m_osc1r_last = O1R; + // modulate volume O1L *= o1lv; O1R *= o1rv; modulatevol( O1L, o1v ) modulatevol( O1R, o1v ) - - // update osc1 phases + + // update osc1 phases m_osc1l_phase = fraction( m_osc1l_phase + 1.0f / ( static_cast( m_samplerate ) / o1l_f ) ); m_osc1r_phase = fraction( m_osc1r_phase + 1.0f / ( static_cast( m_samplerate ) / o1r_f ) ); - + ///////////////////////////// // // // OSC 2 // // // ///////////////////////////// - + // calc and mod frequencies float o2l_f = o2lfb; float o2r_f = o2rfb; modulatefreq( o2l_f, o2f ) modulatefreq( o2r_f, o2f ) - + + // check for sync + if( o2sync ) + { + if( syncl ) m_osc2l_phase = 0.0f; + if( syncr ) m_osc2r_phase = 0.0f; + } + // calc and modulate phase float o2l_p = m_osc2l_phase + o2lpo; float o2r_p = m_osc2r_phase + o2rpo; @@ -310,21 +349,21 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) // bounds check for phase if( o2l_p < 0 ) o2l_p += 1.0f; if( o2r_p < 0 ) o2r_p += 1.0f; - + // multi-wave DC Oscillator sample_t O2L = oscillate( o2w, o2l_p ); sample_t O2R = oscillate( o2w, o2r_p ); - + // modulate volume O2L *= o2lv; O2R *= o2rv; modulatevol( O2L, o2v ) modulatevol( O2R, o2v ) - - // update osc2 phases + + // update osc2 phases m_osc2l_phase = fraction( m_osc2l_phase + 1.0f / ( static_cast( m_samplerate ) / o2l_f ) ); m_osc2r_phase = fraction( m_osc2r_phase + 1.0f / ( static_cast( m_samplerate ) / o2r_f ) ); - + ///////////////////////////// // // // OSC 3 // @@ -342,7 +381,14 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) o3l_f = qBound( MIN_FREQ, o3l_f * powf( 4.0f, O2L ), MAX_FREQ ); o3r_f = qBound( MIN_FREQ, o3r_f * powf( 4.0f, O2R ), MAX_FREQ ); } - + + // check for sync + if( o3sync ) + { + if( syncl ) m_osc3l_phase = 0.0f; + if( syncr ) m_osc3r_phase = 0.0f; + } + // calc and modulate phase float o3l_p = m_osc3l_phase + o3lpo; float o3r_p = m_osc3r_phase + o3rpo; @@ -354,7 +400,7 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) o3l_p = fraction( o3l_p + O2L/2 ); o3r_p = fraction( o3r_p + O2R/2 ); } - + // bounds check for phase if( o3l_p < 0 ) o3l_p += 1.0f; if( o3r_p < 0 ) o3r_p += 1.0f; @@ -366,14 +412,14 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) // multi-wave DC Oscillator, sub-osc 2 sample_t O3BL = oscillate( o3w2, o3l_p ); sample_t O3BR = oscillate( o3w2, o3r_p ); - + // calc and modulate sub float sub = o3sub; modulateabs( sub, o3s ) - + sample_t O3L = interpolate( O3AL, O3BL, sub ); sample_t O3R = interpolate( O3AR, O3BR, sub ); - + // modulate volume O3L *= o3lv; O3R *= o3rv; @@ -386,10 +432,10 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) O3R = qBound( -MODCLIP, O3R * qMax( 0.0f, 1.0f + O2R ), MODCLIP ); } - // update osc3 phases + // update osc3 phases m_osc3l_phase = fraction( m_osc3l_phase + 1.0f / ( static_cast( m_samplerate ) / o3l_f ) ); m_osc3r_phase = fraction( m_osc3r_phase + 1.0f / ( static_cast( m_samplerate ) / o3r_f ) ); - + _buf[f][0] = O1L + O3L + ( omod == MOD_MIX ? O2L : 0.0f ); _buf[f][1] = O1R + O3R + ( omod == MOD_MIX ? O2R : 0.0f ); } @@ -399,15 +445,21 @@ void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) void MonstroSynth::renderModulators( fpp_t _frames ) { // LFO phase offsets - const float lfo1_p = m_parent->m_lfo1Phs.value() / 360.0f; - const float lfo2_p = m_parent->m_lfo2Phs.value() / 360.0f; + const float lfo1_po = m_parent->m_lfo1Phs.value() / 360.0f; + const float lfo2_po = m_parent->m_lfo2Phs.value() / 360.0f; + + // remove cruft from phase counters to prevent overflow + m_lfo1_phase = fraction( m_lfo1_phase ); + m_lfo2_phase = fraction( m_lfo2_phase ); // LFO rates const float lfo1_r = m_parent->m_lfo1Rate.value() / 1000.0f * m_samplerate; const float lfo2_r = m_parent->m_lfo2Rate.value() / 1000.0f * m_samplerate; - // LFOs + // frames played before + const f_cnt_t tfp = m_nph->totalFramesPlayed(); + // LFOs sample_t lfo1_s; sample_t lfo2_s; @@ -418,93 +470,112 @@ void MonstroSynth::renderModulators( fpp_t _frames ) case WAVE_SINE: for( f_cnt_t f = 0; f < _frames; f++ ) { - const f_cnt_t t = f + m_nph->totalFramesPlayed(); - lfo1_s = Oscillator::sinSample( lfo1_p + static_cast( t ) / lfo1_r ); + const f_cnt_t t = f + tfp; + const float ph = m_lfo1_phase + lfo1_po; + lfo1_s = Oscillator::sinSample( ph ); if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent-> m_lfo1_att ); m_lfo1_buf[f] = lfo1_s; + m_lfo1_phase += 1.0 / lfo1_r; } break; case WAVE_TRI: for( f_cnt_t f = 0; f < _frames; f++ ) { - const f_cnt_t t = f + m_nph->totalFramesPlayed(); - lfo1_s = Oscillator::triangleSample( lfo1_p + static_cast( t ) / lfo1_r ); + const f_cnt_t t = f + tfp; + const float ph = m_lfo1_phase + lfo1_po; + lfo1_s = Oscillator::triangleSample( ph ); if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); m_lfo1_buf[f] = lfo1_s; + m_lfo1_phase += 1.0 / lfo1_r; } break; case WAVE_SAW: for( f_cnt_t f = 0; f < _frames; f++ ) { - const f_cnt_t t = f + m_nph->totalFramesPlayed(); - lfo1_s = Oscillator::sawSample( lfo1_p + static_cast( t ) / lfo1_r ); + const f_cnt_t t = f + tfp; + const float ph = m_lfo1_phase + lfo1_po; + lfo1_s = Oscillator::sawSample( ph ); if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); m_lfo1_buf[f] = lfo1_s; + m_lfo1_phase += 1.0 / lfo1_r; } break; case WAVE_RAMP: for( f_cnt_t f = 0; f < _frames; f++ ) { - const f_cnt_t t = f + m_nph->totalFramesPlayed(); - lfo1_s = Oscillator::sawSample( lfo1_p + static_cast( t ) / lfo1_r ) * -1.0f; + const f_cnt_t t = f + tfp; + const float ph = m_lfo1_phase + lfo1_po; + lfo1_s = Oscillator::sawSample( ph ) * -1.0f; if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); m_lfo1_buf[f] = lfo1_s; + m_lfo1_phase += 1.0 / lfo1_r; } break; case WAVE_SQR: for( f_cnt_t f = 0; f < _frames; f++ ) { - const f_cnt_t t = f + m_nph->totalFramesPlayed(); - lfo1_s = Oscillator::squareSample( lfo1_p + static_cast( t ) / lfo1_r ); + const f_cnt_t t = f + tfp; + const float ph = m_lfo1_phase + lfo1_po; + lfo1_s = Oscillator::squareSample( ph ); if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); m_lfo1_buf[f] = lfo1_s; + m_lfo1_phase += 1.0 / lfo1_r; } break; case WAVE_SQRSOFT: for( f_cnt_t f = 0; f < _frames; f++ ) { - const f_cnt_t t = f + m_nph->totalFramesPlayed(); - lfo1_s = oscillate( WAVE_SQRSOFT, lfo1_p + static_cast( t ) / lfo1_r ); + const f_cnt_t t = f + tfp; + const float ph = m_lfo1_phase + lfo1_po; + lfo1_s = oscillate( WAVE_SQRSOFT, ph ); if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); m_lfo1_buf[f] = lfo1_s; + m_lfo1_phase += 1.0 / lfo1_r; } break; case WAVE_MOOG: for( f_cnt_t f = 0; f < _frames; f++ ) { - const f_cnt_t t = f + m_nph->totalFramesPlayed(); - lfo1_s = Oscillator::moogSawSample( lfo1_p + static_cast( t ) / lfo1_r ); + const f_cnt_t t = f + tfp; + const float ph = m_lfo1_phase + lfo1_po; + lfo1_s = Oscillator::moogSawSample( ph ); if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); m_lfo1_buf[f] = lfo1_s; + m_lfo1_phase += 1.0 / lfo1_r; } break; case WAVE_SINABS: for( f_cnt_t f = 0; f < _frames; f++ ) { - const f_cnt_t t = f + m_nph->totalFramesPlayed(); - lfo1_s = oscillate( WAVE_SINABS, lfo1_p + static_cast( t ) / lfo1_r ); + const f_cnt_t t = f + tfp; + const float ph = m_lfo1_phase + lfo1_po; + lfo1_s = oscillate( WAVE_SINABS, ph ); if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); m_lfo1_buf[f] = lfo1_s; + m_lfo1_phase += 1.0 / lfo1_r; } break; case WAVE_EXP: for( f_cnt_t f = 0; f < _frames; f++ ) { - const f_cnt_t t = f + m_nph->totalFramesPlayed(); - lfo1_s = Oscillator::expSample( lfo1_p + static_cast( t ) / lfo1_r ); + const f_cnt_t t = f + tfp; + const float ph = m_lfo1_phase + lfo1_po; + lfo1_s = Oscillator::expSample( ph ); if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent-> m_lfo1_att ); m_lfo1_buf[f] = lfo1_s; + m_lfo1_phase += 1.0 / lfo1_r; } break; case WAVE_NOISE: default: for( f_cnt_t f = 0; f < _frames; f++ ) { - const f_cnt_t t = f + m_nph->totalFramesPlayed(); + const f_cnt_t t = f + tfp; if( t % static_cast( lfo1_r ) == 0 ) m_lfo1_last = Oscillator::noiseSample( 0.0f ); lfo1_s = m_lfo1_last; if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); m_lfo1_buf[f] = lfo1_s; + m_lfo1_phase += 1.0 / lfo1_r; } break; } @@ -516,93 +587,112 @@ void MonstroSynth::renderModulators( fpp_t _frames ) case WAVE_SINE: for( f_cnt_t f = 0; f < _frames; f++ ) { - const f_cnt_t t = f + m_nph->totalFramesPlayed(); - lfo2_s = Oscillator::sinSample( lfo2_p + static_cast( t ) / lfo2_r ); - if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); + const f_cnt_t t = f + tfp; + const float ph = m_lfo2_phase + lfo2_po; + lfo2_s = Oscillator::sinSample( ph ); + if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent-> m_lfo2_att ); m_lfo2_buf[f] = lfo2_s; + m_lfo2_phase += 1.0 / lfo2_r; } break; case WAVE_TRI: for( f_cnt_t f = 0; f < _frames; f++ ) { - const f_cnt_t t = f + m_nph->totalFramesPlayed(); - lfo2_s = Oscillator::triangleSample( lfo2_p + static_cast( t ) / lfo2_r ); + const f_cnt_t t = f + tfp; + const float ph = m_lfo2_phase + lfo2_po; + lfo2_s = Oscillator::triangleSample( ph ); if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); m_lfo2_buf[f] = lfo2_s; + m_lfo2_phase += 1.0 / lfo2_r; } break; case WAVE_SAW: for( f_cnt_t f = 0; f < _frames; f++ ) { - const f_cnt_t t = f + m_nph->totalFramesPlayed(); - lfo2_s = Oscillator::sawSample( lfo2_p + static_cast( t ) / lfo2_r ); + const f_cnt_t t = f + tfp; + const float ph = m_lfo2_phase + lfo2_po; + lfo2_s = Oscillator::sawSample( ph ); if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); m_lfo2_buf[f] = lfo2_s; + m_lfo2_phase += 1.0 / lfo2_r; } break; case WAVE_RAMP: for( f_cnt_t f = 0; f < _frames; f++ ) { - const f_cnt_t t = f + m_nph->totalFramesPlayed(); - lfo2_s = Oscillator::sawSample( lfo2_p + static_cast( t ) / lfo2_r ) * -1.0f; + const f_cnt_t t = f + tfp; + const float ph = m_lfo2_phase + lfo2_po; + lfo2_s = Oscillator::sawSample( ph ) * -1.0f; if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); m_lfo2_buf[f] = lfo2_s; + m_lfo2_phase += 1.0 / lfo2_r; } break; case WAVE_SQR: for( f_cnt_t f = 0; f < _frames; f++ ) { - const f_cnt_t t = f + m_nph->totalFramesPlayed(); - lfo2_s = Oscillator::squareSample( lfo2_p + static_cast( t ) / lfo2_r ); + const f_cnt_t t = f + tfp; + const float ph = m_lfo2_phase + lfo2_po; + lfo2_s = Oscillator::squareSample( ph ); if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); m_lfo2_buf[f] = lfo2_s; + m_lfo2_phase += 1.0 / lfo2_r; } break; case WAVE_SQRSOFT: for( f_cnt_t f = 0; f < _frames; f++ ) { - const f_cnt_t t = f + m_nph->totalFramesPlayed(); - lfo2_s = oscillate( WAVE_SQRSOFT, lfo2_p + static_cast( t ) / lfo2_r ); + const f_cnt_t t = f + tfp; + const float ph = m_lfo2_phase + lfo2_po; + lfo2_s = oscillate( WAVE_SQRSOFT, ph ); if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); m_lfo2_buf[f] = lfo2_s; + m_lfo2_phase += 1.0 / lfo2_r; } break; case WAVE_MOOG: for( f_cnt_t f = 0; f < _frames; f++ ) { - const f_cnt_t t = f + m_nph->totalFramesPlayed(); - lfo2_s = Oscillator::moogSawSample( lfo2_p + static_cast( t ) / lfo2_r ); + const f_cnt_t t = f + tfp; + const float ph = m_lfo2_phase + lfo2_po; + lfo2_s = Oscillator::moogSawSample( ph ); if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); m_lfo2_buf[f] = lfo2_s; + m_lfo2_phase += 1.0 / lfo2_r; } break; case WAVE_SINABS: for( f_cnt_t f = 0; f < _frames; f++ ) { - const f_cnt_t t = f + m_nph->totalFramesPlayed(); - lfo2_s = oscillate( WAVE_SINABS, lfo2_p + static_cast( t ) / lfo2_r ); + const f_cnt_t t = f + tfp; + const float ph = m_lfo2_phase + lfo2_po; + lfo2_s = oscillate( WAVE_SINABS, ph ); if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); m_lfo2_buf[f] = lfo2_s; + m_lfo2_phase += 1.0 / lfo2_r; } break; case WAVE_EXP: for( f_cnt_t f = 0; f < _frames; f++ ) { - const f_cnt_t t = f + m_nph->totalFramesPlayed(); - lfo2_s = Oscillator::expSample( lfo2_p + static_cast( t ) / lfo2_r ); - if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); + const f_cnt_t t = f + tfp; + const float ph = m_lfo2_phase + lfo2_po; + lfo2_s = Oscillator::expSample( ph ); + if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent-> m_lfo2_att ); m_lfo2_buf[f] = lfo2_s; + m_lfo2_phase += 1.0 / lfo2_r; } break; case WAVE_NOISE: default: for( f_cnt_t f = 0; f < _frames; f++ ) { - const f_cnt_t t = f + m_nph->totalFramesPlayed(); + const f_cnt_t t = f + tfp; if( t % static_cast( lfo2_r ) == 0 ) m_lfo2_last = Oscillator::noiseSample( 0.0f ); lfo2_s = m_lfo2_last; if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); m_lfo2_buf[f] = lfo2_s; + m_lfo2_phase += 1.0 / lfo2_r; } break; } @@ -617,10 +707,10 @@ void MonstroSynth::renderModulators( fpp_t _frames ) const float env1_s = m_parent-> m_env1Slope.value(); const float env2_s = m_parent-> m_env2Slope.value(); - + const float env1_sus = m_parent-> m_env1Sus.value(); const float env2_sus = m_parent-> m_env2Sus.value(); - + for( f_cnt_t f = 0; f < _frames; f++ ) { // envelope 1 @@ -633,7 +723,7 @@ void MonstroSynth::renderModulators( fpp_t _frames ) else if( m_env1_phase < 3.0f ) m_env1_phase = 4.0f; else m_env1_phase = 4.0f + fraction( m_env1_phase ); } - + // process envelope if( m_env1_phase < 1.0f ) // pre-delay phase { @@ -653,7 +743,7 @@ void MonstroSynth::renderModulators( fpp_t _frames ) else if( m_env1_phase < 4.0f ) // decay phase { const sample_t s = 1.0f - fraction( m_env1_phase ); - if( s <= env1_sus ) + if( s <= env1_sus ) { m_env1_buf[f] = env1_sus; } @@ -685,7 +775,7 @@ void MonstroSynth::renderModulators( fpp_t _frames ) else if( m_env2_phase < 3.0f ) m_env2_phase = 4.0f; else m_env2_phase = 4.0f + fraction( m_env2_phase ); } - + // process envelope if( m_env2_phase < 1.0f ) // pre-delay phase { @@ -705,7 +795,7 @@ void MonstroSynth::renderModulators( fpp_t _frames ) else if( m_env2_phase < 4.0f ) // decay phase { const sample_t s = 1.0f - fraction( m_env2_phase ); - if( s <= env2_sus ) + if( s <= env2_sus ) { m_env2_buf[f] = env2_sus; } @@ -739,6 +829,8 @@ MonstroInstrument::MonstroInstrument( InstrumentTrack * _instrument_track ) : m_osc1Ftr( 0.0, -100.0, 100.0, 1.0, this, tr( "Osc 1 Fine detune right" ) ), m_osc1Spo( 0.0, -180.0, 180.0, 0.1, this, tr( "Osc 1 Stereo phase offset" ) ), m_osc1Pw( 50.0, 0.0, 100.0, 0.01, this, tr( "Osc 1 Pulse width" ) ), + m_osc1SSR( false, this, tr( "Osc 1 Sync send on rise" ) ), + m_osc1SSF( false, this, tr( "Osc 1 Sync send on fall" ) ), m_osc2Vol( 33.0, 0.0, 200.0, 0.1, this, tr( "Osc 2 Volume" ) ), m_osc2Pan( 0.0, -100.0, 100.0, 0.1, this, tr( "Osc 2 Panning" ) ), @@ -747,6 +839,7 @@ MonstroInstrument::MonstroInstrument( InstrumentTrack * _instrument_track ) : m_osc2Ftr( 0.0, -100.0, 100.0, 1.0, this, tr( "Osc 2 Fine detune right" ) ), m_osc2Spo( 0.0, -180.0, 180.0, 0.1, this, tr( "Osc 2 Stereo phase offset" ) ), m_osc2Wave( this, tr( "Osc 2 Waveform" ) ), + m_osc2Sync( false, this, tr( "Osc 2 Sync" ) ), m_osc3Vol( 33.0, 0.0, 200.0, 0.1, this, tr( "Osc 3 Volume" ) ), m_osc3Pan( 0.0, -100.0, 100.0, 0.1, this, tr( "Osc 3 Panning" ) ), @@ -755,15 +848,16 @@ MonstroInstrument::MonstroInstrument( InstrumentTrack * _instrument_track ) : m_osc3Sub( 0.0, -100.0, 100.0, 0.1, this, tr( "Osc 3 Sub-oscillator mix" ) ), m_osc3Wave1( this, tr( "Osc 3 Waveform 1" ) ), m_osc3Wave2( this, tr( "Osc 3 Waveform 2" ) ), + m_osc3Sync( false, this, tr( "Osc 3 Sync" ) ), m_lfo1Wave( this, tr( "LFO 1 Waveform" ) ), m_lfo1Att( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "LFO 1 Attack" ) ), - m_lfo1Rate( 1.0f, 0.1, 20000.0, 0.1, 20000.0f, this, tr( "LFO 1 Rate" ) ), + m_lfo1Rate( 1.0f, 0.1, 10000.0, 0.1, 10000.0f, this, tr( "LFO 1 Rate" ) ), m_lfo1Phs( 0.0, -180.0, 180.0, 0.1, this, tr( "LFO 1 Phase" ) ), m_lfo2Wave( this, tr( "LFO 2 Waveform" ) ), m_lfo2Att( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "LFO 2 Attack" ) ), - m_lfo2Rate( 1.0f, 0.1, 20000.0, 0.1, 20000.0f, this, tr( "LFO 2 Rate" ) ), + m_lfo2Rate( 1.0f, 0.1, 10000.0, 0.1, 10000.0f, this, tr( "LFO 2 Rate" ) ), m_lfo2Phs( 0.0, -180.0, 180.0, 0.1, this, tr( "LFO 2 Phase" ) ), m_env1Pre( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "Env 1 Pre-delay" ) ), @@ -876,7 +970,7 @@ MonstroInstrument::MonstroInstrument( InstrumentTrack * _instrument_track ) : connect( &m_osc1Spo, SIGNAL( dataChanged() ), this, SLOT( updatePO() ) ); connect( &m_osc2Spo, SIGNAL( dataChanged() ), this, SLOT( updatePO() ) ); connect( &m_osc3Spo, SIGNAL( dataChanged() ), this, SLOT( updatePO() ) ); - + // updateEnvelope1 connect( &m_env1Pre, SIGNAL( dataChanged() ), this, SLOT( updateEnvelope1() ) ); @@ -952,6 +1046,8 @@ void MonstroInstrument::saveSettings( QDomDocument & _doc, m_osc1Ftr.saveSettings( _doc, _this, "o1ftr" ); m_osc1Spo.saveSettings( _doc, _this, "o1spo" ); m_osc1Pw.saveSettings( _doc, _this, "o1pw" ); + m_osc1SSR.saveSettings( _doc, _this, "o1ssr" ); + m_osc1SSF.saveSettings( _doc, _this, "o1ssf" ); m_osc2Vol.saveSettings( _doc, _this, "o2vol" ); m_osc2Pan.saveSettings( _doc, _this, "o2pan" ); @@ -960,6 +1056,7 @@ void MonstroInstrument::saveSettings( QDomDocument & _doc, m_osc2Ftr.saveSettings( _doc, _this, "o2ftr" ); m_osc2Spo.saveSettings( _doc, _this, "o2spo" ); m_osc2Wave.saveSettings( _doc, _this, "o2wav" ); + m_osc2Sync.saveSettings( _doc, _this, "o2syn" ); m_osc3Vol.saveSettings( _doc, _this, "o3vol" ); m_osc3Pan.saveSettings( _doc, _this, "o3pan" ); @@ -968,6 +1065,7 @@ void MonstroInstrument::saveSettings( QDomDocument & _doc, m_osc3Sub.saveSettings( _doc, _this, "o3sub" ); m_osc3Wave1.saveSettings( _doc, _this, "o3wav1" ); m_osc3Wave2.saveSettings( _doc, _this, "o3wav2" ); + m_osc3Sync.saveSettings( _doc, _this, "o3syn" ); m_lfo1Wave.saveSettings( _doc, _this, "l1wav" ); m_lfo1Att.saveSettings( _doc, _this, "l1att" ); @@ -995,7 +1093,7 @@ void MonstroInstrument::saveSettings( QDomDocument & _doc, m_env2Rel.saveSettings( _doc, _this, "e2rel" ); m_env2Slope.saveSettings( _doc, _this, "e2slo" ); - m_o23Mod.saveSettings( _doc, _this, "o23mo" ); + m_o23Mod.saveSettings( _doc, _this, "o23mo" ); m_vol1env1.saveSettings( _doc, _this, "v1e1" ); m_vol1env2.saveSettings( _doc, _this, "v1e2" ); @@ -1051,8 +1149,8 @@ void MonstroInstrument::saveSettings( QDomDocument & _doc, m_sub3env2.saveSettings( _doc, _this, "s3e2" ); m_sub3lfo1.saveSettings( _doc, _this, "s3l1" ); m_sub3lfo2.saveSettings( _doc, _this, "s3l2" ); - -} + +} void MonstroInstrument::loadSettings( const QDomElement & _this ) { @@ -1063,6 +1161,8 @@ void MonstroInstrument::loadSettings( const QDomElement & _this ) m_osc1Ftr.loadSettings( _this, "o1ftr" ); m_osc1Spo.loadSettings( _this, "o1spo" ); m_osc1Pw.loadSettings( _this, "o1pw" ); + m_osc1SSR.loadSettings( _this, "o1ssr" ); + m_osc1SSF.loadSettings( _this, "o1ssf" ); m_osc2Vol.loadSettings( _this, "o2vol" ); m_osc2Pan.loadSettings( _this, "o2pan" ); @@ -1071,6 +1171,7 @@ void MonstroInstrument::loadSettings( const QDomElement & _this ) m_osc2Ftr.loadSettings( _this, "o2ftr" ); m_osc2Spo.loadSettings( _this, "o2spo" ); m_osc2Wave.loadSettings( _this, "o2wav" ); + m_osc2Sync.loadSettings( _this, "o2syn" ); m_osc3Vol.loadSettings( _this, "o3vol" ); m_osc3Pan.loadSettings( _this, "o3pan" ); @@ -1079,6 +1180,7 @@ void MonstroInstrument::loadSettings( const QDomElement & _this ) m_osc3Sub.loadSettings( _this, "o3sub" ); m_osc3Wave1.loadSettings( _this, "o3wav1" ); m_osc3Wave2.loadSettings( _this, "o3wav2" ); + m_osc3Sync.loadSettings( _this, "o3syn" ); m_lfo1Wave.loadSettings( _this, "l1wav" ); m_lfo1Att.loadSettings( _this, "l1att" ); @@ -1106,7 +1208,7 @@ void MonstroInstrument::loadSettings( const QDomElement & _this ) m_env2Rel.loadSettings( _this, "e2rel" ); m_env2Slope.loadSettings( _this, "e2slo" ); - m_o23Mod.loadSettings( _this, "o23mo" ); + m_o23Mod.loadSettings( _this, "o23mo" ); m_vol1env1.loadSettings( _this, "v1e1" ); m_vol1env2.loadSettings( _this, "v1e2" ); @@ -1162,7 +1264,7 @@ void MonstroInstrument::loadSettings( const QDomElement & _this ) m_sub3env2.loadSettings( _this, "s3e2" ); m_sub3lfo1.loadSettings( _this, "s3l1" ); m_sub3lfo2.loadSettings( _this, "s3l2" ); - + } @@ -1174,7 +1276,7 @@ QString MonstroInstrument::nodeName() const f_cnt_t MonstroInstrument::desiredReleaseFrames() const { - return qMax( 64, qMax( m_env1_relF, m_env2_relF ) ); + return 64; } @@ -1188,27 +1290,27 @@ void MonstroInstrument::updateVolumes() { m_osc1l_vol = leftCh( m_osc1Vol.value(), m_osc1Pan.value() ); m_osc1r_vol = rightCh( m_osc1Vol.value(), m_osc1Pan.value() ); - + m_osc2l_vol = leftCh( m_osc2Vol.value(), m_osc2Pan.value() ); m_osc2r_vol = rightCh( m_osc2Vol.value(), m_osc2Pan.value() ); - + m_osc3l_vol = leftCh( m_osc3Vol.value(), m_osc3Pan.value() ); - m_osc3r_vol = rightCh( m_osc3Vol.value(), m_osc3Pan.value() ); + m_osc3r_vol = rightCh( m_osc3Vol.value(), m_osc3Pan.value() ); } void MonstroInstrument::updateFreq() { - m_osc1l_freq = powf( 2.0f, m_osc1Crs.value() / 12.0f ) * + m_osc1l_freq = powf( 2.0f, m_osc1Crs.value() / 12.0f ) * powf( 2.0f, m_osc1Ftl.value() / 1200.0f ); - m_osc1r_freq = powf( 2.0f, m_osc1Crs.value() / 12.0f ) * + m_osc1r_freq = powf( 2.0f, m_osc1Crs.value() / 12.0f ) * powf( 2.0f, m_osc1Ftr.value() / 1200.0f ); - - m_osc2l_freq = powf( 2.0f, m_osc2Crs.value() / 12.0f ) * + + m_osc2l_freq = powf( 2.0f, m_osc2Crs.value() / 12.0f ) * powf( 2.0f, m_osc2Ftl.value() / 1200.0f ); - m_osc2r_freq = powf( 2.0f, m_osc2Crs.value() / 12.0f ) * + m_osc2r_freq = powf( 2.0f, m_osc2Crs.value() / 12.0f ) * powf( 2.0f, m_osc2Ftr.value() / 1200.0f ); - + m_osc3_freq = powf( 2.0f, m_osc3Crs.value() / 12.0f ); } @@ -1217,10 +1319,10 @@ void MonstroInstrument::updatePO() { m_osc1l_po = m_osc1Spo.value() / 360.0; m_osc1r_po = ( m_osc1Spo.value() * -1.0 ) / 360.0; - + m_osc2l_po = m_osc2Spo.value() / 360.0; m_osc2r_po = ( m_osc2Spo.value() * -1.0 ) / 360.0; - + m_osc3l_po = m_osc3Spo.value() / 360.0; m_osc3r_po = ( m_osc3Spo.value() * -1.0 ) / 360.0; } @@ -1237,7 +1339,7 @@ void MonstroInstrument::updateEnvelope1() else m_env1_dec = 1.0 / ( m_env1Dec.value() / 1000.0f ) / m_samplerate; if( m_env1Rel.value() == 0.0f ) m_env1_rel = 1.0; else m_env1_rel = 1.0 / ( m_env1Rel.value() / 1000.0f ) / m_samplerate; - + m_env1_len = ( m_env1Pre.value() + m_env1Att.value() + m_env1Hold.value() + m_env1Dec.value() ) * m_samplerate / 1000.0f; m_env1_relF = m_env1Rel.value() * m_samplerate / 1000.0f; } @@ -1253,7 +1355,7 @@ void MonstroInstrument::updateEnvelope2() else m_env2_dec = 1.0 / ( m_env2Dec.value() / 1000.0f ) / m_samplerate; if( m_env2Rel.value() == 0.0f ) m_env2_rel = 1.0; else m_env2_rel = 1.0 / ( m_env2Rel.value() / 1000.0f ) / m_samplerate; - + m_env2_len = ( m_env2Pre.value() + m_env2Att.value() + m_env2Hold.value() + m_env2Dec.value() ) * m_samplerate / 1000.0f; m_env2_relF = m_env2Rel.value() * m_samplerate / 1000.0f; } @@ -1283,30 +1385,30 @@ MonstroView::MonstroView( Instrument * _instrument, setWidgetBackground( m_operatorsView, "artwork_op" ); m_operatorsView->show(); m_operatorsView->move( 0, 0 ); - + m_matrixView = setupMatrixView( this ); setWidgetBackground( m_matrixView, "artwork_mat" ); m_matrixView->hide(); m_matrixView->move( 0, 0 ); - + // "tab buttons" - + pixmapButton * m_opViewButton = new pixmapButton( this, NULL ); m_opViewButton -> move( 0,0 ); m_opViewButton -> setActiveGraphic( PLUGIN_NAME::getIconPixmap( "opview_active" ) ); m_opViewButton -> setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "opview_inactive" ) ); toolTip::add( m_opViewButton, tr( "Operators view" ) ); - + 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_selectedViewGroup = new automatableButtonGroup( this ); m_selectedViewGroup -> addButton( m_opViewButton ); m_selectedViewGroup -> addButton( m_matViewButton ); - + connect( m_opViewButton, SIGNAL( clicked() ), this, SLOT( updateLayout() ) ); connect( m_matViewButton, SIGNAL( clicked() ), this, SLOT( updateLayout() ) ); } @@ -1336,7 +1438,7 @@ void MonstroView::updateLayout() void MonstroView::modelChanged() { MonstroInstrument * m = castModel(); - + m_osc1VolKnob-> setModel( &m-> m_osc1Vol ); m_osc1PanKnob-> setModel( &m-> m_osc1Pan ); m_osc1CrsKnob-> setModel( &m-> m_osc1Crs ); @@ -1344,6 +1446,8 @@ void MonstroView::modelChanged() m_osc1FtrKnob-> setModel( &m-> m_osc1Ftr ); m_osc1SpoKnob-> setModel( &m-> m_osc1Spo ); m_osc1PwKnob-> setModel( &m-> m_osc1Pw ); + m_osc1SSRButton-> setModel( &m-> m_osc1SSR ); + m_osc1SSFButton-> setModel( &m-> m_osc1SSF ); m_osc2VolKnob-> setModel( &m-> m_osc2Vol ); m_osc2PanKnob-> setModel( &m-> m_osc2Pan ); @@ -1352,25 +1456,27 @@ void MonstroView::modelChanged() m_osc2FtrKnob-> setModel( &m-> m_osc2Ftr ); m_osc2SpoKnob-> setModel( &m-> m_osc2Spo ); m_osc2WaveBox-> setModel( &m-> m_osc2Wave ); + m_osc2SyncButton-> setModel( &m-> m_osc2Sync ); m_osc3VolKnob-> setModel( &m-> m_osc3Vol ); m_osc3PanKnob-> setModel( &m-> m_osc3Pan ); m_osc3CrsKnob-> setModel( &m-> m_osc3Crs ); m_osc3SpoKnob-> setModel( &m-> m_osc3Spo ); - m_osc3SubKnob-> setModel( &m-> m_osc3Sub ); + m_osc3SubKnob-> setModel( &m-> m_osc3Sub ); m_osc3Wave1Box-> setModel( &m-> m_osc3Wave1 ); m_osc3Wave2Box-> setModel( &m-> m_osc3Wave2 ); - + m_osc3SyncButton-> setModel( &m-> m_osc3Sync ); + m_lfo1WaveBox-> setModel( &m-> m_lfo1Wave ); m_lfo1AttKnob-> setModel( &m-> m_lfo1Att ); m_lfo1RateKnob-> setModel( &m-> m_lfo1Rate ); m_lfo1PhsKnob-> setModel( &m-> m_lfo1Phs ); - + m_lfo2WaveBox-> setModel( &m-> m_lfo2Wave ); m_lfo2AttKnob-> setModel( &m-> m_lfo2Att ); m_lfo2RateKnob-> setModel( &m-> m_lfo2Rate ); m_lfo2PhsKnob-> setModel( &m-> m_lfo2Phs ); - + m_env1PreKnob-> setModel( &m-> m_env1Pre ); m_env1AttKnob-> setModel( &m-> m_env1Att ); m_env1HoldKnob-> setModel( &m-> m_env1Hold ); @@ -1378,7 +1484,7 @@ void MonstroView::modelChanged() m_env1SusKnob-> setModel( &m-> m_env1Sus ); m_env1RelKnob-> setModel( &m-> m_env1Rel ); m_env1SlopeKnob-> setModel( &m-> m_env1Slope ); - + m_env2PreKnob-> setModel( &m-> m_env2Pre ); m_env2AttKnob-> setModel( &m-> m_env2Att ); m_env2HoldKnob-> setModel( &m-> m_env2Hold ); @@ -1386,10 +1492,10 @@ void MonstroView::modelChanged() m_env2SusKnob-> setModel( &m-> m_env2Sus ); m_env2RelKnob-> setModel( &m-> m_env2Rel ); m_env2SlopeKnob-> setModel( &m-> m_env2Slope ); - + m_o23ModGroup-> setModel( &m-> m_o23Mod ); m_selectedViewGroup-> setModel( &m-> m_selectedView ); - + m_vol1env1Knob-> setModel( &m-> m_vol1env1 ); m_vol1env2Knob-> setModel( &m-> m_vol1env2 ); m_vol1lfo1Knob-> setModel( &m-> m_vol1lfo1 ); @@ -1444,7 +1550,7 @@ void MonstroView::modelChanged() m_sub3env2Knob-> setModel( &m-> m_sub3env2 ); m_sub3lfo1Knob-> setModel( &m-> m_sub3lfo1 ); m_sub3lfo2Knob-> setModel( &m-> m_sub3lfo2 ); - + } @@ -1461,10 +1567,10 @@ void MonstroView::setWidgetBackground( QWidget * _widget, const QString & _pic ) QWidget * MonstroView::setupOperatorsView( QWidget * _parent ) { // operators view - + QWidget * view = new QWidget( _parent ); view-> setFixedSize( 250, 250 ); - + makeknob( m_osc1VolKnob, KNOBCOL1, O1ROW, "Volume", "%", "osc1Knob" ) makeknob( m_osc1PanKnob, KNOBCOL2, O1ROW, "Panning", "", "osc1Knob" ) makeknob( m_osc1CrsKnob, KNOBCOL3, O1ROW, "Coarse detune", " seminotes", "osc1Knob" ) @@ -1475,19 +1581,24 @@ QWidget * MonstroView::setupOperatorsView( QWidget * _parent ) m_osc1VolKnob -> setVolumeKnob( true ); + maketinyled( m_osc1SSRButton, 230, 34, "Send sync on pulse rise" ) + maketinyled( m_osc1SSFButton, 230, 44, "Send sync on pulse fall" ) + 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_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" ) - + m_osc2VolKnob -> setVolumeKnob( true ); - + m_osc2WaveBox = new comboBox( view ); - m_osc2WaveBox -> setGeometry( KNOBCOL7, O2ROW + 4, 42, 22 ); + m_osc2WaveBox -> setGeometry( 204, O2ROW + 7, 42, 22 ); m_osc2WaveBox->setFont( pointSize<8>( m_osc2WaveBox->font() ) ); - + + maketinyled( m_osc2SyncButton, 204, O2ROW - 3, "Sync oscillator 2" ) + makeknob( m_osc3VolKnob, KNOBCOL1, O3ROW, "Volume", "%", "osc3Knob" ) makeknob( m_osc3PanKnob, KNOBCOL2, O3ROW, "Panning", "", "osc3Knob" ) makeknob( m_osc3CrsKnob, KNOBCOL3, O3ROW, "Coarse detune", " seminotes", "osc3Knob" ) @@ -1495,29 +1606,31 @@ QWidget * MonstroView::setupOperatorsView( QWidget * _parent ) makeknob( m_osc3SubKnob, KNOBCOL5, O3ROW, "Sub-osc mix", "", "osc3Knob" ) m_osc3Wave1Box = new comboBox( view ); - m_osc3Wave1Box -> setGeometry( 160, O3ROW + 4, 42, 22 ); + m_osc3Wave1Box -> setGeometry( 160, O3ROW + 7, 42, 22 ); m_osc3Wave1Box->setFont( pointSize<8>( m_osc3Wave1Box->font() ) ); m_osc3Wave2Box = new comboBox( view ); - m_osc3Wave2Box -> setGeometry( 204, O3ROW + 4, 42, 22 ); + m_osc3Wave2Box -> setGeometry( 204, O3ROW + 7, 42, 22 ); m_osc3Wave2Box->setFont( pointSize<8>( m_osc3Wave2Box->font() ) ); - + + maketinyled( m_osc3SyncButton, 204, O3ROW - 3, "Sync oscillator 3" ) + m_lfo1WaveBox = new comboBox( view ); m_lfo1WaveBox -> setGeometry( 2, LFOROW + 7, 42, 22 ); - m_lfo1WaveBox->setFont( pointSize<8>( m_lfo1WaveBox->font() ) ); + m_lfo1WaveBox->setFont( pointSize<8>( m_lfo1WaveBox->font() ) ); maketsknob( m_lfo1AttKnob, LFOCOL1, LFOROW, "Attack", " ms", "lfoKnob" ) maketsknob( m_lfo1RateKnob, LFOCOL2, LFOROW, "Rate", " ms", "lfoKnob" ) makeknob( m_lfo1PhsKnob, LFOCOL3, LFOROW, "Phase", " deg", "lfoKnob" ) - + m_lfo2WaveBox = new comboBox( view ); m_lfo2WaveBox -> setGeometry( 127, LFOROW + 7, 42, 22 ); - m_lfo2WaveBox->setFont( pointSize<8>( m_lfo2WaveBox->font() ) ); + m_lfo2WaveBox->setFont( pointSize<8>( m_lfo2WaveBox->font() ) ); maketsknob( m_lfo2AttKnob, LFOCOL4, LFOROW, "Attack", " ms", "lfoKnob" ) maketsknob( m_lfo2RateKnob, LFOCOL5, LFOROW, "Rate", " ms", "lfoKnob" ) makeknob( m_lfo2PhsKnob, LFOCOL6, LFOROW, "Phase", " deg", "lfoKnob" ) - + maketsknob( m_env1PreKnob, KNOBCOL1, E1ROW, "Pre-delay", " ms", "envKnob" ) maketsknob( m_env1AttKnob, KNOBCOL2, E1ROW, "Attack", " ms", "envKnob" ) maketsknob( m_env1HoldKnob, KNOBCOL3, E1ROW, "Hold", " ms", "envKnob" ) @@ -1546,7 +1659,7 @@ QWidget * MonstroView::setupOperatorsView( QWidget * _parent ) m_amButton -> setActiveGraphic( PLUGIN_NAME::getIconPixmap( "am_active" ) ); m_amButton -> setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "am_inactive" ) ); toolTip::add( m_amButton, tr( "Modulate amplitude of Osc3 with Osc2" ) ); - + pixmapButton * m_fmButton = new pixmapButton( view, NULL ); m_fmButton -> move( 225, 185 + 15*2 ); m_fmButton -> setActiveGraphic( PLUGIN_NAME::getIconPixmap( "fm_active" ) ); @@ -1558,13 +1671,13 @@ QWidget * MonstroView::setupOperatorsView( QWidget * _parent ) m_pmButton -> setActiveGraphic( PLUGIN_NAME::getIconPixmap( "pm_active" ) ); m_pmButton -> setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "pm_inactive" ) ); toolTip::add( m_pmButton, tr( "Modulate phase of Osc3 with Osc2" ) ); - + m_o23ModGroup = new automatableButtonGroup( view ); m_o23ModGroup-> addButton( m_mixButton ); m_o23ModGroup-> addButton( m_amButton ); m_o23ModGroup-> addButton( m_fmButton ); m_o23ModGroup-> addButton( m_pmButton ); - + return( view ); } @@ -1572,10 +1685,10 @@ QWidget * MonstroView::setupOperatorsView( QWidget * _parent ) QWidget * MonstroView::setupMatrixView( QWidget * _parent ) { // matrix view - + QWidget * view = new QWidget( _parent ); view-> setFixedSize( 250, 250 ); - + makeknob( m_vol1env1Knob, MATCOL1, MATROW1, "Modulation amount", "", "matrixKnob" ) makeknob( m_vol1env2Knob, MATCOL2, MATROW1, "Modulation amount", "", "matrixKnob" ) makeknob( m_vol1lfo1Knob, MATCOL3, MATROW1, "Modulation amount", "", "matrixKnob" ) @@ -1630,7 +1743,7 @@ QWidget * MonstroView::setupMatrixView( QWidget * _parent ) makeknob( m_sub3env2Knob, MATCOL6, MATROW6, "Modulation amount", "", "matrixKnob" ) makeknob( m_sub3lfo1Knob, MATCOL7, MATROW6, "Modulation amount", "", "matrixKnob" ) makeknob( m_sub3lfo2Knob, MATCOL8, MATROW6, "Modulation amount", "", "matrixKnob" ) - + return( view ); } diff --git a/plugins/monstro/Monstro.h b/plugins/monstro/Monstro.h index 43dc40b7c..b86525ad0 100644 --- a/plugins/monstro/Monstro.h +++ b/plugins/monstro/Monstro.h @@ -53,6 +53,14 @@ name ->setObjectName( oname ); \ name ->setFixedSize( 20, 20 ); +#define maketinyled( name, x, y, ttip ) \ + name = new pixmapButton( view, NULL ); \ + name -> setCheckable( true ); \ + name -> move( x, y ); \ + name -> setActiveGraphic( PLUGIN_NAME::getIconPixmap( "tinyled_on" ) ); \ + name -> setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "tinyled_off" ) ); \ + toolTip::add( name, tr( ttip ) ); + #define setwavemodel( name ) \ name .addItem( tr( "Sine wave" ), static_cast( new PluginPixmapLoader( "sin" ) ) ); \ name .addItem( tr( "Triangle wave" ), static_cast( new PluginPixmapLoader( "tri" ) ) ); \ @@ -159,7 +167,7 @@ inline double fastPow( double a, double b ) } -class MonstroSynth +class MonstroSynth { public: MonstroSynth( MonstroInstrument * _i, NotePlayHandle * _nph, @@ -172,7 +180,7 @@ public: { return m_samplerate; } - + private: MonstroInstrument * m_parent; @@ -193,14 +201,14 @@ private: return s1 + ( s2 - s1 ) * x; } - + inline sample_t calcSlope( sample_t _s, float _slope ) { if( _slope == 0.0f ) return _s; const double exp = fastPow( 10.0, static_cast( _slope * -1.0 ) ); return fastPow( _s, exp ); } - + inline sample_t oscillate( int _wave, const float _ph ) { switch( _wave ) @@ -245,7 +253,7 @@ private: } return 0.0; } - + float m_osc1l_phase; float m_osc1r_phase; @@ -256,10 +264,15 @@ private: sample_t m_env1_phase; sample_t m_env2_phase; - + + float m_lfo1_phase; + float m_lfo2_phase; + sample_t m_lfo1_last; sample_t m_lfo2_last; + sample_t m_osc1l_last; + sample_t m_osc1r_last; }; class MonstroInstrument : public Instrument @@ -305,7 +318,7 @@ protected: float m_osc2l_freq; float m_osc2r_freq; float m_osc3_freq; - + float m_osc1l_po; float m_osc1r_po; float m_osc2l_po; @@ -318,7 +331,7 @@ protected: float m_env1_hold; float m_env1_dec; float m_env1_rel; - + float m_env2_pre; float m_env2_att; float m_env2_hold; @@ -327,13 +340,13 @@ protected: f_cnt_t m_env1_len; f_cnt_t m_env2_len; - + f_cnt_t m_env1_relF; f_cnt_t m_env2_relF; - + f_cnt_t m_lfo1_att; f_cnt_t m_lfo2_att; - + sample_rate_t m_samplerate; fpp_t m_fpp; @@ -361,6 +374,8 @@ private: FloatModel m_osc1Ftr; FloatModel m_osc1Spo; FloatModel m_osc1Pw; + BoolModel m_osc1SSR; + BoolModel m_osc1SSF; FloatModel m_osc2Vol; FloatModel m_osc2Pan; @@ -369,6 +384,7 @@ private: FloatModel m_osc2Ftr; FloatModel m_osc2Spo; ComboBoxModel m_osc2Wave; + BoolModel m_osc2Sync; FloatModel m_osc3Vol; FloatModel m_osc3Pan; @@ -377,6 +393,7 @@ private: FloatModel m_osc3Sub; ComboBoxModel m_osc3Wave1; ComboBoxModel m_osc3Wave2; + BoolModel m_osc3Sync; ComboBoxModel m_lfo1Wave; TempoSyncKnobModel m_lfo1Att; @@ -505,6 +522,8 @@ private: knob * m_osc1FtrKnob; knob * m_osc1SpoKnob; knob * m_osc1PwKnob; + pixmapButton * m_osc1SSRButton; + pixmapButton * m_osc1SSFButton; knob * m_osc2VolKnob; knob * m_osc2PanKnob; @@ -513,6 +532,7 @@ private: knob * m_osc2FtrKnob; knob * m_osc2SpoKnob; comboBox * m_osc2WaveBox; + pixmapButton * m_osc2SyncButton; knob * m_osc3VolKnob; knob * m_osc3PanKnob; @@ -521,6 +541,7 @@ private: knob * m_osc3SubKnob; comboBox * m_osc3Wave1Box; comboBox * m_osc3Wave2Box; + pixmapButton * m_osc3SyncButton; comboBox * m_lfo1WaveBox; TempoSyncKnob * m_lfo1AttKnob; @@ -560,7 +581,7 @@ private: // matrix view knobs // // // ///////////////////////////////// - + knob * m_vol1env1Knob; knob * m_vol1env2Knob; knob * m_vol1lfo1Knob; @@ -614,7 +635,7 @@ private: knob * m_sub3env1Knob; knob * m_sub3env2Knob; knob * m_sub3lfo1Knob; - knob * m_sub3lfo2Knob; + knob * m_sub3lfo2Knob; }; diff --git a/plugins/monstro/artwork_op.png b/plugins/monstro/artwork_op.png index d53ffae057069941b0e6abb3acae848c92f67f18..2f7b69ca0fda75a6b5ca0ce897b76daa28f26883 100644 GIT binary patch literal 59412 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 Y*v=b6_KwC@wh-{8EUzwCDr*w-Z`fe(`2YX_ literal 58075 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

KTtJkY7M|93 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 literal 0 HcmV?d00001 diff --git a/plugins/monstro/tinyled_on.png b/plugins/monstro/tinyled_on.png new file mode 100644 index 0000000000000000000000000000000000000000..3b1d97db5cf7d383e91dc1d1190f6b76d5ed8c1f GIT binary patch literal 594 zcmV-Y0e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00Fv5L_t&-(*?o3YZO5k2jJg3 zvp2W5dmq_+ku!+Fkf5OCP$ZI4EHr|ke?TCJwY{yjfwbC)y@hCFCti^hsq6&BNG_K< zz1v*&_G@-#XV>SU?U&tZtuBP^h??zIoN7(jqQ*s~YH`jPKrls7Dx-{4(j=KwNtS4p z#yYnuf;rnO!#&rrpAh3S%;Hd5qcng~If5Vn$`U9FpfHe`e)rSedXeWvX+2sU?|(ZQ z?(~v2R<5tXatN2MEP{l=?1G0lioi)=&>O*|1pmj!-PQRo?umDQm$^>u@h^WK8+W$g z2j{rixr!j3;P$2mg&3QiCL$T2b88usV2sedhA5mq{Qlw93IhQpfPViJjb;O9g9%zQ z4GjMg7M2?D3xemhFc?ZSn=SbM7+NW)XfkUB)9_QJ*o4O~PcEM1<%c=8u> zi!G#5B2P;Ud*?_l6qdyqbZ)*Hof&%i`p{d?yKfky2aNMZNd)2yj581sa;>3M22O-5 zO(9eHxqEoDr{eI`GNwrW)bBkzIe5RuEVOOcaqN2CvZ{h}MkoqnbeiO8IL%^zB*XC_ gGfMUEK7V`s9~6Vv&`C*P-T(jq07*qoM6N<$f;k-f%K!iX literal 0 HcmV?d00001