root/branches/new_fx_rack_and_sample_fun/gui/src/PatternEditor/PatternEditorPanel.cpp @ 600

Revision 600, 29.9 KB (checked in by wolke, 5 years ago)

correct stringtokey if octave have negative values

Line 
1/*
2 * Hydrogen
3 * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net]
4 *
5 * http://www.hydrogen-music.org
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY, without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20 *
21 */
22
23#include <hydrogen/Preferences.h>
24#include <hydrogen/hydrogen.h>
25#include <hydrogen/instrument.h>
26#include <hydrogen/Pattern.h>
27#include <hydrogen/audio_engine.h>
28#include <hydrogen/event_queue.h>
29using namespace H2Core;
30
31
32#include "HydrogenApp.h"
33#include "PatternEditorPanel.h"
34#include "PatternEditorInstrumentList.h"
35#include "PatternEditorRuler.h"
36#include "NotePropertiesRuler.h"
37#include "DrumPatternEditor.h"
38#include "PianoRollEditor.h"
39
40#include "../MainForm.h"
41#include "../widgets/Button.h"
42#include "../widgets/Fader.h"
43#include "../widgets/PixmapWidget.h"
44#include "../widgets/LCDCombo.h"
45
46#include "../Skin.h"
47#include "../SongEditor/SongEditorPanel.h"
48
49#include <cmath>
50
51#include <QtGui>
52
53
54void PatternEditorPanel::updateSLnameLabel( )
55{
56        QFont font;
57        font.setBold( true );
58        pSLlabel->setFont( font );
59        pSLlabel->setText( Hydrogen::get_instance()->m_currentDrumkit  );
60}
61
62
63
64PatternEditorPanel::PatternEditorPanel( QWidget *pParent )
65 : QWidget( pParent )
66 , Object( "PatternEditorPanel" )
67 , m_pPattern( NULL )
68 , m_bEnablePatternResize( true )
69{
70        setAcceptDrops(true);
71
72        Preferences *pPref = Preferences::getInstance();
73       
74
75// Editor TOP
76        PixmapWidget *editor_top = new PixmapWidget(0);
77        editor_top->setPixmap("/patternEditor/editor_top.png", true);
78        editor_top->setFixedHeight(24);
79
80        PixmapWidget *editor_top_2 = new PixmapWidget(0);
81        editor_top_2->setPixmap("/patternEditor/editor_top.png", true);
82        editor_top_2->setFixedHeight(24);
83
84        QHBoxLayout *editor_top_hbox = new QHBoxLayout(editor_top);
85        editor_top_hbox->setSpacing(0);
86        editor_top_hbox->setMargin(0);
87        editor_top_hbox->setAlignment(Qt::AlignLeft);
88
89        QHBoxLayout *editor_top_hbox_2 = new QHBoxLayout(editor_top_2);
90        editor_top_hbox_2->setSpacing(0);
91        editor_top_hbox_2->setMargin(0);
92        editor_top_hbox_2->setAlignment(Qt::AlignLeft);
93
94
95        //soundlibrary name
96        pSLlabel = new QLabel( NULL );
97        pSLlabel->setText( Hydrogen::get_instance()->m_currentDrumkit );
98        pSLlabel->setFixedSize( 170, 20 );
99        pSLlabel->move( 10, 3 );
100        pSLlabel->setToolTip( trUtf8("Loaded Soundlibrary") );
101        editor_top_hbox->addWidget( pSLlabel );
102
103//wolke some background images back_size_res
104        PixmapWidget *pSizeResol = new PixmapWidget( NULL );
105        pSizeResol->setFixedSize( 200, 20 );
106        pSizeResol->setPixmap( "/patternEditor/background_res-new.png" );
107        pSizeResol->move( 0, 3 );
108        editor_top_hbox_2->addWidget( pSizeResol );
109
110        // PATTERN size
111        __pattern_size_combo = new LCDCombo(pSizeResol, 4);
112        __pattern_size_combo->move( 34, 2 );
113        __pattern_size_combo->setToolTip( trUtf8("Select pattern size") );
114        for ( int i = 1; i <= 32; i++) {
115                __pattern_size_combo->addItem( QString( "%1" ).arg( i ) );
116        }
117        __pattern_size_combo->update();
118        connect(__pattern_size_combo, SIGNAL( valueChanged( QString ) ), this, SLOT( patternSizeChanged(QString) ) );
119        //editor_top_hbox->addWidget(__pattern_size_combo);
120
121
122        // GRID resolution
123        __resolution_combo = new LCDCombo( pSizeResol , 7);
124        __resolution_combo->setToolTip(trUtf8("Select grid resolution"));
125        __resolution_combo->addItem( "4" );
126        __resolution_combo->addItem( "8" );
127        __resolution_combo->addItem( "16" );
128        __resolution_combo->addItem( "32" );
129        __resolution_combo->addItem( "64" );
130        __resolution_combo->addSeparator();
131        __resolution_combo->addItem( "4T" );
132        __resolution_combo->addItem( "8T" );
133        __resolution_combo->addItem( "16T" );
134        __resolution_combo->addItem( "32T" );
135        __resolution_combo->addSeparator();
136        __resolution_combo->addItem( "off" );
137        __resolution_combo->update();
138        __resolution_combo->move( 121, 2 );
139        connect(__resolution_combo, SIGNAL(valueChanged(QString)), this, SLOT(gridResolutionChanged(QString)));
140        //editor_top_hbox->addWidget(__resolution_combo);
141
142
143//wolke some background images hear note rec quant
144
145        PixmapWidget *pRec = new PixmapWidget( NULL );
146        pRec->setFixedSize( 150, 20 );
147        pRec->setPixmap( "/patternEditor/background_rec-new.png" );
148        pRec->move( 0, 3 );
149        editor_top_hbox_2->addWidget( pRec );
150
151
152        // Hear notes btn
153        ToggleButton *hearNotesBtn = new ToggleButton(
154                        pRec,
155                        "/patternEditor/btn_hear_on.png",
156                        "/patternEditor/btn_hear_off.png",
157                        "/patternEditor/btn_hear_off.png",
158                        QSize(15, 13)
159        );
160        hearNotesBtn->move( 34, 3 );
161        hearNotesBtn->setToolTip( trUtf8( "Hear new notes" ) );
162        connect( hearNotesBtn, SIGNAL(clicked(Button*)), this, SLOT( hearNotesBtnClick(Button*)));
163        //editor_top_hbox->addWidget(hearNotesBtn);
164        // restore hear new notes button state
165        hearNotesBtn->setPressed( pPref->getHearNewNotes() );
166
167
168        // Record events btn
169        ToggleButton* recordEventsBtn = new ToggleButton(
170                        pRec,
171                        "/patternEditor/btn_record_on.png",
172                        "/patternEditor/btn_record_off.png",
173                        "/patternEditor/btn_record_off.png",
174                        QSize(15, 13)
175        );
176        recordEventsBtn->move( 74, 3 );
177        recordEventsBtn->setPressed( pPref->getRecordEvents());
178        recordEventsBtn->setToolTip( trUtf8( "Record keyboard/midi events" ) );
179        connect( recordEventsBtn, SIGNAL(clicked(Button*)), this, SLOT( recordEventsBtnClick(Button*)));
180        //editor_top_hbox->addWidget(recordEventsBtn);
181
182
183        // quantize
184        ToggleButton* quantizeEventsBtn = new ToggleButton(
185                        pRec,
186                        "/patternEditor/btn_quant_on.png",
187                        "/patternEditor/btn_quant_off.png",
188                        "/patternEditor/btn_quant_off.png",
189                        QSize(15, 13)
190        );
191        quantizeEventsBtn->move( 130, 3 );
192        quantizeEventsBtn->setPressed( pPref->getQuantizeEvents());
193        quantizeEventsBtn->setToolTip( trUtf8( "Quantize keyboard/midi events to grid" ) );
194        connect( quantizeEventsBtn, SIGNAL(clicked(Button*)), this, SLOT( quantizeEventsBtnClick(Button*)));
195        //editor_top_hbox->addWidget(quantizeEventsBtn);
196
197
198//      PixmapWidget *pZoom = new PixmapWidget( NULL );
199//      pZoom->setFixedSize( 73, 20 );
200//      pZoom->setPixmap( "/patternEditor/background_zoom-new.png" );
201//      pZoom->move( 0, 3 );
202//      editor_top_hbox_2->addWidget( pZoom );
203
204        QComboBox *selInstrument = new QComboBox( NULL );
205        selInstrument->setFixedSize( 170, 20 );
206        selInstrument->move( 2, 1 );
207        selInstrument->addItem ( QString( "keyb: play drumset" ));
208        selInstrument->addItem ( QString( "keyb: play instrument" ));
209        editor_top_hbox_2->addWidget( selInstrument );
210        connect( selInstrument, SIGNAL( currentIndexChanged( QString ) ), this, SLOT( playselectedinstrument(QString) ) );
211
212        // zoom-in btn
213        Button *zoom_in_btn = new Button(
214                        NULL,
215                        "/songEditor/btn_new_on.png",
216                        "/songEditor/btn_new_off.png",
217                        "/songEditor/btn_new_over.png",
218                        QSize(19, 13)
219        );
220//      zoom_in_btn->move( 51, 3 );
221//      zoom_in_btn->setText("+");
222        zoom_in_btn->setToolTip( trUtf8( "Zoom in" ) );
223        connect(zoom_in_btn, SIGNAL(clicked(Button*)), this, SLOT( zoomInBtnClicked(Button*) ) );
224        //editor_top_hbox_2->addWidget(zoom_in_btn);
225
226
227        // zoom-out btn
228        Button *zoom_out_btn = new Button(
229                        NULL,
230                        "/songEditor/btn_minus_on.png",
231                        "/songEditor/btn_minus_off.png",
232                        "/songEditor/btn_minus_over.png",
233                        QSize(19, 13)
234        );
235//      zoom_out_btn->move( 2, 3 );
236        //zoom_out_btn->setText("-");
237        zoom_out_btn->setToolTip( trUtf8( "Zoom out" ) );
238        connect( zoom_out_btn, SIGNAL(clicked(Button*)), this, SLOT( zoomOutBtnClicked(Button*) ) );
239        //editor_top_hbox_2->addWidget(zoom_out_btn);
240
241
242// End Editor TOP
243
244
245// RULER____________________________________
246
247        // Ruler ScrollView
248        m_pRulerScrollView = new QScrollArea( NULL );
249        m_pRulerScrollView->setFrameShape( QFrame::NoFrame );
250        m_pRulerScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
251        m_pRulerScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
252        m_pRulerScrollView->setFixedHeight( 25 );
253        // Ruler
254        m_pPatternEditorRuler = new PatternEditorRuler( m_pRulerScrollView->viewport() );
255
256        m_pRulerScrollView->setWidget( m_pPatternEditorRuler );
257
258//~ RULER
259
260
261// EDITOR _____________________________________
262        // Editor scrollview
263        m_pEditorScrollView = new QScrollArea( NULL );
264        m_pEditorScrollView->setFrameShape( QFrame::NoFrame );
265        m_pEditorScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
266        m_pEditorScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
267
268
269
270        // Editor
271        m_pDrumPatternEditor = new DrumPatternEditor( m_pEditorScrollView->viewport(), this );
272
273        m_pEditorScrollView->setWidget( m_pDrumPatternEditor );
274
275        connect( m_pEditorScrollView->verticalScrollBar(), SIGNAL( valueChanged(int) ), this, SLOT( on_patternEditorScroll(int) ) );
276
277
278
279/*
280        m_pPianoRollScrollView = new QScrollArea( NULL );
281        m_pPianoRollScrollView->setFrameShape( QFrame::NoFrame );
282        m_pPianoRollScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
283        m_pPianoRollScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
284
285        m_pPianoRollEditor = new PianoRollEditor( m_pPianoRollScrollView->viewport() );
286        m_pPianoRollScrollView->setWidget( m_pPianoRollEditor );
287
288        connect( m_pPianoRollScrollView->verticalScrollBar(), SIGNAL( valueChanged(int) ), this, SLOT( on_patternEditorScroll(int) ) );
289
290
291        m_pPianoRollScrollView->hide();
292*/
293//~ EDITOR
294
295
296
297
298
299
300// INSTRUMENT LIST
301        // Instrument list scrollview
302        m_pInstrListScrollView = new QScrollArea( NULL );
303        m_pInstrListScrollView->setFrameShape( QFrame::NoFrame );
304        m_pInstrListScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
305        m_pInstrListScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
306
307        // Instrument list
308        m_pInstrumentList = new PatternEditorInstrumentList( m_pInstrListScrollView->viewport(), this );
309        m_pInstrListScrollView->setWidget( m_pInstrumentList );
310        m_pInstrListScrollView->setFixedWidth( m_pInstrumentList->width() );
311
312        connect( m_pInstrListScrollView->verticalScrollBar(), SIGNAL( valueChanged(int) ), this, SLOT( on_patternEditorScroll(int) ) );
313//~ INSTRUMENT LIST
314
315
316
317
318// NOTE_VELOCITY EDITOR
319        m_pNoteVelocityScrollView = new QScrollArea( NULL );
320        m_pNoteVelocityScrollView->setFrameShape( QFrame::NoFrame );
321        m_pNoteVelocityScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
322        m_pNoteVelocityScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
323        m_pNoteVelocityEditor = new NotePropertiesRuler( m_pNoteVelocityScrollView->viewport(), this, NotePropertiesRuler::VELOCITY );
324        m_pNoteVelocityScrollView->setWidget( m_pNoteVelocityEditor );
325        m_pNoteVelocityScrollView->setFixedHeight( 100 );
326//~ NOTE_VELOCITY EDITOR
327
328
329// NOTE_PAN EDITOR
330        m_pNotePanScrollView = new QScrollArea( NULL );
331        m_pNotePanScrollView->setFrameShape( QFrame::NoFrame );
332        m_pNotePanScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
333        m_pNotePanScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
334        m_pNotePanEditor = new NotePropertiesRuler( m_pNotePanScrollView->viewport(), this, NotePropertiesRuler::PAN );
335        m_pNotePanScrollView->setWidget( m_pNotePanEditor );
336        m_pNotePanScrollView->setFixedHeight( 100 );
337//~ NOTE_PAN EDITOR
338
339
340// NOTE_LEADLAG EDITOR
341        m_pNoteLeadLagScrollView = new QScrollArea( NULL );
342        m_pNoteLeadLagScrollView->setFrameShape( QFrame::NoFrame );
343        m_pNoteLeadLagScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
344        m_pNoteLeadLagScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
345        m_pNoteLeadLagEditor = new NotePropertiesRuler( m_pNoteLeadLagScrollView->viewport(), this, NotePropertiesRuler::LEADLAG );
346        m_pNoteLeadLagScrollView->setWidget( m_pNoteLeadLagEditor );
347        m_pNoteLeadLagScrollView->setFixedHeight( 100 );
348//~ NOTE_LEADLAG EDITOR
349
350
351// NOTE_NOTEKEY EDITOR
352
353
354        m_pNoteNoteKeyScrollView = new QScrollArea( NULL );
355        m_pNoteNoteKeyScrollView->setFrameShape( QFrame::NoFrame );
356        m_pNoteNoteKeyScrollView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
357        m_pNoteNoteKeyScrollView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
358        m_pNoteNoteKeyEditor = new NotePropertiesRuler( m_pNoteNoteKeyScrollView->viewport(), this, NotePropertiesRuler::NOTEKEY );
359        m_pNoteNoteKeyScrollView->setWidget( m_pNoteNoteKeyEditor );
360        m_pNoteNoteKeyScrollView->setFixedHeight( 210 );
361
362
363//~ NOTE_NOTEKEY EDITOR
364
365
366        // external horizontal scrollbar
367        m_pPatternEditorHScrollBar = new QScrollBar( Qt::Horizontal , NULL  );
368        connect( m_pPatternEditorHScrollBar, SIGNAL(valueChanged(int)), this, SLOT( syncToExternalHorizontalScrollbar(int) ) );
369
370        // external vertical scrollbar
371        m_pPatternEditorVScrollBar = new QScrollBar( Qt::Vertical, NULL );
372        connect( m_pPatternEditorVScrollBar, SIGNAL(valueChanged(int)), this, SLOT( syncToExternalHorizontalScrollbar(int) ) );
373
374        QHBoxLayout *pPatternEditorHScrollBarLayout = new QHBoxLayout();
375        pPatternEditorHScrollBarLayout->setSpacing( 0 );
376        pPatternEditorHScrollBarLayout->setMargin( 0 );
377        pPatternEditorHScrollBarLayout->addWidget( m_pPatternEditorHScrollBar );
378        pPatternEditorHScrollBarLayout->addWidget( zoom_in_btn );
379        pPatternEditorHScrollBarLayout->addWidget( zoom_out_btn );
380
381        QWidget *pPatternEditorHScrollBarContainer = new QWidget();
382        pPatternEditorHScrollBarContainer->setLayout( pPatternEditorHScrollBarLayout );
383
384
385        QPalette label_palette;
386        label_palette.setColor( QPalette::Foreground, QColor( 230, 230, 230 ) );
387
388        QFont boldFont;
389        boldFont.setBold( true );
390        m_pPatternNameLbl = new QLabel( NULL );
391        m_pPatternNameLbl->setFont( boldFont );
392        m_pPatternNameLbl->setText( "pattern name label" );
393        //m_pPatternNameLbl->setFixedWidth(200);
394        m_pPatternNameLbl->setPalette(label_palette);
395
396
397
398
399
400
401// NOTE_PROPERTIES BUTTONS
402        PixmapWidget *pPropertiesPanel = new PixmapWidget( NULL );
403        pPropertiesPanel->setColor( QColor( 58, 62, 72 ) );
404
405        pPropertiesPanel->setFixedSize( 181, 100 );
406
407        QVBoxLayout *pPropertiesVBox = new QVBoxLayout( pPropertiesPanel );
408        pPropertiesVBox->setSpacing( 0 );
409        pPropertiesVBox->setMargin( 0 );
410
411
412        LCDCombo* pPropertiesCombo = new LCDCombo( NULL, 20);
413        pPropertiesCombo->setToolTip(trUtf8("Select note properties"));
414        pPropertiesCombo->addItem( trUtf8("Velocity") );
415        pPropertiesCombo->addItem( trUtf8("Pan") );
416        pPropertiesCombo->addItem( trUtf8("Lead and Lag") );
417        pPropertiesCombo->addItem( trUtf8("NoteKey") );
418        pPropertiesCombo->update();
419        connect( pPropertiesCombo, SIGNAL(valueChanged(QString)), this, SLOT(propertiesComboChanged(QString)));
420
421        pPropertiesVBox->addWidget( pPropertiesCombo );
422
423
424//~ NOTE_PROPERTIES BUTTONS
425
426
427// LAYOUT
428        QWidget *pMainPanel = new QWidget();
429
430        QGridLayout *pGrid = new QGridLayout();
431        pGrid->setSpacing( 0 );
432        pGrid->setMargin( 0 );
433
434        pGrid->addWidget( editor_top, 0, 0);
435        pGrid->addWidget( editor_top_2, 0, 1, 1, 3);
436        pGrid->addWidget( m_pPatternNameLbl, 1, 0 );
437        pGrid->addWidget( m_pRulerScrollView, 1, 1 );
438
439        pGrid->addWidget( m_pInstrListScrollView, 2, 0 );
440
441        pGrid->addWidget( m_pEditorScrollView, 2, 1 );
442//      pGrid->addWidget( m_pPianoRollScrollView, 2, 1 );
443
444        pGrid->addWidget( m_pPatternEditorVScrollBar, 2, 2 );
445        pGrid->addWidget( pPatternEditorHScrollBarContainer, 10, 1 );
446        pGrid->addWidget( m_pNoteVelocityScrollView, 4, 1 );
447        pGrid->addWidget( m_pNotePanScrollView, 4, 1 );
448        pGrid->addWidget( m_pNoteLeadLagScrollView, 4, 1 );
449        pGrid->addWidget( m_pNoteNoteKeyScrollView, 4, 1 );
450
451        pGrid->addWidget( pPropertiesPanel, 4, 0 );
452        pGrid->setRowStretch( 2, 100 );
453        pMainPanel->setLayout( pGrid );
454
455
456
457
458
459        // restore grid resolution
460        int nIndex;
461        if ( pPref->isPatternEditorUsingTriplets() == false ) {
462                switch ( pPref->getPatternEditorGridResolution() ) {
463                        case 4:
464                                __resolution_combo->set_text( "4" );
465                                nIndex = 0;
466                                break;
467
468                        case 8:
469                                __resolution_combo->set_text( "8" );
470                                nIndex = 1;
471                                break;
472
473                        case 16:
474                                __resolution_combo->set_text( "16" );
475                                nIndex = 2;
476                                break;
477
478                        case 32:
479                                __resolution_combo->set_text( "32" );
480                                nIndex = 3;
481                                break;
482
483                        case 64:
484                                __resolution_combo->set_text( "64" );
485                                nIndex = 4;
486                                break;
487
488                        default:
489                                ERRORLOG( "Wrong grid resolution: " + to_string( pPref->getPatternEditorGridResolution() ) );
490                                __resolution_combo->set_text( "4" );
491                                nIndex = 0;
492                }
493        }
494        else {
495                switch ( pPref->getPatternEditorGridResolution() ) {
496                        case 8:
497                                __resolution_combo->set_text( "4T" );
498                                nIndex = 5;
499                                break;
500
501                        case 16:
502                                __resolution_combo->set_text( "8T" );
503                                nIndex = 6;
504                                break;
505
506                        case 32:
507                                __resolution_combo->set_text( "16T" );
508                                nIndex = 7;
509                                break;
510
511                        case 64:
512                                __resolution_combo->set_text( "32T" );
513                                nIndex = 8;
514                                break;
515
516                        default:
517                                ERRORLOG( "Wrong grid resolution: " + to_string( pPref->getPatternEditorGridResolution() ) );
518                                __resolution_combo->set_text( "4T" );
519                                nIndex = 5;
520                }
521        }
522        gridResolutionChanged(__resolution_combo->getText());
523
524
525
526
527
528
529        // LAYOUT
530        QVBoxLayout *pVBox = new QVBoxLayout();
531        pVBox->setSpacing( 0 );
532        pVBox->setMargin( 0 );
533        this->setLayout( pVBox );
534
535        pVBox->addWidget( pMainPanel );
536
537        HydrogenApp::getInstance()->addEventListener( this );
538
539        selectedPatternChangedEvent(); // force an update
540
541        pPropertiesCombo->set_text( trUtf8("Velocity"));
542}
543
544
545
546
547PatternEditorPanel::~PatternEditorPanel()
548{
549}
550
551
552
553void PatternEditorPanel::syncToExternalHorizontalScrollbar(int)
554{
555//      INFOLOG( "[syncToExternalHorizontalScrollbar]" );
556
557        // drum Editor
558        m_pEditorScrollView->horizontalScrollBar()->setValue( m_pPatternEditorHScrollBar->value() );
559        m_pEditorScrollView->verticalScrollBar()->setValue( m_pPatternEditorVScrollBar->value() );
560
561        // piano roll Editor
562//      m_pPianoRollScrollView->horizontalScrollBar()->setValue( m_pPatternEditorHScrollBar->value() );
563//      m_pPianoRollScrollView->verticalScrollBar()->setValue( m_pPatternEditorVScrollBar->value() );
564
565
566        // Ruler
567        m_pRulerScrollView->horizontalScrollBar()->setValue( m_pPatternEditorHScrollBar->value() );
568
569        // Instrument list
570        m_pInstrListScrollView->verticalScrollBar()->setValue( m_pPatternEditorVScrollBar->value() );
571
572        // Velocity ruler
573        m_pNoteVelocityScrollView->horizontalScrollBar()->setValue( m_pPatternEditorHScrollBar->value() );
574
575        // pan ruler
576        m_pNotePanScrollView->horizontalScrollBar()->setValue( m_pPatternEditorHScrollBar->value() );
577
578        // leadlag ruler
579        m_pNoteLeadLagScrollView->horizontalScrollBar()->setValue( m_pPatternEditorHScrollBar->value() );
580
581        // notekey ruler
582        m_pNoteNoteKeyScrollView->horizontalScrollBar()->setValue( m_pPatternEditorHScrollBar->value() );
583}
584
585
586void PatternEditorPanel::on_patternEditorScroll(int nValue)
587{
588//      INFOLOG( "[on_patternEditorScroll]" );
589        m_pPatternEditorVScrollBar->setValue( nValue );
590}
591
592
593
594
595void PatternEditorPanel::gridResolutionChanged( QString str )
596{
597        int nResolution;
598        bool bUseTriplets = false;
599
600        if ( str.contains( "off" ) ) {
601                nResolution=MAX_NOTES;
602        }
603        else if ( str.contains( "T" ) ) {
604                bUseTriplets = true;
605                QString temp = str;
606                temp.chop( 1 );
607                nResolution = temp.toInt() * 2;
608        }
609        else {
610                nResolution = str.toInt();
611        }
612
613        //INFOLOG( to_string( nResolution ) );
614        m_pDrumPatternEditor->setResolution( nResolution, bUseTriplets );
615
616        Preferences::getInstance()->setPatternEditorGridResolution( nResolution );
617        Preferences::getInstance()->setPatternEditorUsingTriplets( bUseTriplets );
618}
619
620
621
622void PatternEditorPanel::selectedPatternChangedEvent()
623{
624        PatternList *pPatternList = Hydrogen::get_instance()->getSong()->get_pattern_list();
625        int nSelectedPatternNumber = Hydrogen::get_instance()->getSelectedPatternNumber();
626
627        if ( (nSelectedPatternNumber != -1) && ( (uint)nSelectedPatternNumber < pPatternList->get_size() ) ) {
628                // update pattern name text
629                m_pPattern = pPatternList->get( nSelectedPatternNumber );
630                QString sCurrentPatternName = m_pPattern->get_name();
631                this->setWindowTitle( ( trUtf8( "Pattern editor - %1").arg( sCurrentPatternName ) ) );
632                //m_pNameLCD->setText( sCurrentPatternName );
633                m_pPatternNameLbl->setText( sCurrentPatternName );
634
635                // update pattern size combobox
636                int nPatternSize = m_pPattern->get_lenght();
637                int nEighth = MAX_NOTES / 8;
638                for ( int i = 1; i <= 32; i++ ) {
639                        if ( nPatternSize == nEighth * i ) {
640                                __pattern_size_combo->set_text( QString( "%1" ).arg( i ) );
641                                break;
642                        }
643                }
644        }
645        else {
646                m_pPattern = NULL;
647
648                this->setWindowTitle( ( trUtf8( "Pattern editor - %1").arg(QString("No pattern selected.")) ) );
649                //m_pNameLCD->setText( trUtf8( "No pattern selected" ) );
650                m_pPatternNameLbl->setText( trUtf8( "No pattern selected" ) );
651        }
652
653        resizeEvent( NULL ); // force an update of the scrollbars
654}
655
656
657
658void PatternEditorPanel::hearNotesBtnClick(Button *ref)
659{
660        Preferences *pref = ( Preferences::getInstance() );
661        pref->setHearNewNotes( ref->isPressed() );
662
663        if (ref->isPressed() ) {
664                ( HydrogenApp::getInstance() )->setStatusBarMessage( trUtf8( "Hear new notes = On" ), 2000 );
665        }
666        else {
667                ( HydrogenApp::getInstance() )->setStatusBarMessage( trUtf8( "Hear new notes = Off" ), 2000 );
668        }
669
670}
671
672
673
674void PatternEditorPanel::recordEventsBtnClick(Button *ref)
675{
676        Preferences *pref = ( Preferences::getInstance() );
677        pref->setRecordEvents( ref->isPressed() );
678
679        if (ref->isPressed() ) {
680                ( HydrogenApp::getInstance() )->setStatusBarMessage( trUtf8( "Record keyboard/midi events = On" ), 2000 );
681        }
682        else {
683                ( HydrogenApp::getInstance() )->setStatusBarMessage( trUtf8( "Record keyboard/midi events = Off" ), 2000 );
684        }
685
686
687}
688
689
690void PatternEditorPanel::quantizeEventsBtnClick(Button *ref)
691{
692        Preferences *pref = ( Preferences::getInstance() );
693        pref->setQuantizeEvents( ref->isPressed() );
694
695        if (ref->isPressed() ) {
696                ( HydrogenApp::getInstance() )->setStatusBarMessage( trUtf8( "Quantize incoming keyboard/midi events = On" ), 2000 );
697        }
698        else {
699                ( HydrogenApp::getInstance() )->setStatusBarMessage( trUtf8( "Quantize incoming keyboard/midi events = Off" ), 2000 );
700        }
701}
702
703
704
705
706void PatternEditorPanel::stateChangedEvent(int state)
707{
708        if ( state == STATE_READY) {
709                m_bEnablePatternResize = true;
710        }
711        else {
712                m_bEnablePatternResize = false;
713        }
714}
715
716
717
718void PatternEditorPanel::resizeEvent( QResizeEvent *ev )
719{
720        UNUSED( ev );
721        QScrollArea *pScrollArea = m_pEditorScrollView;
722
723/*
724        if ( m_pPianoRollScrollView->isVisible() ) {
725                pScrollArea = m_pPianoRollScrollView;
726        }
727        else {
728                pScrollArea = m_pEditorScrollView;
729        }
730*/
731
732        m_pPatternEditorHScrollBar->setMinimum( pScrollArea->horizontalScrollBar()->minimum() );
733        m_pPatternEditorHScrollBar->setMaximum( pScrollArea->horizontalScrollBar()->maximum() );
734        m_pPatternEditorHScrollBar->setSingleStep( pScrollArea->horizontalScrollBar()->singleStep() );
735        m_pPatternEditorHScrollBar->setPageStep( pScrollArea->horizontalScrollBar()->pageStep() );
736
737        m_pPatternEditorVScrollBar->setMinimum( pScrollArea->verticalScrollBar()->minimum() );
738        m_pPatternEditorVScrollBar->setMaximum( pScrollArea->verticalScrollBar()->maximum() );
739        m_pPatternEditorVScrollBar->setSingleStep( pScrollArea->verticalScrollBar()->singleStep() );
740        m_pPatternEditorVScrollBar->setPageStep( pScrollArea->verticalScrollBar()->pageStep() );
741}
742
743
744
745
746void PatternEditorPanel::showEvent ( QShowEvent *ev )
747{
748        UNUSED( ev );
749//      m_pPatternEditorVScrollBar->setValue( m_pPatternEditorVScrollBar->maximum() );
750}
751
752
753/// richiamato dall'uso dello scroll del mouse
754void PatternEditorPanel::contentsMoving(int dummy)
755{
756        UNUSED( dummy );
757        //INFOLOG( "contentsMoving" );
758        syncToExternalHorizontalScrollbar(0);
759}
760
761
762
763void PatternEditorPanel::selectedInstrumentChangedEvent()
764{
765  //m_pNoteVelocityEditor->updateEditor();
766  //m_pNotePanEditor->updateEditor();
767  //m_pNoteLeadLagEditor->updateEditor();
768
769        resizeEvent(NULL);      // force a scrollbar update
770}
771
772
773
774void PatternEditorPanel::showDrumEditorBtnClick(Button *ref)
775{
776        UNUSED( ref );
777        __show_drum_btn->setPressed( true );
778        __show_piano_btn->setPressed( false );
779
780
781//      m_pPianoRollScrollView->hide();
782        m_pEditorScrollView->show();
783        m_pInstrListScrollView->show();
784
785        m_pDrumPatternEditor->selectedInstrumentChangedEvent(); // force an update
786
787        // force a re-sync of extern scrollbars
788        resizeEvent( NULL );
789}
790
791
792
793void PatternEditorPanel::showPianoEditorBtnClick(Button *ref)
794{
795        UNUSED( ref );
796        __show_piano_btn->setPressed( true );
797        __show_drum_btn->setPressed( false );
798
799
800//      m_pPianoRollScrollView->show();
801        m_pEditorScrollView->hide();
802        m_pInstrListScrollView->hide();
803
804//      m_pPianoRollEditor->selectedInstrumentChangedEvent(); // force an update
805
806        // force a re-sync of extern scrollbars
807        resizeEvent( NULL );
808}
809
810
811
812
813void PatternEditorPanel::zoomInBtnClicked(Button *ref)
814{
815        UNUSED( ref );
816        m_pPatternEditorRuler->zoomIn();
817        m_pDrumPatternEditor->zoom_in();
818        m_pNoteVelocityEditor->zoomIn();
819        m_pNoteLeadLagEditor->zoomIn();
820        m_pNoteNoteKeyEditor->zoomIn();
821        m_pNotePanEditor->zoomIn();
822
823        resizeEvent( NULL );
824}
825
826
827
828void PatternEditorPanel::zoomOutBtnClicked(Button *ref)
829{
830        UNUSED( ref );
831        m_pPatternEditorRuler->zoomOut();
832        m_pDrumPatternEditor->zoom_out();
833        m_pNoteVelocityEditor->zoomOut();
834        m_pNoteLeadLagEditor->zoomOut();
835        m_pNoteNoteKeyEditor->zoomOut();
836        m_pNotePanEditor->zoomOut();
837
838        resizeEvent( NULL );
839}
840
841
842
843void PatternEditorPanel::patternSizeChanged( QString str )
844{
845        INFOLOG( "pattern size changed" );
846
847        uint nEighth = MAX_NOTES / 8;
848        int nSelected = str.toInt();
849
850        if ( m_pPattern->get_lenght() == nEighth * nSelected ) {
851                // non e' necessario aggiornare
852                return;
853        }
854
855
856        if ( !m_pPattern ) {
857                return;
858        }
859
860        if ( !m_bEnablePatternResize ) {
861                __pattern_size_combo->set_text(QString::number(m_pPattern->get_lenght() / nEighth ),false);
862                QMessageBox::information( this, "Hydrogen", trUtf8( "Is not possible to change the pattern size when playing." ) );
863                return;
864        }
865
866
867        if ( nSelected > 0 && nSelected <= 32 ) {
868                m_pPattern->set_lenght( nEighth * nSelected );
869                //m_pPatternSizeLCD->setText( QString( "%1" ).arg( nSelected ) );
870        }
871        else {
872                ERRORLOG( "[patternSizeChanged] Unhandled case " + to_string( nSelected ) );
873        }
874
875        m_pPatternEditorRuler->updateEditor( true );    // redraw all
876        m_pNoteVelocityEditor->updateEditor();
877        m_pNotePanEditor->updateEditor();
878        m_pNoteLeadLagEditor->updateEditor();
879        m_pNoteNoteKeyEditor->updateEditor();
880
881        resizeEvent( NULL );
882
883        EventQueue::get_instance()->push_event( EVENT_SELECTED_PATTERN_CHANGED, -1 );
884}
885
886
887
888void PatternEditorPanel::moveUpBtnClicked(Button *)
889{
890        Hydrogen *engine = Hydrogen::get_instance();
891        int nSelectedInstrument = engine->getSelectedInstrumentNumber();
892
893        AudioEngine::get_instance()->lock( "PatternEditorPanel::moveUpBtnClicked" );
894
895        Song *pSong = engine->getSong();
896        InstrumentList *pInstrumentList = pSong->get_instrument_list();
897
898        if ( ( nSelectedInstrument - 1 ) >= 0 ) {
899                Instrument *pTemp = pInstrumentList->get( nSelectedInstrument - 1 );
900                pInstrumentList->replace( pInstrumentList->get( nSelectedInstrument ), nSelectedInstrument - 1 );
901                pInstrumentList->replace( pTemp, nSelectedInstrument );
902
903/*
904                // devo spostare tutte le note...
905                PatternList *pPatternList = pSong->getPatternList();
906                for ( int nPattern = 0; nPattern < pPatternList->getSize(); nPattern++ ) {
907                        Pattern *pPattern = pPatternList->get( nPattern );
908                        Sequence *pSeq1 = pPattern->m_pSequenceList->get( nSelectedInstrument );
909                        Sequence *pSeq2 = pPattern->m_pSequenceList->get( nSelectedInstrument - 1 );
910
911                        // swap notelist..
912                        map <int, Note*> noteList = pSeq1->m_noteList;
913                        pSeq1->m_noteList = pSeq2->m_noteList;
914                        pSeq2->m_noteList = noteList;
915                }
916*/
917                AudioEngine::get_instance()->unlock();
918                engine->setSelectedInstrumentNumber( nSelectedInstrument - 1 );
919
920                pSong->__is_modified = true;
921        }
922        else {
923                AudioEngine::get_instance()->unlock();
924        }
925}
926
927
928
929void PatternEditorPanel::moveDownBtnClicked(Button *)
930{
931        Hydrogen *engine = Hydrogen::get_instance();
932        int nSelectedInstrument = engine->getSelectedInstrumentNumber();
933
934        AudioEngine::get_instance()->lock( "PatternEditorPanel::moveDownBtnClicked" );
935
936        Song *pSong = engine->getSong();
937        InstrumentList *pInstrumentList = pSong->get_instrument_list();
938
939        if ( ( nSelectedInstrument + 1 ) < (int)pInstrumentList->get_size() ) {
940                Instrument *pTemp = pInstrumentList->get( nSelectedInstrument + 1 );
941                pInstrumentList->replace( pInstrumentList->get( nSelectedInstrument ), nSelectedInstrument + 1 );
942                pInstrumentList->replace( pTemp, nSelectedInstrument );
943
944/*
945                // devo spostare tutte le note...
946                PatternList *pPatternList = pSong->getPatternList();
947                for ( int nPattern = 0; nPattern < pPatternList->getSize(); nPattern++ ) {
948                        Pattern *pPattern = pPatternList->get( nPattern );
949                        Sequence *pSeq1 = pPattern->m_pSequenceList->get( nSelectedInstrument );
950                        Sequence *pSeq2 = pPattern->m_pSequenceList->get( nSelectedInstrument + 1 );
951
952                        // swap notelist..
953                        map <int, Note*> noteList = pSeq1->m_noteList;
954                        pSeq1->m_noteList = pSeq2->m_noteList;
955                        pSeq2->m_noteList = noteList;
956                }
957*/
958                AudioEngine::get_instance()->unlock();
959                engine->setSelectedInstrumentNumber( nSelectedInstrument + 1 );
960
961                pSong->__is_modified = true;
962        }
963        else {
964                AudioEngine::get_instance()->unlock();
965        }
966
967}
968
969
970
971
972void PatternEditorPanel::dragEnterEvent(QDragEnterEvent *event)
973{
974        m_pInstrumentList->dragEnterEvent( event );
975}
976
977
978
979void PatternEditorPanel::dropEvent(QDropEvent *event)
980{
981        m_pInstrumentList->dropEvent( event );
982}
983
984
985
986void PatternEditorPanel::propertiesComboChanged( QString text )
987{
988        if ( text == trUtf8( "Velocity" ) ) {
989                m_pNotePanScrollView->hide();
990                m_pNoteLeadLagScrollView->hide();
991                m_pNoteNoteKeyScrollView->hide();
992                m_pNoteVelocityScrollView->show();
993
994                m_pNoteVelocityEditor->updateEditor();
995        }
996        else if ( text == trUtf8( "Pan" ) ) {
997                m_pNoteVelocityScrollView->hide();
998                m_pNoteLeadLagScrollView->hide();
999                m_pNoteNoteKeyScrollView->hide();
1000                m_pNotePanScrollView->show();
1001
1002                m_pNotePanEditor->updateEditor();
1003        }
1004        else if ( text == trUtf8( "Lead and Lag" ) ) {
1005                m_pNoteVelocityScrollView->hide();
1006                m_pNotePanScrollView->hide();
1007                m_pNoteNoteKeyScrollView->hide();
1008                m_pNoteLeadLagScrollView->show();
1009 
1010                m_pNoteLeadLagEditor->updateEditor();
1011        }
1012        else if ( text == trUtf8( "NoteKey" ) ) {
1013                m_pNoteVelocityScrollView->hide();
1014                m_pNotePanScrollView->hide();
1015                m_pNoteLeadLagScrollView->hide();
1016                m_pNoteNoteKeyScrollView->show();
1017 
1018                m_pNoteNoteKeyEditor->updateEditor();
1019        }
1020        else if ( text == trUtf8( "Cutoff" ) ) {
1021        }
1022        else if ( text == trUtf8( "Resonance" ) ) {
1023        }
1024        else {
1025                ERRORLOG( "Unknown text: " + text );
1026        }
1027}
1028
1029
1030void PatternEditorPanel::playselectedinstrument( QString text )
1031{
1032        if ( text == "keyb: play drumset" ){
1033                Preferences::getInstance()->__playselectedinstrument = false;
1034        }else
1035        {
1036                Preferences::getInstance()->__playselectedinstrument = true;
1037        }
1038}
Note: See TracBrowser for help on using the browser.