private void OpenFile(string path) { stFile = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Write); BinaryWriter br = new BinaryWriter(stFile); MWriterFile = new clsMWriter(br); //return ""; }
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 WriteTrack(clsTrks.T trk) { int prevticks = 0; using (stTrk = new MemoryStream()) { BinaryWriter br = new BinaryWriter(stTrk); MWriterTrk = new clsMWriter(br); string strtitle = (P.F.frmTrackMap == null || P.F.frmTrackMap.txtTitles[trk] == null) ? FS.Title[trk] : P.F.frmTrackMap.txtTitles[trk].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); //* write overriding controllers (vol, pan, patch) clsFileStream.clsEvShort evshort; bool indvol = false, indpan = false, indpatch = false; if (P.F.Chan[trk] >= 0) { int chan = P.F.Chan[trk]; byte vol = (byte)P.F.Vol[chan]; if (vol <= 127) { indvol = true; evshort = new clsFileStream.clsEvShort(0, trk.TrkNum, (byte)(0xb0 | chan), 7, vol); WriteStrmMsg(ref prevticks, evshort); } byte pan = (byte)P.F.Pan[chan]; if (pan <= 127) { indpan = true; evshort = new clsFileStream.clsEvShort(0, trk.TrkNum, (byte)(0xb0 | chan), 10, pan); WriteStrmMsg(ref prevticks, evshort); } byte patch = (byte)P.F.Patch[chan]; if (patch <= 127) { indpatch = true; evshort = new clsFileStream.clsEvShort(0, 0, trk.TrkNum, (byte)(0xc0 | chan), patch); WriteStrmMsg(ref prevticks, evshort); } } foreach (clsFileStream.clsEvStrm ev in FS.Strm) { if (ev.Trk != trk) { continue; } if (ev is clsFileStream.clsEvBeat) { continue; } if (ev is clsFileStream.clsEvShort) { clsFileStream.clsEvShort evsh = (clsFileStream.clsEvShort)ev; int status = evsh.Status & 0xf0; if (indvol && status == 0xb0 && evsh.Msg == 7) { continue; //vol overriden } if (indpan && status == 0xb0 && evsh.Msg == 10) { continue; //pan overriden } if (indpatch && status == 0xc0) { continue; //patch overriden } } WriteStrmMsg(ref prevticks, ev); } 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); } }