Esempio n. 1
0
TripleOscillatorView::TripleOscillatorView( Instrument * _instrument,
        QWidget * _parent ) :
    InstrumentView( _instrument, _parent )
{
    setAutoFillBackground( true );
    QPalette pal;
    pal.setBrush( backgroundRole(),
                  PLUGIN_NAME::getIconPixmap( "artwork" ) );
    setPalette( pal );

    const int mod_x = 66;
    const int mod1_y = 58;
    const int mod2_y = 75;
    const int osc_y = 109;
    const int osc_h = 52;

    // TODO: clean rewrite using layouts and all that...
    PixmapButton * pm_osc1_btn = new PixmapButton( this, NULL );
    pm_osc1_btn->move( mod_x, mod1_y );
    pm_osc1_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap(
                                       "pm_active" ) );
    pm_osc1_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap(
                                         "pm_inactive" ) );
    ToolTip::add( pm_osc1_btn, tr( "Use phase modulation for "
                                   "modulating oscillator 1 with "
                                   "oscillator 2" ) );

    PixmapButton * am_osc1_btn = new PixmapButton( this, NULL );
    am_osc1_btn->move( mod_x + 35, mod1_y );
    am_osc1_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap(
                                       "am_active" ) );
    am_osc1_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap(
                                         "am_inactive" ) );
    ToolTip::add( am_osc1_btn, tr( "Use amplitude modulation for "
                                   "modulating oscillator 1 with "
                                   "oscillator 2" ) );

    PixmapButton * mix_osc1_btn = new PixmapButton( this, NULL );
    mix_osc1_btn->move( mod_x + 70, mod1_y );
    mix_osc1_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap(
                                        "mix_active" ) );
    mix_osc1_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap(
                                          "mix_inactive" ) );
    ToolTip::add( mix_osc1_btn, tr( "Mix output of oscillator 1 & 2" ) );

    PixmapButton * sync_osc1_btn = new PixmapButton( this, NULL );
    sync_osc1_btn->move( mod_x + 105, mod1_y );
    sync_osc1_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap(
                                         "sync_active" ) );
    sync_osc1_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap(
                                           "sync_inactive" ) );
    ToolTip::add( sync_osc1_btn, tr( "Synchronize oscillator 1 with "
                                     "oscillator 2" ) );

    PixmapButton * fm_osc1_btn = new PixmapButton( this, NULL );
    fm_osc1_btn->move( mod_x + 140, mod1_y );
    fm_osc1_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap(
                                       "fm_active" ) );
    fm_osc1_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap(
                                         "fm_inactive" ) );
    ToolTip::add( fm_osc1_btn, tr( "Use frequency modulation for "
                                   "modulating oscillator 1 with "
                                   "oscillator 2" ) );

    m_mod1BtnGrp = new automatableButtonGroup( this );
    m_mod1BtnGrp->addButton( pm_osc1_btn );
    m_mod1BtnGrp->addButton( am_osc1_btn );
    m_mod1BtnGrp->addButton( mix_osc1_btn );
    m_mod1BtnGrp->addButton( sync_osc1_btn );
    m_mod1BtnGrp->addButton( fm_osc1_btn );



    PixmapButton * pm_osc2_btn = new PixmapButton( this, NULL );
    pm_osc2_btn->move( mod_x, mod2_y );
    pm_osc2_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap(
                                       "pm_active" ) );
    pm_osc2_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap(
                                         "pm_inactive" ) );
    ToolTip::add( pm_osc2_btn, tr( "Use phase modulation for "
                                   "modulating oscillator 2 with "
                                   "oscillator 3" ) );

    PixmapButton * am_osc2_btn = new PixmapButton( this, NULL );
    am_osc2_btn->move( mod_x + 35, mod2_y );
    am_osc2_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap(
                                       "am_active" ) );
    am_osc2_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap(
                                         "am_inactive" ) );
    ToolTip::add( am_osc2_btn, tr( "Use amplitude modulation for "
                                   "modulating oscillator 2 with "
                                   "oscillator 3" ) );

    PixmapButton * mix_osc2_btn = new PixmapButton( this, NULL );
    mix_osc2_btn->move( mod_x + 70, mod2_y );
    mix_osc2_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap(
                                        "mix_active" ) );
    mix_osc2_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap(
                                          "mix_inactive" ) );
    ToolTip::add( mix_osc2_btn, tr("Mix output of oscillator 2 & 3" ) );

    PixmapButton * sync_osc2_btn = new PixmapButton( this, NULL );
    sync_osc2_btn->move( mod_x + 105, mod2_y );
    sync_osc2_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap(
                                         "sync_active" ) );
    sync_osc2_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap(
                                           "sync_inactive" ) );
    ToolTip::add( sync_osc2_btn, tr( "Synchronize oscillator 2 with "
                                     "oscillator 3" ) );

    PixmapButton * fm_osc2_btn = new PixmapButton( this, NULL );
    fm_osc2_btn->move( mod_x + 140, mod2_y );
    fm_osc2_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap(
                                       "fm_active" ) );
    fm_osc2_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap(
                                         "fm_inactive" ) );
    ToolTip::add( fm_osc2_btn, tr( "Use frequency modulation for "
                                   "modulating oscillator 2 with "
                                   "oscillator 3" ) );

    m_mod2BtnGrp = new automatableButtonGroup( this );

    m_mod2BtnGrp->addButton( pm_osc2_btn );
    m_mod2BtnGrp->addButton( am_osc2_btn );
    m_mod2BtnGrp->addButton( mix_osc2_btn );
    m_mod2BtnGrp->addButton( sync_osc2_btn );
    m_mod2BtnGrp->addButton( fm_osc2_btn );


    for( int i = 0; i < NUM_OF_OSCILLATORS; ++i )
    {
        int knob_y = osc_y + i * osc_h;

        // setup volume-knob
        Knob * vk = new Knob( knobStyled, this );
        vk->setVolumeKnob( true );
        vk->setFixedSize( 28, 35 );
        vk->move( 6, knob_y );
        vk->setHintText( tr( "Osc %1 volume:" ).arg(
                             i+1 ), "%" );
        vk->setWhatsThis(
            tr( "With this knob you can set the volume of "
                "oscillator %1. When setting a value of 0 the "
                "oscillator is turned off. Otherwise you can "
                "hear the oscillator as loud as you set it "
                "here.").arg( i+1 ) );

        // setup panning-knob
        Knob * pk = new TripleOscKnob( this );
        pk->move( 35, knob_y );
        pk->setHintText( tr("Osc %1 panning:").arg( i + 1 ), "" );
        pk->setWhatsThis(
            tr( "With this knob you can set the panning of the "
                "oscillator %1. A value of -100 means 100% "
                "left and a value of 100 moves oscillator-"
                "output right.").arg( i+1 ) );

        // setup coarse-knob
        Knob * ck = new TripleOscKnob( this );
        ck->move( 82, knob_y );
        ck->setHintText( tr( "Osc %1 coarse detuning:" ).arg( i + 1 )
                         , " " + tr( "semitones" ) );
        ck->setWhatsThis(
            tr( "With this knob you can set the coarse detuning of "
                "oscillator %1. You can detune the oscillator "
                "24 semitones (2 octaves) up and down. This is "
                "useful for creating sounds with a chord." ).
            arg( i + 1 ) );


        // setup knob for left fine-detuning
        Knob * flk = new TripleOscKnob( this );
        flk->move( 111, knob_y );
        flk->setHintText( tr( "Osc %1 fine detuning left:" ).
                          arg( i + 1 ),
                          " " + tr( "cents" ) );
        flk->setWhatsThis(
            tr( "With this knob you can set the fine detuning of "
                "oscillator %1 for the left channel. The fine-"
                "detuning is ranged between -100 cents and "
                "+100 cents. This is useful for creating "
                "\"fat\" sounds." ).arg( i + 1 ) );

        // setup knob for right fine-detuning
        Knob * frk = new TripleOscKnob( this );
        frk->move( 140, knob_y );
        frk->setHintText( tr( "Osc %1 fine detuning right:" ).
                          arg( i + 1 ),
                          " " + tr( "cents" ) );
        frk->setWhatsThis(
            tr( "With this knob you can set the fine detuning of "
                "oscillator %1 for the right channel. The "
                "fine-detuning is ranged between -100 cents "
                "and +100 cents. This is useful for creating "
                "\"fat\" sounds." ).arg( i+1 ) );


        // setup phase-offset-knob
        Knob * pok = new TripleOscKnob( this );
        pok->move( 188, knob_y );
        pok->setHintText( tr( "Osc %1 phase-offset:" ).
                          arg( i + 1 ),
                          " " + tr( "degrees" ) );
        pok->setWhatsThis(
            tr( "With this knob you can set the phase-offset of "
                "oscillator %1. That means you can move the "
                "point within an oscillation where the "
                "oscillator begins to oscillate. For example "
                "if you have a sine-wave and have a phase-"
                "offset of 180 degrees the wave will first go "
                "down. It's the same with a square-wave."
              ).arg( i+1 ) );

        // setup stereo-phase-detuning-knob
        Knob * spdk = new TripleOscKnob( this );
        spdk->move( 217, knob_y );
        spdk->setHintText( tr("Osc %1 stereo phase-detuning:" ).
                           arg( i + 1 ),
                           " " + tr( "degrees" ) );
        spdk->setWhatsThis(
            tr( "With this knob you can set the stereo phase-"
                "detuning of oscillator %1. The stereo phase-"
                "detuning specifies the size of the difference "
                "between the phase-offset of left and right "
                "channel. This is very good for creating wide "
                "stereo sounds." ).arg( i+1 ) );

        int btn_y = 96 + i * osc_h;

        PixmapButton * sin_wave_btn = new PixmapButton( this, NULL );
        sin_wave_btn->move( 128, btn_y );
        sin_wave_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap(
                                            "sin_shape_active" ) );
        sin_wave_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap(
                                              "sin_shape_inactive" ) );
        ToolTip::add( sin_wave_btn,
                      tr( "Use a sine-wave for "
                          "current oscillator." ) );

        PixmapButton * triangle_wave_btn =
            new PixmapButton( this, NULL );
        triangle_wave_btn->move( 143, btn_y );
        triangle_wave_btn->setActiveGraphic(
            PLUGIN_NAME::getIconPixmap( "triangle_shape_active" ) );
        triangle_wave_btn->setInactiveGraphic(
            PLUGIN_NAME::getIconPixmap( "triangle_shape_inactive" ) );
        ToolTip::add( triangle_wave_btn,
                      tr( "Use a triangle-wave "
                          "for current oscillator." ) );

        PixmapButton * saw_wave_btn = new PixmapButton( this, NULL );
        saw_wave_btn->move( 158, btn_y );
        saw_wave_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap(
                                            "saw_shape_active" ) );
        saw_wave_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap(
                                              "saw_shape_inactive" ) );
        ToolTip::add( saw_wave_btn,
                      tr( "Use a saw-wave for "
                          "current oscillator." ) );

        PixmapButton * sqr_wave_btn = new PixmapButton( this, NULL );
        sqr_wave_btn->move( 173, btn_y );
        sqr_wave_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap(
                                            "square_shape_active" ) );
        sqr_wave_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap(
                                              "square_shape_inactive" ) );
        ToolTip::add( sqr_wave_btn,
                      tr( "Use a square-wave for "
                          "current oscillator." ) );

        PixmapButton * moog_saw_wave_btn =
            new PixmapButton( this, NULL );
        moog_saw_wave_btn->move( 188, btn_y );
        moog_saw_wave_btn->setActiveGraphic(
            PLUGIN_NAME::getIconPixmap( "moog_saw_shape_active" ) );
        moog_saw_wave_btn->setInactiveGraphic(
            PLUGIN_NAME::getIconPixmap( "moog_saw_shape_inactive" ) );
        ToolTip::add( moog_saw_wave_btn,
                      tr( "Use a moog-like saw-wave "
                          "for current oscillator." ) );

        PixmapButton * exp_wave_btn = new PixmapButton( this, NULL );
        exp_wave_btn->move( 203, btn_y );
        exp_wave_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap(
                                            "exp_shape_active" ) );
        exp_wave_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap(
                                              "exp_shape_inactive" ) );
        ToolTip::add( exp_wave_btn,
                      tr( "Use an exponential "
                          "wave for current oscillator." ) );

        PixmapButton * white_noise_btn = new PixmapButton( this, NULL );
        white_noise_btn->move( 218, btn_y );
        white_noise_btn->setActiveGraphic(
            PLUGIN_NAME::getIconPixmap( "white_noise_shape_active" ) );
        white_noise_btn->setInactiveGraphic(
            PLUGIN_NAME::getIconPixmap( "white_noise_shape_inactive" ) );
        ToolTip::add( white_noise_btn,
                      tr( "Use white-noise for "
                          "current oscillator." ) );

        PixmapButton * uwb = new PixmapButton( this, NULL );
        uwb->move( 233, btn_y );
        uwb->setActiveGraphic( PLUGIN_NAME::getIconPixmap(
                                   "usr_shape_active" ) );
        uwb->setInactiveGraphic( PLUGIN_NAME::getIconPixmap(
                                     "usr_shape_inactive" ) );
        ToolTip::add( uwb, tr( "Use a user-defined "
                               "waveform for current oscillator." ) );

        automatableButtonGroup * wsbg =
            new automatableButtonGroup( this );

        wsbg->addButton( sin_wave_btn );
        wsbg->addButton( triangle_wave_btn );
        wsbg->addButton( saw_wave_btn );
        wsbg->addButton( sqr_wave_btn );
        wsbg->addButton( moog_saw_wave_btn );
        wsbg->addButton( exp_wave_btn );
        wsbg->addButton( white_noise_btn );
        wsbg->addButton( uwb );

        m_oscKnobs[i] = OscillatorKnobs( vk, pk, ck, flk, frk, pok,
                                         spdk, uwb, wsbg );
    }
}
Esempio n. 2
0
void organicInstrumentView::modelChanged()
{
	organicInstrument * oi = castModel<organicInstrument>();
	
	const float y=91.0f;
	const float rowHeight = 26.0f;
	const float x=53.0f;
	const float colWidth = 24.0f; 

	m_numOscillators = oi->m_numOscillators;
	
	m_fx1Knob->setModel( &oi->m_fx1Model );
	m_volKnob->setModel( &oi->m_volModel );

	if( m_oscKnobs != NULL ) 
	{
		delete[] m_oscKnobs;
	}
	
	m_oscKnobs = new OscillatorKnobs[ m_numOscillators ];

	// Create knobs, now that we know how many to make
	for( int i = 0; i < m_numOscillators; ++i )
	{
		// setup harmonic knob
		Knob * harmKnob = new organicKnob( this );
		harmKnob->move( x + i * colWidth, y - rowHeight );
		harmKnob->setObjectName( "harmKnob" );
		connect( &oi->m_osc[i]->m_harmModel, SIGNAL( dataChanged() ),
			this, SLOT( updateKnobHint() ) );
			
		// setup waveform-knob
		Knob * oscKnob = new organicKnob( this );
		oscKnob->move( x + i * colWidth, y );
		connect( &oi->m_osc[i]->m_oscModel, SIGNAL( dataChanged() ),
			this, SLOT( updateKnobHint() ) );

		oscKnob->setHintText( tr( "Osc %1 waveform:" ).arg( i + 1 ) + " ", QString() );
										
		// setup volume-knob
		Knob * volKnob = new Knob( knobStyled, this );
		volKnob->setVolumeKnob( true );
		volKnob->move( x + i * colWidth, y + rowHeight*1 );
		volKnob->setFixedSize( 21, 21 );
		volKnob->setHintText( tr( "Osc %1 volume:" ).arg(
							i + 1 ) + " ", "%" );
							
		// setup panning-knob
		Knob * panKnob = new organicKnob( this );
		panKnob->move( x + i  * colWidth, y + rowHeight*2 );
		panKnob->setHintText( tr("Osc %1 panning:").arg(
							i + 1 ) + " ", "" );
							
		// setup knob for fine-detuning
		Knob * detuneKnob = new organicKnob( this );
		detuneKnob->move( x + i * colWidth, y + rowHeight*3 );
		detuneKnob->setHintText( tr( "Osc %1 stereo detuning" ).arg( i + 1 )
							+ " ", " " +
							tr( "cents" ) );

		m_oscKnobs[i] = OscillatorKnobs( harmKnob, volKnob, oscKnob, panKnob, detuneKnob );

		// Attach to models
		m_oscKnobs[i].m_harmKnob->setModel( &oi->m_osc[i]->m_harmModel );
		m_oscKnobs[i].m_volKnob->setModel( &oi->m_osc[i]->m_volModel );
		m_oscKnobs[i].m_oscKnob->setModel( &oi->m_osc[i]->m_oscModel );
		m_oscKnobs[i].m_panKnob->setModel( &oi->m_osc[i]->m_panModel );
		m_oscKnobs[i].m_detuneKnob->setModel( &oi->m_osc[i]->m_detuneModel );
	}
	updateKnobHint();
}
Esempio n. 3
0
void VPiano::initExtraControllers()
{
    QWidget *w = NULL;
    QCheckBox *chkbox = NULL;
    Knob *knob = NULL;
    QSpinBox *spin = NULL;
    QSlider *slider = NULL;
    QToolButton *button = NULL;
    foreach(const QString& s, m_extraControls) {
        QString lbl;
        int control = 0;
        int type = 0;
        int minValue = 0;
        int maxValue = 127;
        int defValue = 0;
        int value = 0;
        int size = 100;
        QString fileName;
        ExtraControl::decodeString( s, lbl, control, type,
                                    minValue, maxValue, defValue,
                                    size, fileName );
        if (m_ctlState[m_channel].contains(control))
            value = m_ctlState[m_channel][control];
        else
            value = defValue;
        switch(type) {
        case 0:
            chkbox = new QCheckBox(this);
            if (dlgPreferences()->getStyledWidgets()) {
                chkbox->setStyle(m_dialStyle);
            }
            chkbox->setProperty(MIDICTLONVALUE, maxValue);
            chkbox->setProperty(MIDICTLOFFVALUE, minValue);
            chkbox->setChecked(bool(value));
            connect(chkbox, SIGNAL(clicked(bool)), SLOT(slotControlClicked(bool)));
            w = chkbox;
            break;
        case 1:
            knob = new Knob(this);
            knob->setFixedSize(32, 32);
            knob->setStyle(dlgPreferences()->getStyledWidgets()? m_dialStyle : NULL);
            knob->setMinimum(minValue);
            knob->setMaximum(maxValue);
            knob->setValue(value);
            knob->setToolTip(QString::number(value));
            knob->setDefaultValue(defValue);
            knob->setDialMode(Knob::LinearMode);
            connect(knob, SIGNAL(sliderMoved(int)), SLOT(slotExtraController(int)));
            w = knob;
            break;
        case 2:
            spin = new QSpinBox(this);
            spin->setMinimum(minValue);
            spin->setMaximum(maxValue);
            spin->setValue(value);
            connect(spin, SIGNAL(valueChanged(int)), SLOT(slotExtraController(int)));
            w = spin;
            break;
        case 3:
            slider = new QSlider(this);
            slider->setOrientation(Qt::Horizontal);
            slider->setFixedWidth(size);
            slider->setMinimum(minValue);
            slider->setMaximum(maxValue);
            slider->setToolTip(QString::number(value));
            slider->setValue(value);
            connect(slider, SIGNAL(sliderMoved(int)), SLOT(slotExtraController(int)));
            w = slider;
            break;
        case 4:
            button = new QToolButton(this);
            button->setText(lbl);
            button->setProperty(MIDICTLONVALUE, maxValue);
            button->setProperty(MIDICTLOFFVALUE, minValue);
            connect(button, SIGNAL(clicked(bool)), SLOT(slotControlClicked(bool)));
            w = button;
            break;
        case 5:
            control = 255;
            button = new QToolButton(this);
            button->setText(lbl);
            button->setProperty(SYSEXFILENAME, fileName);
            button->setProperty(SYSEXFILEDATA, readSysexDataFile(fileName));
            connect(button, SIGNAL(clicked(bool)), SLOT(slotControlClicked(bool)));
            w = button;
            break;
        default:
            w = NULL;
        }
        if (w != NULL) {
            if (!lbl.isEmpty() && type < 4) {
                QLabel *qlbl = new QLabel(lbl, this);
                qlbl->setMargin(TOOLBARLABELMARGIN);
                ui.toolBarExtra->addWidget(qlbl);
                //connect(qlbl, SIGNAL(destroyed(QObject*)), SLOT(slotDebugDestroyed(QObject*)));
            }
            w->setProperty(MIDICTLNUMBER, control);
            w->setFocusPolicy(Qt::NoFocus);
            ui.toolBarExtra->addWidget(w);
            //connect(w, SIGNAL(destroyed(QObject*)), SLOT(slotDebugDestroyed(QObject*)));
        }
    }