1
//=========================================================
4
// $Id: songfile.cpp,v 1.1 2002/01/30 14:10:07 muse Exp $
6
// (C) Copyright 1999/2000 Werner Schweer (ws@seh.de)
7
//=========================================================
10
#include <qmessagebox.h>
16
#include "transport.h"
19
#include "pianoroll.h"
24
#include "marker/marker.h"
26
#include "sf/sndfile.h"
27
#include "audiothread.h"
28
#include "mitplugin.h"
31
extern void writeMidiController(int, Xml&);
32
extern void readMidiController(Xml&);
34
//---------------------------------------------------------
36
//---------------------------------------------------------
38
void NKey::write(int level, Xml& xml) const
40
xml.intTag(level, "key", val);
43
//---------------------------------------------------------
45
//---------------------------------------------------------
47
void NKey::read(Xml& xml)
50
Xml::Token token = xml.parse();
56
val = xml.s1().toInt();
59
if (xml.s1() == "key")
67
//---------------------------------------------------------
69
//---------------------------------------------------------
71
void Scale::write(int level, Xml& xml) const
73
xml.intTag(level, "scale", val);
76
//---------------------------------------------------------
78
//---------------------------------------------------------
80
void Scale::read(Xml& xml)
83
Xml::Token token = xml.parse();
89
val = xml.s1().toInt();
92
if (xml.s1() == "scale")
100
//---------------------------------------------------------
102
//---------------------------------------------------------
104
void Part::write(int level, Xml& xml, int offset=0) const
106
xml.tag(level++, "part");
107
xml.strTag(level, "name", _name);
109
PosLen poslen(*this);
110
poslen.setPosTick(posTick() + offset);
111
poslen.write(level, xml, "poslen");
112
xml.intTag(level, "selected", _selected);
113
xml.intTag(level, "color", _colorIndex);
114
xml.intTag(level, "mute", _mute);
115
const EventList* el = cevents();
116
for (ciEvent e = el->begin(); e != el->end(); ++e)
117
e->second->write(level, xml, offset);
118
xml.etag(level, "part");
121
//---------------------------------------------------------
123
//---------------------------------------------------------
125
void Part::read(Xml& xml, int offset=0)
128
Xml::Token token = xml.parse();
129
const QString& tag = xml.s1();
136
_name = xml.parse1();
137
else if (tag == "poslen")
138
PosLen::read(xml, "poslen");
139
else if (tag == "pos") {
141
pos.read(xml, "pos"); // obsolete
142
setPosTick(pos.posTick());
144
else if (tag == "len") {
146
len.read(xml, "len"); // obsolete
147
setLenTick(len.posTick());
149
else if (tag == "selected")
150
_selected = xml.parseInt();
151
else if (tag == "color")
152
_colorIndex = xml.parseInt();
153
else if (tag == "mute")
154
_mute = xml.parseInt();
155
else if (tag == "event") {
156
Event* e = newEvent();
157
e->setPort(track()->outPort());
158
e->setChannel(track()->outChannel());
175
//---------------------------------------------------------
177
//---------------------------------------------------------
179
void Track::write(int level, Xml& xml) const
181
xml.tag(level++, "track type=\"%d\"", _type);
182
xml.intTag(level, "channel", outChannel());
183
xml.intTag(level, "device", outPort());
184
xml.intTag(level, "inportMap", inPortMask());
185
xml.intTag(level, "inchannelMap", inChannelMask());
186
xml.strTag(level, "name", _name);
187
if (!_comment.isEmpty())
188
xml.strTag(level, "comment", _comment);
189
xml.intTag(level, "locked", _locked);
190
xml.intTag(level, "selected", _selected);
191
xml.intTag(level, "record", _recordFlag);
192
const PartList* pl = cparts();
193
for (ciPart p = pl->begin(); p != pl->end(); ++p)
194
p->second->write(level, xml);
195
xml.etag(level, "track");
198
//---------------------------------------------------------
200
//---------------------------------------------------------
202
void Track::read(Xml& xml)
205
Xml::Token token = xml.parse();
206
const QString& tag = xml.s1();
213
_name = xml.parse1();
214
else if (tag == "comment")
215
_comment = xml.parse1();
216
else if (tag == "selected")
217
_selected = xml.parseInt();
218
else if (tag == "locked")
219
_locked = xml.parseInt();
220
else if (tag == "part") {
225
//printf("part %p:%p %d len %d %d\n",
226
// p, lp, p->posTick(), p->lenTick(), p->lenSample());
229
else if (tag == "wavepart") {
230
WavePart* p = new WavePart((WaveTrack*)this);
234
else if (tag == "channel")
235
setOutChannel(xml.parseInt());
236
else if (tag == "device")
237
setOutPort(xml.parseInt());
238
else if (tag == "inport") // old
239
setInPortMask(1 << xml.parseInt());
240
else if (tag == "inchannel") // old
241
setInChannelMask(1 << xml.parseInt());
242
else if (tag == "inportMap")
243
setInPortMask(xml.parseInt());
244
else if (tag == "inchannelMap")
245
setInChannelMask(xml.parseInt());
246
else if (tag == "record")
247
setRecordFlag(xml.parseInt());
249
xml.unknown("Track");
253
_type = TrackType(xml.s2().toInt());
264
//---------------------------------------------------------
266
//---------------------------------------------------------
268
void MidiTrack::write(int level, Xml& xml) const
270
xml.tag(level++, "miditrack");
271
Track::write(level, xml);
273
xml.tag(level++, "staff sys=0");
274
key.write(level, xml);
275
scale.write(level, xml);
276
xml.tag(level--, "/staff");
278
xml.tag(level++, "staff sys=1");
279
keyL.write(level, xml);
280
scaleL.write(level, xml);
281
xml.tag(level--, "/staff");
283
xml.intTag(level, "noteQuant", noteQuant);
284
xml.intTag(level, "restQuant", restQuant);
285
xml.intTag(level, "staffmode", int(mode));
286
xml.intTag(level, "splitpoint", splitpoint);
287
xml.intTag(level, "transposition", transposition);
288
xml.intTag(level, "velocity", velocity);
289
xml.intTag(level, "delay", delay);
290
xml.intTag(level, "len", len);
291
xml.intTag(level, "compression", compression);
292
xml.intTag(level, "mute", mute());
293
xml.intTag(level, "solomute", soloMute());
294
xml.intTag(level, "midiThru", midiThruFlag());
296
xml.tag(level, "/miditrack");
299
//---------------------------------------------------------
301
//---------------------------------------------------------
303
void MidiTrack::readStaff(Xml& xml)
307
Xml::Token token = xml.parse();
308
const QString& tag = xml.s1();
320
else if (tag == "scale") {
327
xml.unknown("Staff");
331
staff = xml.s2().toInt();
334
if (tag == "staff") {
343
//---------------------------------------------------------
345
//---------------------------------------------------------
347
void MidiTrack::read(Xml& xml)
350
Xml::Token token = xml.parse();
351
const QString& tag = xml.s1();
359
else if (tag == "noteQuant")
360
noteQuant = xml.parseInt();
361
else if (tag == "restQuant")
362
restQuant = xml.parseInt();
363
else if (tag == "splitpoint")
364
splitpoint = xml.parseInt();
365
else if (tag == "staffmode")
366
mode = StaffMode(xml.parseInt());
367
else if (tag == "transposition")
368
transposition = xml.parseInt();
369
else if (tag == "velocity")
370
velocity = xml.parseInt();
371
else if (tag == "delay")
372
delay = xml.parseInt();
373
else if (tag == "len")
374
len = xml.parseInt();
375
else if (tag == "compression")
376
compression = xml.parseInt();
377
else if (tag == "staff")
379
else if (tag == "mute")
380
setMute(xml.parseInt());
381
else if (tag == "solomute")
382
setSolo(xml.parseInt());
383
else if (tag == "midiThru")
384
setMidiThruFlag(xml.parseInt());
386
xml.unknown("MidiTrack");
391
if (tag == "miditrack") {
400
void WaveTrack::write(int level, Xml& xml) const
402
xml.tag(level++, "wavetrack");
403
Track::write(level, xml);
404
AudioNode::writeConfiguration(level, xml);
406
xml.tag(level++, "recfile");
407
xml.strTag(level, "path", _recFile->path());
408
xml.intTag(level, "channels", _recFile->channels());
409
xml.intTag(level, "format", _recFile->format());
410
xml.intTag(level, "samplebits", _recFile->sampleBits());
411
xml.etag(level--, "recfile");
413
xml.etag(level, "wavetrack");
416
//---------------------------------------------------------
418
//---------------------------------------------------------
420
void WaveTrack::readRecfile(Xml& xml)
424
int format = SF_FORMAT_WAV | SF_FORMAT_PCM;
428
Xml::Token token = xml.parse();
429
if (token == Xml::Error || token == Xml::End)
431
const QString& tag = xml.s1();
436
else if (tag == "channels")
437
channels = xml.parseInt();
438
else if (tag == "format")
439
format = xml.parseInt();
440
else if (tag == "samplebits")
441
samplebits = xml.parseInt();
443
xml.unknown("recfile");
446
if (tag == "recfile") {
447
SndFile* sf = new SndFile(path);
448
sf->setFormat(format, channels, sampleRate, samplebits);
449
if (sf->openWrite()) {
450
printf("open wave file failed\n");
468
//---------------------------------------------------------
470
//---------------------------------------------------------
472
void WaveTrack::read(Xml& xml)
475
Xml::Token token = xml.parse();
476
const QString& tag = xml.s1();
484
else if (tag == "audionode") {
485
AudioNode::readConfiguration(xml);
487
else if (tag == "recfile")
490
xml.unknown("WaveTrack");
495
if (tag == "wavetrack") {
504
//---------------------------------------------------------
506
//---------------------------------------------------------
508
void Song::writeFont(int level, Xml& xml, const char* name,
509
const Font& font) const
511
xml.nput(level, "<%s family=\"%s\" size=\"%d\"",
512
name, font.family().latin1(), font.pointSize());
513
if (font.weight() != QFont::Normal)
514
xml.nput(" weight=\"%d\"", font.weight());
516
xml.nput(" italic=\"1\"");
520
//---------------------------------------------------------
522
//---------------------------------------------------------
524
void Song::write(int level, Xml& xml) const
526
xml.tag(level++, "song");
527
if (!_name.isEmpty())
528
xml.strTag(level, "name", _name);
529
if (!_komponist1.isEmpty())
530
xml.strTag(level, "komponist1", _komponist1);
531
if (!_komponist2.isEmpty())
532
xml.strTag(level, "komponist2", _komponist2);
534
writeFont(level, xml, "name_font", _nameFont);
535
writeFont(level, xml, "author_font", _komponistFont);
536
writeFont(level, xml, "pageno_font", _pageNoFont);
537
writeFont(level, xml, "measureno_font", _measureNoFont);
538
writeFont(level, xml, "trackname_font", _tracknameFont);
539
writeFont(level, xml, "lyrics_font", _lyricsFont);
541
xml.intTag(level, "show_page_no", _showPageNo);
542
xml.intTag(level, "show_measure_no", _showMeasureNo);
543
xml.doubleTag(level, "paper_width", paperWidth);
544
xml.doubleTag(level, "paper_height", paperHeight);
545
xml.doubleTag(level, "top_margin", topMargin);
546
xml.doubleTag(level, "bottom_margin", bottomMargin);
547
xml.doubleTag(level, "left_margin", leftMargin);
548
xml.doubleTag(level, "right_margin", rightMargin);
549
xml.intTag(level, "bars_page", barsPage);
550
xml.doubleTag(level, "print_scale", printScale);
552
xml.intTag(level, "show_track_name", _showTrackname);
553
xml.intTag(level, "master", _masterFlag);
554
xml.intTag(level, "loop", loopFlag);
555
xml.intTag(level, "punchin", punchinFlag);
556
xml.intTag(level, "punchout", punchoutFlag);
557
xml.intTag(level, "record", recordFlag);
558
xml.intTag(level, "solo", soloFlag);
559
xml.intTag(level, "type", _mtype);
560
xml.intTag(level, "recmode", _recMode);
561
xml.intTag(level, "cycle", _cycleMode);
562
xml.intTag(level, "click", _click);
563
xml.intTag(level, "quantize", _quantize);
564
xml.intTag(level, "len", _len);
565
xml.intTag(level, "follow", _follow);
567
if (!_copyright.isEmpty())
568
xml.strTag(level, "copyright", _copyright);
570
for (ciTrack i = _tracks.begin(); i != _tracks.end(); ++i)
571
(*i)->write(level, xml);
572
tempomap.write(level, xml);
573
sigmap.write(level, xml);
574
_markerList->write(level, xml);
576
xml.tag(level, "/song");
579
//---------------------------------------------------------
581
//---------------------------------------------------------
583
Font Song::readFont(Xml& xml, const char* name)
587
Xml::Token token = xml.parse();
593
xml.unknown("readFont");
596
if (xml.s1() == "family")
597
f.setFamily(xml.s2());
598
else if (xml.s1() == "size")
599
f.setPointSize(xml.s2().toInt());
600
else if (xml.s1() == "weight")
601
f.setWeight(xml.s2().toInt());
602
else if (xml.s1() == "italic")
603
f.setItalic(xml.s2().toInt());
606
if (xml.s1() == name)
615
//---------------------------------------------------------
617
//---------------------------------------------------------
619
void Song::read(Xml& xml)
624
const QString& tag = xml.s1();
625
// printf("song <%s>\n", tag.latin1());
632
_name = xml.parse1();
633
else if (tag == "name_font")
634
_nameFont = readFont(xml, "name_font");
635
else if (tag == "author_font")
636
_komponistFont = readFont(xml, "author_font");
637
else if (tag == "pageno_font")
638
_pageNoFont = readFont(xml, "pageno_font");
639
else if (tag == "measureno_font")
640
_measureNoFont = readFont(xml, "measureno_font");
641
else if (tag == "trackname_font")
642
_tracknameFont = readFont(xml, "trackname_font");
643
else if (tag == "lyrics_font")
644
_lyricsFont = readFont(xml, "lyrics_font");
645
else if (tag == "komponist1")
646
_komponist1 = xml.parse1();
647
else if (tag == "komponist2")
648
_komponist2 = xml.parse1();
649
else if (tag == "show_page_no")
650
_showPageNo = xml.parseInt();
651
else if (tag == "show_measure_no")
652
_showMeasureNo = xml.parseInt();
653
else if (tag == "show_track_name")
654
_showTrackname = xml.parseInt();
655
else if (tag == "paper_width")
656
paperWidth = xml.parseDouble();
657
else if (tag == "paper_height")
658
paperHeight = xml.parseDouble();
659
else if (tag == "top_margin")
660
topMargin = xml.parseDouble();
661
else if (tag == "bottom_margin")
662
bottomMargin = xml.parseDouble();
663
else if (tag == "left_margin")
664
leftMargin = xml.parseDouble();
665
else if (tag == "right_margin")
666
rightMargin = xml.parseDouble();
667
else if (tag == "bars_page")
668
barsPage = xml.parseInt();
669
else if (tag == "print_scale")
670
printScale = xml.parseDouble();
671
else if (tag == "master")
672
setMasterFlag(xml.parseInt());
673
else if (tag == "loop")
674
setLoop(xml.parseInt());
675
else if (tag == "punchin")
676
setPunchin(xml.parseInt());
677
else if (tag == "punchout")
678
setPunchout(xml.parseInt());
679
else if (tag == "record")
680
setRecord(xml.parseInt());
681
else if (tag == "solo")
682
soloFlag = xml.parseInt();
683
else if (tag == "type")
684
_mtype = MType(xml.parseInt());
685
else if (tag == "recmode")
686
_recMode = xml.parseInt();
687
else if (tag == "cycle")
688
_cycleMode = xml.parseInt();
689
else if (tag == "click")
690
setClick(xml.parseInt());
691
else if (tag == "quantize")
692
_quantize = xml.parseInt();
693
else if (tag == "len")
694
_len = xml.parseInt();
695
else if (tag == "follow")
696
_follow = FollowMode(xml.parseInt());
697
else if (tag == "copyright")
698
_copyright = xml.parse("copyright");
699
else if (tag == "tempolist") {
702
else if (tag == "siglist")
704
else if (tag == "miditrack") {
705
MidiTrack* track = new MidiTrack();
709
else if (tag == "wavetrack") {
710
WaveTrack* track = new WaveTrack();
714
// track is not yet connected:
715
AudioNode* route = track->route();
716
track->setRoute(0); // to avoid disconect errors
717
audioThread->msgAddRoute(track, route);
719
else if (tag == "marker")
737
//---------------------------------------------------------
739
//---------------------------------------------------------
741
Part* MusE::readPart(Xml& xml)
745
Xml::Token token = xml.parse();
746
const QString& tag = xml.s1();
753
int trackIdx, partIdx;
754
sscanf(tag.latin1(), "%d:%d", &trackIdx, &partIdx);
755
Track* track = song->tracks()->findIdx(trackIdx);
757
part = track->parts()->find(partIdx);
761
xml.unknown("readPart");
772
//---------------------------------------------------------
774
//---------------------------------------------------------
776
void MusE::readToplevels(Xml& xml)
778
PartList* pl = new PartList;
780
Xml::Token token = xml.parse();
781
const QString& tag = xml.s1();
788
Part* part = readPart(xml);
792
else if (tag == "pianoroll") {
794
toplevels.back().cobject()->readStatus(xml);
797
else if (tag == "drumedit") {
799
toplevels.back().cobject()->readStatus(xml);
802
else if (tag == "midimixer") {
804
toplevels.back().cobject()->readStatus(xml);
806
else if (tag == "listeditor") {
808
toplevels.back().cobject()->readStatus(xml);
811
else if (tag == "scoreeditor") {
812
startScoreEditor(pl);
813
toplevels.back().cobject()->readStatus(xml);
816
else if (tag == "master") {
818
toplevels.back().cobject()->readStatus(xml);
820
else if (tag == "lmaster") {
821
startLMasterEditor();
822
toplevels.back().cobject()->readStatus(xml);
824
else if (tag == "audiomixer") {
825
TopWin* tw = startAudioMixer();
828
else if (tag == "marker") {
830
toplevels.back().cobject()->readStatus(xml);
832
else if (tag == "waveedit") {
834
toplevels.back().cobject()->readStatus(xml);
837
else if (tag == "cliplist") {
839
toplevels.back().cobject()->readStatus(xml);
847
if (tag == "toplevels") {
857
//---------------------------------------------------------
859
//---------------------------------------------------------
861
void MusE::readCtrl(Xml& xml, int prt, int channel)
863
ChannelState* iState = midiPorts[prt].iState(channel);
869
Xml::Token token = xml.parse();
875
xml.unknown("readCtrl");
878
if (xml.s1() == "idx")
879
idx = xml.s2().toInt();
880
else if (xml.s1() == "val")
881
val = xml.s2().toInt();
884
if (xml.s1() == "ctrl") {
885
iState->controller[idx] = val;
886
// printf("%d %d ctrl %d val %d\n", prt, channel, idx, val);
895
//---------------------------------------------------------
897
//---------------------------------------------------------
899
void MusE::readMidichannel(Xml& xml, int prt)
902
MidiPort* port = &midiPorts[prt];
903
ChannelState* iState = 0;
906
Xml::Token token = xml.parse();
907
const QString& tag = xml.s1();
914
iState->pitch = xml.parseInt();
915
else if (tag == "program") {
916
iState->program = xml.parseInt();
918
else if (tag == "ctrl")
919
readCtrl(xml, prt, channel);
921
xml.unknown("readMidichannel");
926
channel = xml.s2().toInt();
927
iState = port->iState(channel);
931
if (tag == "midichannel")
939
//---------------------------------------------------------
941
//---------------------------------------------------------
943
void MusE::readMidiport(Xml& xml)
947
Xml::Token token = xml.parse();
948
const QString& tag = xml.s1();
954
if (tag == "midichannel")
955
readMidichannel(xml, port);
957
xml.unknown("readMidiport");
962
port = xml.s2().toInt();
966
if (tag == "midiport") {
975
//---------------------------------------------------------
978
//---------------------------------------------------------
980
void MusE::write(Xml& xml) const
985
xml.tag(level++, "muse version=\"1.0\"");
986
writeConfiguration(level, xml);
988
for (int i = 0; i < MIDI_PORTS; ++i) {
989
MidiPort* port = &midiPorts[i];
991
for (int k = 0; k < MIDI_CHANNELS; ++k) {
992
ChannelState* iState = port->iState(k);
993
if ((iState->pitch != -1) || (iState->program != -1))
995
for (int l = 0; l < 128; ++l) {
996
if (iState->controller[l] != -1)
1003
xml.tag(level++, "midiport port=\"%d\"", i);
1005
for (int k = 0; k < MIDI_CHANNELS; ++k) {
1006
bool active = false;
1007
ChannelState* iState = port->iState(k);
1008
if ((iState->pitch != -1) || (iState->program != -1))
1010
for (int l = 0; l < 128; ++l) {
1011
if (iState->controller[l] != -1)
1017
xml.tag(level++, "midichannel ch=\"%d\"", k);
1018
if (iState->pitch != -1)
1019
xml.intTag(level, "pitch", iState->pitch);
1020
if (iState->program != -1)
1021
xml.intTag(level, "program", iState->program);
1022
for (int l = 0; l < 128; ++l) {
1023
if (iState->controller[l] != -1)
1024
xml.tag(level, "ctrl idx=\"%d\" val=\"%d\" /", l,
1025
iState->controller[l]);
1027
xml.etag(level--, "midichannel");
1029
xml.etag(level--, "midiport");
1032
waveClips->write(level, xml);
1033
writeMidiController(level, xml);
1034
writeStatusMidiInputTransformPlugins(level, xml);
1036
song->write(level, xml);
1038
xml.intTag(level, "cpos", song->cpos());
1039
xml.intTag(level, "rpos", song->rpos());
1040
xml.intTag(level, "lpos", song->lpos());
1042
if (!toplevels.empty()) {
1043
xml.tag(level++, "toplevels");
1044
for (ciToplevel i = toplevels.begin(); i != toplevels.end(); ++i) {
1045
if (i->cobject()->isVisible())
1046
i->cobject()->writeStatus(level, xml);
1048
xml.tag(level--, "/toplevels");
1050
writeDrumMap(level, xml, false);
1051
xml.tag(level, "/muse");
1054
//---------------------------------------------------------
1056
//---------------------------------------------------------
1058
void Song::readMarker(Xml& xml)
1062
_markerList->add(m);
1065
//---------------------------------------------------------
1068
//---------------------------------------------------------
1070
void MusE::read(Xml& xml)
1072
bool skipmode = true;
1076
Xml::Token token = xml.parse();
1077
const QString& tag = xml.s1();
1083
if (skipmode && tag == "muse")
1087
else if (tag == "configuration")
1088
readConfiguration(xml);
1089
else if (tag == "song")
1091
else if (tag == "cpos") {
1092
pos = xml.parseInt();
1093
song->setPos(Song::CPOS, pos, true, true, true);
1095
else if (tag == "lpos") {
1096
pos = xml.parseInt();
1097
song->setPos(Song::LPOS, pos, true, true, true);
1099
else if (tag == "rpos") {
1100
pos = xml.parseInt();
1101
song->setPos(Song::RPOS, pos, true, true, true);
1103
else if (tag == "midiport")
1105
else if (tag == "toplevels")
1107
else if (tag == "drummap")
1108
readDrumMap(xml, false);
1109
else if (tag == "clip") {
1110
Clip* clip = new Clip();
1113
else if (tag == "mctrl")
1114
readMidiController(xml);
1115
else if (tag == "mplugin")
1116
readStatusMidiInputTransformPlugin(xml);
1118
xml.unknown("muse");
1123
if (!skipmode && tag == "muse")