Esempio n. 1
0
        /// <summary>
        /// Dump the Midi content as a human readable text file
        /// </summary>
        /// <param name="sequence">The sequence to be dumped.</param>
        /// <param name="outputFilePath">text file to store dump to</param>
        public static void DumpMidi(this Sequence sequence, string outputFilePath)
        {
            int trackno = 1;

            using (var outfile = new StreamWriter(outputFilePath, false)) {
                // write header
                string midiTypeName = MidiHelper.GetMidiFormatString(sequence.MidiFileType);
                outfile.WriteLine("Midi Type: {0} = {1}", sequence.MidiFileType, midiTypeName);

                float  divisionType       = sequence.DivisionType;
                string divisionTypeString = "";
                if (divisionType == Sequence.PPQ)
                {
                    divisionTypeString = "PPQ";
                }
                else if (divisionType == Sequence.SMPTE_24)
                {
                    divisionTypeString = "SMPTE_24";
                }
                else if (divisionType == Sequence.SMPTE_25)
                {
                    divisionTypeString = "SMPTE_25";
                }
                else if (divisionType == Sequence.SMPTE_30)
                {
                    divisionTypeString = "SMPTE_30";
                }
                else if (divisionType == Sequence.SMPTE_30DROP)
                {
                    divisionTypeString = "SMPTE_30DROP";
                }
                outfile.WriteLine("Division Type: {0} = {1}", divisionTypeString, divisionType);
                outfile.WriteLine("Resolution: {0}", sequence.Resolution);
                outfile.WriteLine("Tracks: {0}", sequence.Tracks.Count);
                outfile.WriteLine("Time: {0} ticks", sequence.GetTickLength());
                outfile.WriteLine();

                foreach (var track in sequence.Tracks)
                {
                    outfile.WriteLine("Track {0}", trackno);
                    foreach (var ev in track.Events)
                    {
                        long tick          = ev.Tick;
                        int  beat          = (int)tick / sequence.Resolution;
                        int  tickRemainder = (int)tick % sequence.Resolution;

                        MidiMessage msg = ev.Message;
                        outfile.WriteLine("{0:0000}:{1:000} {2}", beat, tickRemainder, msg);
                    }
                    trackno++;
                }
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Creates C# code from a MIDI sequence.
        /// </summary>
        /// <param name="sequence">The sequence to be generated as C# code and saved.</param>
        /// <param name="outputFilePath">path to text file to store generated code to</param>
        public static void SaveGenerateMidiCode(this Sequence sequence, string outputFilePath)
        {
            // generate code
            int trackno = 1;

            using (var outfile = new StreamWriter(outputFilePath, false)) {
                string   midiTypeName = MidiHelper.GetMidiFormatString(sequence.MidiFileType);
                DateTime now          = DateTime.Now;

                outfile.WriteLine("/*");
                outfile.WriteLine("* Generated by GnuMidi");
                outfile.WriteLine("* Author: [email protected]");
                outfile.WriteLine("* Date: {0}", now.ToString("yyyy-MM-dd"));
                outfile.WriteLine("* Time: {0}", now.ToString("HH:mm"));
                outfile.WriteLine("*/");
                outfile.WriteLine("using System;");
                outfile.WriteLine("using System.IO;");
                outfile.WriteLine("using gnu.sound.midi;");
                outfile.WriteLine("using gnu.sound.midi.file;");
                outfile.WriteLine("using gnu.sound.midi.info;");
                outfile.WriteLine();
                outfile.WriteLine("namespace MidiGeneration");
                outfile.WriteLine("{");
                outfile.WriteLine("	public static class GenerateMidi");
                outfile.WriteLine("	{");
                outfile.WriteLine("		public static void Main(string[] args)");
                outfile.WriteLine("		{");
                outfile.WriteLine("			// Generate Midi");
                outfile.WriteLine("			var sequence = GenerateSequence();");
                outfile.WriteLine("			sequence.DumpMidi(\"generated_dump.txt\");");
                outfile.WriteLine("			new MidiFileWriter().Write(sequence, sequence.MidiFileType, new FileInfo(\"generated.mid\"));");
                outfile.WriteLine("		}");
                outfile.WriteLine();

                outfile.WriteLine("		public static Sequence GenerateSequence() {");
                outfile.WriteLine();
                outfile.WriteLine("			// Generate midi file");
                outfile.WriteLine("			var sequence = new Sequence({0}, {1}, 0, (int) MidiHelper.MidiFormat.{2});", sequence.DivisionType, sequence.Resolution, midiTypeName);

                foreach (var track in sequence.Tracks)
                {
                    outfile.WriteLine();
                    outfile.WriteLine("			var track{0} = sequence.CreateTrack();", trackno);
                    foreach (var ev in track.Events)
                    {
                        long tick          = ev.Tick;
                        int  beat          = (int)tick / sequence.Resolution;
                        int  tickRemainder = (int)tick % sequence.Resolution;

                        MidiMessage msg = ev.Message;

                        // check if this is a meta message
                        var mm = msg as MetaMessage;
                        if (mm != null)
                        {
                            string metaCodeString = mm.CreateMetaEventGeneratedCode(tick, sequence.Resolution);
                            outfile.WriteLine("			track{0}.Add({1});", trackno, metaCodeString);
                        }

                        // check if this is a short message
                        var sm = msg as ShortMessage;
                        if (sm != null)
                        {
                            string shortCodeString = sm.CreateShortEventGeneratedCode(true, tick);
                            outfile.WriteLine("			track{0}.Add({1}", trackno, shortCodeString);
                        }

                        // check if this is a sysex message
                        var ss = msg as SysexMessage;
                        if (ss != null)
                        {
                            var    data        = ss.GetMessage();
                            string sysexString = MidiHelper.ByteArrayToString(data, ",");
                            outfile.WriteLine("			track{0}.Add(SysexEvent.CreateSysexEvent(\"{1}\", {2}));", trackno, sysexString, tick);
                        }
                    }
                    trackno++;
                }

                outfile.WriteLine();
                outfile.WriteLine("			return sequence;");
                outfile.WriteLine("		}");

                outfile.WriteLine("	}");
                outfile.WriteLine("}");
            }
        }