3
3
// Linux Music Editor
4
4
// $Id: arranger.cpp,v 1.33.2.21 2009/11/17 22:08:22 terminator356 Exp $
5
5
// (C) Copyright 1999-2004 Werner Schweer (ws@seh.de)
7
// This program is free software; you can redistribute it and/or
8
// modify it under the terms of the GNU General Public License
9
// as published by the Free Software Foundation; version 2 of
10
// the License, or (at your option) any later version.
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.
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
6
21
//=========================================================
87
106
header->setWhatsThis(COL_OCHANNEL, tr("Midi/drum track: Output channel number.\nAudio track: Channels.\nMid/right-click to change."));
88
107
header->setWhatsThis(COL_OPORT, tr("Midi/drum track: Output port.\nSynth track: Assigned midi port.\nLeft-click to change.\nRight-click to show GUI."));
89
108
header->setWhatsThis(COL_TIMELOCK, tr("Time lock"));
109
header->setToolTip(COL_CLEF, tr("Notation clef. Select this tracks notation clef."));
92
112
//---------------------------------------------------------
131
152
toolbar->addWidget(cursorPos);
133
154
const char* rastval[] = {
134
QT_TRANSLATE_NOOP("@default", "Off"), QT_TRANSLATE_NOOP("@default", "Bar"), "1/2", "1/4", "1/8", "1/16"
155
QT_TRANSLATE_NOOP("MusEGui::Arranger", "Off"), QT_TRANSLATE_NOOP("MusEGui::Arranger", "Bar"), "1/2", "1/4", "1/8", "1/16"
136
157
label = new QLabel(tr("Snap"));
137
158
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
142
163
raster->insertItem(i, tr(rastval[i]));
143
164
raster->setCurrentIndex(1);
144
165
// Set the audio record part snapping. Set to 0 (bar), the same as this combo box intial raster.
145
song->setArrangerRaster(0);
166
MusEGlobal::song->setArrangerRaster(0);
146
167
toolbar->addWidget(raster);
147
168
connect(raster, SIGNAL(activated(int)), SLOT(_setRaster(int)));
148
169
///raster->setFocusPolicy(Qt::NoFocus);
183
204
toolbar->addWidget(label);
185
206
globalPitchSpinBox = new SpinBox(-127, 127, 1);
186
globalPitchSpinBox->setValue(song->globalPitchShift());
207
globalPitchSpinBox->setValue(MusEGlobal::song->globalPitchShift());
187
208
globalPitchSpinBox->setToolTip(tr("midi pitch"));
188
209
globalPitchSpinBox->setWhatsThis(tr("global midi pitch shift"));
189
210
toolbar->addWidget(globalPitchSpinBox);
197
218
globalTempoSpinBox = new SpinBox(50, 200, 1, toolbar);
198
219
globalTempoSpinBox->setSuffix(QString("%"));
199
globalTempoSpinBox->setValue(tempomap.globalTempo());
220
globalTempoSpinBox->setValue(MusEGlobal::tempomap.globalTempo());
200
221
globalTempoSpinBox->setToolTip(tr("midi tempo"));
201
222
globalTempoSpinBox->setWhatsThis(tr("midi tempo"));
202
223
toolbar->addWidget(globalTempoSpinBox);
220
241
QVBoxLayout* box = new QVBoxLayout(this);
221
242
box->setContentsMargins(0, 0, 0, 0);
222
243
box->setSpacing(0);
223
box->addWidget(hLine(this), Qt::AlignTop);
224
//QFrame* hline = hLine(this);
244
box->addWidget(MusECore::hLine(this), Qt::AlignTop);
245
//QFrame* hline = MusECore::hLine(this);
225
246
//hline->setLineWidth(0);
226
247
//box->addWidget(hline, Qt::AlignTop);
290
311
header->setColumnLabel(tr("Ch"), COL_OCHANNEL, 30);
291
312
header->setColumnLabel(tr("T"), COL_TIMELOCK, fm1.width('T')+fw);
292
313
header->setColumnLabel(tr("Automation"), COL_AUTOMATION, 75);
314
header->setColumnLabel(tr("Clef"), COL_CLEF, 75);
293
315
header->setResizeMode(COL_RECORD, QHeaderView::Fixed);
294
316
header->setResizeMode(COL_MUTE, QHeaderView::Fixed);
295
317
header->setResizeMode(COL_SOLO, QHeaderView::Fixed);
309
332
genTrackInfo(tracklist);
311
334
///connect(list, SIGNAL(selectionChanged()), SLOT(trackSelectionChanged()));
312
connect(list, SIGNAL(selectionChanged(Track*)), SLOT(trackSelectionChanged()));
313
connect(list, SIGNAL(selectionChanged(Track*)), midiTrackInfo, SLOT(setTrack(Track*)));
335
connect(list, SIGNAL(selectionChanged(MusECore::Track*)), SLOT(trackSelectionChanged()));
336
connect(list, SIGNAL(selectionChanged(MusECore::Track*)), midiTrackInfo, SLOT(setTrack(MusECore::Track*)));
314
337
connect(header, SIGNAL(sectionResized(int,int,int)), list, SLOT(redraw()));
315
338
connect(header, SIGNAL(sectionMoved(int,int,int)), list, SLOT(redraw()));
316
339
connect(header, SIGNAL(sectionMoved(int,int,int)), this, SLOT(headerMoved()));
342
365
//---------------------------------------------------
344
367
int offset = AL::sigmap.ticksMeasure(0);
345
hscroll = new ScrollScale(-1000, -10, xscale, song->len(), Qt::Horizontal, editor, -offset);
368
hscroll = new ScrollScale(-1000, -10, xscale, MusEGlobal::song->len(), Qt::Horizontal, editor, -offset);
346
369
hscroll->setFocusPolicy(Qt::NoFocus);
347
370
ib->setFixedHeight(hscroll->sizeHint().height());
373
396
time = new MTScale(&_raster, editor, xscale);
374
397
time->setOrigin(-offset, 0);
375
398
canvas = new PartCanvas(&_raster, editor, xscale, yscale);
376
canvas->setBg(config.partCanvasBg);
399
canvas->setBg(MusEGlobal::config.partCanvasBg);
377
400
canvas->setCanvasTools(arrangerTools);
378
401
canvas->setOrigin(-offset, 0);
379
402
canvas->setFocus();
380
//parent->setFocusProxy(canvas); // Tim.
403
setFocusProxy(canvas); // once removed by Tim (r735), added by flo again
382
405
connect(canvas, SIGNAL(setUsedTool(int)), this, SIGNAL(setUsedTool(int)));
383
connect(canvas, SIGNAL(trackChanged(Track*)), list, SLOT(selectTrack(Track*)));
406
connect(canvas, SIGNAL(trackChanged(MusECore::Track*)), list, SLOT(selectTrack(MusECore::Track*)));
384
407
connect(list, SIGNAL(keyPressExt(QKeyEvent*)), canvas, SLOT(redirKeypress(QKeyEvent*)));
385
408
connect(canvas, SIGNAL(selectTrackAbove()), list, SLOT(selectTrackAbove()));
386
409
connect(canvas, SIGNAL(selectTrackBelow()), list, SLOT(selectTrackBelow()));
410
connect(canvas, SIGNAL(horizontalZoomIn()), SLOT(horizontalZoomIn()));
411
connect(canvas, SIGNAL(horizontalZoomOut()), SLOT(horizontalZoomOut()));
388
413
connect(this, SIGNAL(redirectWheelEvent(QWheelEvent*)), canvas, SLOT(redirectedWheelEvent(QWheelEvent*)));
389
414
connect(list, SIGNAL(redirectWheelEvent(QWheelEvent*)), canvas, SLOT(redirectedWheelEvent(QWheelEvent*)));
391
416
//egrid->addMultiCellWidget(time, 0, 0, 0, 1);
392
//egrid->addMultiCellWidget(hLine(editor), 1, 1, 0, 1);
417
//egrid->addMultiCellWidget(MusECore::hLine(editor), 1, 1, 0, 1);
393
418
egrid->addWidget(time, 0, 0, 1, 2);
394
egrid->addWidget(hLine(editor), 1, 0, 1, 2);
419
egrid->addWidget(MusECore::hLine(editor), 1, 0, 1, 2);
396
421
egrid->addWidget(canvas, 2, 0);
397
422
egrid->addWidget(vscroll, 2, 1);
410
435
connect(time, SIGNAL(timeChanged(unsigned)), SLOT(setTime(unsigned)));
412
437
connect(canvas, SIGNAL(tracklistChanged()), list, SLOT(tracklistChanged()));
413
connect(canvas, SIGNAL(dclickPart(Track*)), SIGNAL(editPart(Track*)));
414
connect(canvas, SIGNAL(startEditor(PartList*,int)), SIGNAL(startEditor(PartList*, int)));
438
connect(canvas, SIGNAL(dclickPart(MusECore::Track*)), SIGNAL(editPart(MusECore::Track*)));
439
connect(canvas, SIGNAL(startEditor(MusECore::PartList*,int)), SIGNAL(startEditor(MusECore::PartList*, int)));
416
connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
417
//connect(song, SIGNAL(mTypeChanged(MType)), SLOT(setMode((int)MType))); // p4.0.7 Tim.
441
connect(MusEGlobal::song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
442
//connect(MusEGlobal::song, SIGNAL(mTypeChanged(MType)), SLOT(setMode((int)MType))); // p4.0.7 Tim.
418
443
connect(canvas, SIGNAL(followEvent(int)), hscroll, SLOT(setOffset(int)));
419
444
connect(canvas, SIGNAL(selectionChanged()), SIGNAL(selectionChanged()));
420
445
connect(canvas, SIGNAL(dropSongFile(const QString&)), SIGNAL(dropSongFile(const QString&)));
421
446
connect(canvas, SIGNAL(dropMidiFile(const QString&)), SIGNAL(dropMidiFile(const QString&)));
423
448
connect(canvas, SIGNAL(toolChanged(int)), SIGNAL(toolChanged(int)));
424
// connect(song, SIGNAL(posChanged(int, unsigned, bool)), SLOT(seek()));
449
connect(MusEGlobal::song, SIGNAL(controllerChanged(MusECore::Track*)), SLOT(controllerChanged(MusECore::Track*)));
450
// connect(MusEGlobal::song, SIGNAL(posChanged(int, unsigned, bool)), SLOT(seek()));
426
452
// Removed p3.3.43
427
453
// Song::addMarker() already emits a 'markerChanged'.
512
538
//printf("Arranger::configChanged\n");
514
if (config.canvasBgPixmap.isEmpty()) {
515
canvas->setBg(config.partCanvasBg);
540
if (MusEGlobal::config.canvasBgPixmap.isEmpty()) {
541
canvas->setBg(MusEGlobal::config.partCanvasBg);
516
542
canvas->setBg(QPixmap());
517
543
//printf("Arranger::configChanged - no bitmap!\n");
521
//printf("Arranger::configChanged - bitmap %s!\n", config.canvasBgPixmap.ascii());
522
canvas->setBg(QPixmap(config.canvasBgPixmap));
547
//printf("Arranger::configChanged - bitmap %s!\n", MusEGlobal::config.canvasBgPixmap.ascii());
548
canvas->setBg(QPixmap(MusEGlobal::config.canvasBgPixmap));
524
///midiTrackInfo->setFont(config.fonts[2]);
550
///midiTrackInfo->setFont(MusEGlobal::config.fonts[2]);
525
551
//updateTrackInfo(type);
543
569
// Is it simply a midi controller value adjustment? Forget it.
544
570
if(type != SC_MIDI_CONTROLLER)
546
unsigned endTick = song->len();
547
int offset = AL::sigmap.ticksMeasure(endTick);
548
hscroll->setRange(-offset, endTick + offset); //DEBUG
549
canvas->setOrigin(-offset, 0);
550
time->setOrigin(-offset, 0);
554
AL::sigmap.tickValues(endTick, &bar, &beat, &tick);
557
lenEntry->blockSignals(true);
558
lenEntry->setValue(bar);
559
lenEntry->blockSignals(false);
561
if(type & SC_SONG_TYPE) // p4.0.7 Tim.
562
setMode(song->mtype());
572
// TEST p4.0.36 Try these, may need more/less.
573
if(type & ( SC_TRACK_INSERTED | SC_TRACK_REMOVED | SC_TRACK_MODIFIED |
574
SC_PART_INSERTED | SC_PART_REMOVED | SC_PART_MODIFIED))
576
unsigned endTick = MusEGlobal::song->len();
577
int offset = AL::sigmap.ticksMeasure(endTick);
578
hscroll->setRange(-offset, endTick + offset); //DEBUG
579
canvas->setOrigin(-offset, 0);
580
time->setOrigin(-offset, 0);
584
AL::sigmap.tickValues(endTick, &bar, &beat, &tick);
587
lenEntry->blockSignals(true);
588
lenEntry->setValue(bar);
589
lenEntry->blockSignals(false);
592
if(type & SC_SONG_TYPE)
593
setMode(MusEGlobal::song->mtype());
564
trackSelectionChanged();
565
canvas->partsChanged();
566
typeBox->setCurrentIndex(int(song->mtype()));
595
if(type & SC_SELECTION) // TEST p4.0.36 Try this alone, may need more.
596
trackSelectionChanged();
598
// Keep this light, partsChanged is a heavy move! TEST p4.0.36 Try these, may need more.
599
if(type & (SC_TRACK_INSERTED | SC_TRACK_REMOVED | SC_TRACK_MODIFIED |
600
SC_PART_INSERTED | SC_PART_REMOVED | SC_PART_MODIFIED |
601
SC_SIG | SC_TEMPO)) // Maybe sig. Requires tempo.
602
canvas->partsChanged();
604
//typeBox->setCurrentIndex(int(MusEGlobal::song->mtype())); // REMOVE Tim. Redundant.
567
606
if (type & SC_SIG)
569
608
if (type & SC_TEMPO)
570
setGlobalTempo(tempomap.globalTempo());
609
setGlobalTempo(MusEGlobal::tempomap.globalTempo());
572
611
if(type & SC_TRACK_REMOVED)
659
706
//---------------------------------------------------------
661
void Arranger::readStatus(Xml& xml)
708
void Arranger::readStatus(MusECore::Xml& xml)
664
Xml::Token token(xml.parse());
711
MusECore::Xml::Token token(xml.parse());
665
712
const QString& tag(xml.s1());
714
case MusECore::Xml::Error:
715
case MusECore::Xml::End:
717
case MusECore::Xml::TagStart:
671
718
if (tag == "info")
672
719
showTrackinfoFlag = xml.parseInt();
673
720
else if (tag == split->objectName())
739
786
case CMD_COPY_PART:
740
787
ncmd = PartCanvas::CMD_COPY_PART;
789
case CMD_COPY_PART_IN_RANGE:
790
ncmd = PartCanvas::CMD_COPY_PART_IN_RANGE;
742
792
case CMD_PASTE_PART:
743
793
ncmd = PartCanvas::CMD_PASTE_PART;
745
795
case CMD_PASTE_CLONE_PART:
746
796
ncmd = PartCanvas::CMD_PASTE_CLONE_PART;
748
case CMD_PASTE_PART_TO_TRACK:
749
ncmd = PartCanvas::CMD_PASTE_PART_TO_TRACK;
751
case CMD_PASTE_CLONE_PART_TO_TRACK:
752
ncmd = PartCanvas::CMD_PASTE_CLONE_PART_TO_TRACK;
754
case CMD_INSERT_PART:
755
ncmd = PartCanvas::CMD_INSERT_PART;
798
case CMD_PASTE_DIALOG:
799
ncmd = PartCanvas::CMD_PASTE_DIALOG;
801
case CMD_PASTE_CLONE_DIALOG:
802
ncmd = PartCanvas::CMD_PASTE_CLONE_DIALOG;
757
804
case CMD_INSERT_EMPTYMEAS:
758
805
ncmd = PartCanvas::CMD_INSERT_EMPTYMEAS;
1034
1081
if (w == 0 || selected != w->getTrack()) {
1037
w = new AudioStrip(trackInfo, (AudioTrack*)selected);
1084
w = new AudioStrip(trackInfo, (MusECore::AudioTrack*)selected);
1038
1085
//w->setFocusPolicy(Qt::TabFocus); // p4.0.9
1039
connect(song, SIGNAL(songChanged(int)), w, SLOT(songChanged(int)));
1040
connect(muse, SIGNAL(configChanged()), w, SLOT(configChanged()));
1086
connect(MusEGlobal::song, SIGNAL(songChanged(int)), w, SLOT(songChanged(int)));
1087
connect(MusEGlobal::muse, SIGNAL(configChanged()), w, SLOT(configChanged()));
1041
1088
w->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
1042
1089
trackInfo->addWidget(w, 2);
1078
1125
key+= Qt::CTRL;
1080
1127
if (key == shortcuts[SHRT_ZOOM_IN].key) {
1081
int mag = hscroll->mag();
1082
int zoomlvl = ScrollScale::getQuickZoomLevel(mag);
1086
int newmag = ScrollScale::convertQuickZoomLevelToMag(zoomlvl);
1088
hscroll->setMag(newmag);
1091
1131
else if (key == shortcuts[SHRT_ZOOM_OUT].key) {
1092
int mag = hscroll->mag();
1093
int zoomlvl = ScrollScale::getQuickZoomLevel(mag);
1097
int newmag = ScrollScale::convertQuickZoomLevelToMag(zoomlvl);
1099
hscroll->setMag(newmag);
1132
horizontalZoomOut();
1103
1136
QWidget::keyPressEvent(event);
1139
void Arranger::horizontalZoomIn()
1141
int mag = hscroll->mag();
1142
int zoomlvl = ScrollScale::getQuickZoomLevel(mag);
1146
int newmag = ScrollScale::convertQuickZoomLevelToMag(zoomlvl);
1148
hscroll->setMag(newmag);
1152
void Arranger::horizontalZoomOut()
1154
int mag = hscroll->mag();
1155
int zoomlvl = ScrollScale::getQuickZoomLevel(mag);
1159
int newmag = ScrollScale::convertQuickZoomLevelToMag(zoomlvl);
1161
hscroll->setMag(newmag);
1165
} // namespace MusEGui