private void WriteToFileStream(int prevticks) { clsFileStream.clsEvMeta eveof = new clsFileStream.clsEvMeta(int.MaxValue, prevticks, -1, 0x2f, new byte[0]); eveof.WriteMsg(this, 0); stTrk.Flush(); MWriterFile.WriteString("MTrk"); MWriterFile.WriteUIntF((uint)stTrk.Length, 4); stTrk.WriteTo(stFile); //write trkstream to filestream }
private void WriteChordTrack() { //* contains labels and/or midinotes //* last track in midi file if (P.F?.CF?.Evs == null || P.F.CF.Evs.Count == 0) { return; } int prevticks = 0; using (stTrk = new MemoryStream()) { BinaryWriter br = new BinaryWriter(stTrk); MWriterTrk = new clsMWriter(br); string strtitle = (P.frmSaveMidiFileAs.txtChordTrackTitle.Text == "") ? "Chords" : P.frmSaveMidiFileAs.txtChordTrackTitle.Text; byte[] bytestitle = Encoding.ASCII.GetBytes(strtitle); clsFileStream.clsEvTitle evtitle = new clsFileStream.clsEvTitle(0, 0, -1, bytestitle); //trk param not used evtitle.WriteTitle(this, 0); foreach (clsCF.clsEv evcf in P.F.CF.Evs) { if (P.frmSaveMidiFileAs.chkSaveChordLabels.Checked) { byte[] bytestext = Encoding.ASCII.GetBytes(evcf.ChordName(eKBTrans.None, kbtranskey: false)); clsFileStream.clsEvStrm evstrm = new clsFileStream.clsEvMeta(0, evcf.OnTime, -1, 0x01, bytestext); WriteStrmMsg(ref prevticks, evstrm); } if (P.frmSaveMidiFileAs.chkSaveChordTrack.Checked) { int status = 0x90 | (int)(P.frmSaveMidiFileAs.nudChordChan.Value - 1); WriteChord(ref prevticks, evcf, status, evcf.OnTime, 80); //ON evs of chord WriteChord(ref prevticks, evcf, status, evcf.OffTime, 0); //OFF evs of chord } } WriteToFileStream(prevticks); } }
private void WriteCondTrk() { List <clsFileStream.clsEvStrm> listev = new List <clsFileStream.clsEvStrm>(); using (stTrk = new MemoryStream()) { BinaryWriter br = new BinaryWriter(stTrk); MWriterTrk = new clsMWriter(br); //* get current conductor track //* should not incl. keys or tsigs //* should not incl. tempos foreach (clsFileStream.clsEvStrm ev in FS.Strm) { if (ev.Trk == null && ev.indWrite) { listev.Add(ev); } } //* save keys foreach (clsKeyTicks key in P.F.Keys.Keys) { //sbyte midikey = (sbyte)key.MidiKey; byte[] data = new byte[] { (byte)key.MidiKey, (byte)key.MajMin }; clsFileStream.clsEvStrm ev = new clsFileStream.clsEvMeta(0, key.Ticks, -1, 0x59, data); int index = listev.BinarySearch(ev); if (index < 0) { index = ~index; } listev.Insert(index, ev); } //* save time signatures foreach (clsMTime.clsTSigBB tsig in P.F.MTime.TSigs) { byte[] data = new byte[] { (byte)tsig.NN, (byte)tsig.DDMidi, (byte)tsig.MidiClocksPerMetClick, (byte)8 }; clsFileStream.clsEvStrm ev = new clsFileStream.clsEvMeta(0, tsig.Tick, -1, 0x58, data); int index = listev.BinarySearch(ev); if (index < 0) { index = ~index; } listev.Insert(index, ev); } //* save tempos //clsFileStream.clsMap<int> tempomap = null; clsMap <int> tempomap = null; if (P.F?.FSTrackMap?.TempoMap != null) { tempomap = P.F.FSTrackMap.TempoMap; } else if (P.F?.FileStreamConv?.TempoMap != null) { tempomap = P.F.FileStreamConv.TempoMap; } if (tempomap != null) { //for (int i = 0; i < tempomap.Count; i++) { // int ticks = tempomap.KeyByIndex(i); // int tempo = tempomap.ValByIndex(i); foreach (KeyValuePair <int, int> pair in tempomap) { int ticks = pair.Key; int tempo = pair.Value; byte[] data = clsFileStream.ConvUIntF((uint)tempo, 3); clsFileStream.clsEvStrm ev = new clsFileStream.clsEvMeta(0, ticks, -1, 0x51, data); int index = listev.BinarySearch(ev); if (index < 0) { index = ~index; } listev.Insert(index, ev); } } //* write to trk stream int prevticks = 0; foreach (clsFileStream.clsEvStrm ev in listev) { if (ev is clsFileStream.clsEvBeat) { continue; } WriteStrmMsg(ref prevticks, ev); } WriteToFileStream(prevticks); } }