Exemple #1
0
 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
 }
Exemple #2
0
        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);
            }
        }
Exemple #3
0
        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);
            }
        }