public Midi(string filepath)
        {
            if (File.Exists(filepath))
            {
                if (Path.GetExtension(filepath).ToLower() == ".mid")
                {
                    using (var fileStream = new FileStream(filepath, FileMode.Open))
                    {
                        file = MidiMusic.Read(fileStream);

                        //get tempo information from the midi
                        var t = file.GetMetaEventsOfType(MidiMetaType.Tempo).GetEnumerator();
                        t.MoveNext();
                    }
                }
                else
                {
                    throw new IOException("Incorrect file type.");
                }
            }
            else
            {
                throw new IOException("File doesn't exist.");
            }
        }
示例#2
0
        static void Main(string[] args)
        {
            Stopwatch stopwatch = new Stopwatch();

            Console.Write("Enter seed: ");
            string seed = Console.ReadLine();

            Console.WriteLine("Generating Midi...");

            stopwatch.Restart();

            // Generate a MIDI using Abundant Music
            using (Composition composition = MidiComposer.Compose(seed))
            {
                stopwatch.Stop();
                Console.WriteLine("Seed: " + composition.Seed);
                Console.WriteLine("Generated in: " + stopwatch.Elapsed);

                // Play the MIDI using managed-midi
                // https://github.com/atsushieno/managed-midi
                var access = MidiAccessManager.Default;
                var music  = MidiMusic.Read(composition.Midi);
                using (var player = new MidiPlayer(music, access))
                {
                    long totalPlayTime = player.GetTotalPlayTimeMilliseconds();
                    Console.WriteLine("Play time: " + TimeSpan.FromMilliseconds(totalPlayTime).ToString("g"));

                    player.Play();

                    while (player.State == PlayerState.Playing)
                    {
                    }
                }
            }
        }
示例#3
0
        /// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        protected override void Initialize()
        {
            // TODO: Add your initialization logic here

            graphics.PreferredBackBufferWidth  = this.windowWidth;
            graphics.PreferredBackBufferHeight = this.windowHeight;
            graphics.ApplyChanges();


            base.Initialize();

            player = new Player(playerTexture, new Vector2(widthMiddle, windowHeight - 50), new Rectangle(0, (int)(windowHeight * 0.66f), windowWidth, (int)(windowHeight - windowHeight * 0.66f)));

            var access = MidiAccessManager.Default;
            var output = access.OpenOutputAsync(access.Outputs.Last().Id).Result;

            midiMusic = MidiMusic.Read(System.IO.File.OpenRead("midiFiles/something_doin'_(nc)smythe.mid"));
            MidiAnalyser midiAnalyser = new MidiAnalyser();

            midiAnalyser.analyseMidi(midiMusic);

            noteManager = new NoteManager(new GameObject(ballTexture, new Vector2(this.widthMiddle, 0)), spawnArc, midiAnalyser, widthMiddle, 200, 800);

            midiPlayer = new MidiPlayer(midiMusic, output);
            midiPlayer.EventReceived += (MidiEvent midiEvent) => {
                if (midiEvent.EventType == MidiEvent.NoteOn)
                {
                    noteManager.addNote(midiEvent);
                }
            };
            midiPlayer.PlayAsync();
        }
示例#4
0
        public static void LoadMidi()
        {
            //File read stuff
            var openFileDialog = new OpenFileDialog
            {
                InitialDirectory = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
                Filter           = "mid files (*.mid)|*.mid",
                FilterIndex      = 2,
                RestoreDirectory = true
            };

            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                Globals.filePath = openFileDialog.FileName;

                if (Globals.player == null)
                {
                    Core.FirstLoad();
                }

                var music = MidiMusic.Read(System.IO.File.OpenRead(Globals.filePath));

                //Console.WriteLine(Globals.filePath);
                if (Globals.player != null)
                {
                    Globals.player = new MidiPlayer(music, Core.Globals.output);
                    return;
                }
                Globals.player = new MidiPlayer(music, Core.Globals.output);
            }
        }
示例#5
0
        MidiMusic CompileMmlToSong(string mml)
        {
            mml += $"0 CH{Channel + 1} {mml}";

            var compiler   = new MmlCompiler();
            var midiStream = new MemoryStream();
            var source     = new MmlInputSource("", new StringReader(mml));

            compiler.Compile(false, Enumerable.Repeat(source, 1).ToArray(), null, midiStream, false);
            return(MidiMusic.Read(new MemoryStream(midiStream.ToArray())));
        }
示例#6
0
        public void PlayPortMidi()
        {
            var stream = GetType().Assembly.GetManifestResourceStream("Commons.Music.Midi.Tests.Resources.testmidi.mid");
            var vt     = new AlmostVirtualMidiTimeManager();
            var player = new MidiPlayer(MidiMusic.Read(stream), new PortMidi.PortMidiAccess(), vt);

            player.PlayAsync();
            vt.AdvanceBy(10000);
            player.PauseAsync();
            player.Dispose();
        }
示例#7
0
        MidiMusic CompileMmlToSong(string mml)
        {
            var compiler = new MmlCompiler();

            compiler.Resolver = new AssetOrUrlResolver(this);
            var midiStream = new MemoryStream();
            var source     = new MmlInputSource("", new StringReader(mml));

            compiler.Compile(false, Enumerable.Repeat(source, 1).ToArray(), null, midiStream, false);
            return(MidiMusic.Read(new MemoryStream(midiStream.ToArray())));
        }
示例#8
0
 private MidiMusic getMusic()
 {
     try
     {
         using var sr = File.OpenRead(Path.Combine(jukebox.Settings.MIDIPath, jukebox.Current.Tune.Filepath));
         return(MidiMusic.Read(sr));
     }
     catch
     {
         return(null);
     }
 }
示例#9
0
        private void LoadMidiFile(string filePath)
        {
            try
            {
                midiMusic = MidiMusic.Read(File.OpenRead(filePath));
                if (midiMusic.Tracks.Any())
                {
                    var track = midiMusic.Tracks[0];
                    currentTrack = MidiHelper.ToSimpleMidiTrack(track, midiMusic.DeltaTimeSpec);

                    cbTrack.Items.Clear();
                    for (int x = 1; x <= midiMusic.Tracks.Count; x++)
                    {
                        cbTrack.Items.Add(x);
                    }
                    cbTrack.SelectedIndex = 0;
                }
            }
            catch (Exception e)
            {
                ShowError(e.Message);
            }
        }
示例#10
0
 public static MidiMusic GetMidiMusic(string resourceId)
 {
     using (var stream = typeof(TestHelper).Assembly.GetManifestResourceStream(resourceId))
         return(MidiMusic.Read(stream));
 }
示例#11
0
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="instrument">Defines the sound and the ADSR envelope.</param>
        /// <param name="midiFilePath">Path to a MIDI file to read its contents.</param>
        /// <param name="filterChannel">Filter on a specific channel. Use -1 to disable filtering.</param>
        /// <param name="steroPan">Stereo panning, from -1 to 1.</param>
        /// <param name="tempoChange">Multiplier for the tempo. 1 = unchanged</param>
        /// <param name="lengthChange">Multiplier for the note lengths. 1 = unchanged</param>
        /// <param name="volumeChange">Multiplier for the volume. 1 = unchanged</param>
        /// <param name="octaveShift">Shift the sequence by this amount of octaves. No change = 0</param>
        public Sequence(Instrument instrument, string midiFilePath, int filterChannel = -1, double steroPan = 0, double tempoChange = 1,
                        double lengthChange = 1, double volumeChange = 1, int octaveShift = 0)
        {
            this.Instrument   = instrument;
            this.StereoPan    = steroPan;
            this.VolumeChange = volumeChange;
            this.OctaveShift  = octaveShift;

            using (var stream = System.IO.File.OpenRead(midiFilePath)) {
                var    music          = MidiMusic.Read(stream);
                double timeConversion = (((double)music.GetTimePositionInMillisecondsForTick(1000)) / (1000000d)) / tempoChange;

                foreach (var track in music.Tracks)
                {
                    var    tracker     = new Dictionary <byte, Note>();
                    double currentTime = 0;

                    foreach (var message in track.Messages)
                    {
                        var type = message.Event.EventType >> 4;

                        if (type != 8 && type != 9)
                        {
                            continue;
                        }

                        if (filterChannel > -1)
                        {
                            if (filterChannel != message.Event.Channel)
                            {
                                continue;
                            }
                        }

                        if (message.Event.Channel == 10)
                        {
                            // Automatically filter the percussion channel
                            continue;
                        }

                        currentTime += ((double)message.DeltaTime) * timeConversion;

                        byte note     = message.Event.Msb;
                        byte velocity = message.Event.Lsb;

                        if (type == 8 || (type == 9 && velocity == 0))
                        {
                            // Note OFF event

                            if (!tracker.ContainsKey(note))
                            {
                                // Ignore inconsistent data
                                continue;
                            }

                            var noteObj = tracker[note];
                            noteObj.SustainLength = (currentTime - noteObj.StartTime) * lengthChange;
                            Notes.Add(noteObj);
                            tracker.Remove(note);

                            var endTime = noteObj.StartTime + instrument.MinimalNoteLength + noteObj.SustainLength + 1;
                            if (endTime > TotalLength)
                            {
                                TotalLength = endTime;
                            }

                            continue;
                        }

                        if (type == 9)
                        {
                            // Note ON event
                            double frequency = instrument.Tuning.getFrequency(note, OctaveShift);
                            tracker[note] = new Note(frequency, currentTime, ((double)velocity) / 127d, 0);

                            continue;
                        }
                    }
                }
            }
        }
示例#12
0
        private void button1_Click(object sender, EventArgs e)
        {
            //Thread.Sleep(5000);
            //FindWindow 参数一是进程名 参数2是 标题名
            textBox1.Text = "";
            listBox1.Items.Clear();
            int    shift            = 0;
            IntPtr calculatorHandle = WinApiUtils.FindWindow(null, "原神");

            //判断是否找到
            if (calculatorHandle == IntPtr.Zero)
            {
                MessageBox.Show("没有找到!");
                return;
            }
            //var access = MidiAccessManager.Default;
            var music = MidiMusic.Read(System.IO.File.OpenRead("./" + comboBox1.SelectedItem));

            shift          = TuneUtils.getBestShift(music);
            textBox1.Text += "best shift =" + shift;
            textBox1.Text += "\r\n";
            SimpleAdjustingMidiPlayerTimeManager simpleAdjustingMidiPlayerTimeManager = new SimpleAdjustingMidiPlayerTimeManager();

            player = new MidiPlayer(music, simpleAdjustingMidiPlayerTimeManager);
            int    val = 0;
            string key;

            WinApiUtils.SetForegroundWindow(calculatorHandle);
            player.EventReceived += (MidiEvent me) =>
            {
                switch (me.EventType)
                {
                case MidiEvent.Meta:
                    //case MidiEvent.Reset:
                    listBox1.Items.Add("MidiEvent.Meta");
                    break;

                case MidiEvent.ActiveSense:
                    listBox1.Items.Add("MidiEvent.ActiveSense");
                    break;

                case MidiEvent.MidiStop:
                    listBox1.Items.Add("MidiEvent.MidiStop");
                    break;

                case MidiEvent.MidiContinue:
                    listBox1.Items.Add("MidiEvent.MidiContinue");
                    break;

                case MidiEvent.MidiStart:
                    listBox1.Items.Add("MidiEvent.MidiStart");
                    break;

                case MidiEvent.MidiTick:
                    listBox1.Items.Add("MidiEvent.MidiTick");
                    break;

                case MidiEvent.MidiClock:
                    listBox1.Items.Add("MidiEvent.MidiClock");
                    break;

                case MidiEvent.EndSysEx:
                    //case MidiEvent.SysEx2:
                    listBox1.Items.Add("MidiEvent.EndSysEx");
                    break;

                case MidiEvent.TuneRequest:
                    listBox1.Items.Add("MidiEvent.TuneRequest");
                    break;

                case MidiEvent.SongPositionPointer:
                    listBox1.Items.Add("MidiEvent.SongPositionPointer");
                    break;

                case MidiEvent.MtcQuarterFrame:
                    listBox1.Items.Add("MidiEvent.MtcQuarterFrame");
                    break;

                case MidiEvent.SysEx1:
                    listBox1.Items.Add("MidiEvent.SysEx1");
                    break;

                case MidiEvent.Pitch:
                    listBox1.Items.Add("MidiEvent.Pitch");
                    break;

                case MidiEvent.CAf:
                    listBox1.Items.Add("MidiEvent.CAf");
                    break;

                case MidiEvent.Program:
                    listBox1.Items.Add("MidiEvent.Program");
                    break;

                case MidiEvent.CC:
                    listBox1.Items.Add("MidiEvent.CC");
                    break;

                case MidiEvent.PAf:
                    listBox1.Items.Add("MidiEvent.PAf");
                    break;

                case MidiEvent.SongSelect:
                    listBox1.Items.Add("MidiEvent.SongSelect");
                    break;

                case MidiEvent.NoteOn:
                    listBox1.Items.Add("MidiEvent.NoteOn");
                    val = me.Msb + shift;
                    key = val.ToString();
                    if (mapping.ContainsKey(key))
                    {
                        int c = me.Lsb;
                        if (c == 0)
                        {
                            WinApiUtils.keybd_event((byte)letter[mapping[key]], 0, 2, 0);
                            textBox1.Text += ")";
                            textBox1.Text += " ";
                        }
                        else
                        {
                            //SendKeys.Send(mapping[key]);
                            WinApiUtils.keybd_event((byte)letter[mapping[key]], 0, 0, 0);
                            //WinApiUtils.PostMessage(calculatorHandle, WinApiUtils.WM_KEY_DOWN, (Keys)Enum.Parse(typeof(Keys), mapping[key].ToUpper()), letter[mapping[key]]);
                            textBox1.Text += "(" + mapping[key];
                            textBox1.Text += ";";
                        }
                    }
                    else
                    {
                        textBox1.Text += "[" + key + "]";
                    }

                    break;

                case MidiEvent.NoteOff:
                    listBox1.Items.Add("MidiEvent.NoteOff");
                    val = me.Msb + shift;
                    key = val.ToString();
                    if (mapping.ContainsKey(key))
                    {
                        //SendKeys.Send(mapping[key]);
                        //WinApiUtils.PostMessage(calculatorHandle, WinApiUtils.WM_KEY_UP, (Keys)Enum.Parse(typeof(Keys), mapping[key].ToUpper()), letter[mapping[key]]);
                        WinApiUtils.keybd_event((byte)letter[mapping[key]], 0, 2, 0);
                        textBox1.Text += ")";
                        textBox1.Text += " ";
                    }
                    break;

                default:
                    //textBox1.Text += me.EventType;
                    //textBox1.Text += "\r\n";
                    break;
                }
            };
            player.Play();
        }
示例#13
0
        static void Main(string[] args)
        {
            var    access          = MidiAccessManager.Default;
            var    output          = access.OpenOutputAsync(access.Outputs.Last().Id).Result;
            var    music           = MidiMusic.Read(System.IO.File.OpenRead("../../../midi/avengers.mid"));
            var    player          = new MidiPlayer(music, output);
            int    HowHardPressed  = 0;
            string StrengthOfPress = "";

            player.PlayAsync();

            player.Dispose();



            if (access.Inputs.Count() > 0)
            {
                var    input = access.OpenInputAsync(access.Inputs.Last().Id).Result;
                byte[] data  = null;
                input.MessageReceived += (o, e) =>
                {
                    data = new byte[e.Length];
                    Array.Copy(e.Data, e.Start, data, 0, e.Length);



                    if (e.Data[1] != 0 && e.Data[0] == 144)
                    {
                        var    note       = e.Data[1] % 12 + 1;
                        string noteString = "N/A";
                        switch (note)
                        {
                        case 1:
                            noteString = "C";
                            break;

                        case 2:
                            noteString = "C#/D-";
                            break;

                        case 3:
                            noteString = "D";
                            break;

                        case 4:
                            noteString = "D#/E-";
                            break;

                        case 5:
                            noteString = "E";
                            break;

                        case 6:
                            noteString = "F";
                            break;

                        case 7:
                            noteString = "F#/G-";
                            break;

                        case 8:
                            noteString = "G";
                            break;

                        case 9:
                            noteString = "G#/A-";
                            break;

                        case 10:
                            noteString = "A";
                            break;

                        case 11:
                            noteString = "A#/B-";
                            break;

                        case 12:
                            noteString = "B";
                            break;

                        default:
                            noteString = "N/A";
                            break;
                        }
                        int octave = e.Data[1] / 12;
                        if (e.Data[1] != 0 && e.Data[0] != 144)
                        {
                            Console.Write("Not A NOTE?!?!?!?!?!?!?!??!?!!?!?");
                            Console.Write($"Note Played: {noteString}\t Octave Played: {octave.ToString()}\t");
                            Console.Write($"Data[0]: {e.Data[0]}\t");
                            Console.Write($"Note #: {e.Data[1]}\t");
                        }
                        else
                        {
                            /*
                             *
                             *
                             * Console.Write($"Note Played: {noteString}\t Octave Played: {octave.ToString()}\t");
                             * Console.Write($"Data[0]: {e.Data[0]}\t");
                             * Console.Write($"Note #: {e.Data[1]}\t");
                             * Console.WriteLine($"Data[2]: {e.Data[2]}");
                             */
                            HowHardPressed = e.Data[2];
                            if (HowHardPressed < 1)
                            {
                                StrengthOfPress = "StoppedPressing";
                            }
                            if (HowHardPressed > 0)
                            {
                                StrengthOfPress = "Barely";
                            }
                            if (HowHardPressed > 30)
                            {
                                StrengthOfPress = "Softly";
                            }
                            if (HowHardPressed > 55)
                            {
                                StrengthOfPress = "a healthy ammount";
                            }
                            if (HowHardPressed > 80)
                            {
                                StrengthOfPress = "Hard";
                            }
                            if (HowHardPressed > 110)
                            {
                                StrengthOfPress = "Jesus Why ?!?!";
                            }
                            if (HowHardPressed != 0)
                            {
                                Console.WriteLine("You played: " + noteString + " " + octave.ToString() + "th octave " + StrengthOfPress);
                            }
                        }
                    }
                };
            }
            while (true)
            {
                ;
            }
        }
示例#14
0
 public MidiMusic GetMusic()
 {
     _data.Seek(0, SeekOrigin.Begin);
     return(MidiMusic.Read(_data));
 }
示例#15
0
        public Task RefreshDatabase(Action <string> logger, Action <double> progress)
        {
            return(Task.Run(() =>
            {
                logger($"Updating database {cxstring} from MIDI files in {jukebox.Settings.MIDIPath}");
                var files = new DirectoryInfo(jukebox.Settings.MIDIPath)
                            .EnumerateFiles("*.mid", SearchOption.AllDirectories)
                            .ToList();

                var total = (float)files.Count;
                logger($"Processing {total:#,##0} MIDI files");

                // use the top-level folder name as the Genre
                // pre-pend the immediate folder name in the name
                // use the file name as the name
                // capture the file path too

                var re1 = new Regex(@"[\\\'\/\>\<;:\|\*?\@\=\^\!\`\~\#\u0000\u0001\u0003\u0004]", RegexOptions.IgnoreCase | RegexOptions.Compiled);
                var re2 = new Regex(@"[\s_-]+|\.$", RegexOptions.IgnoreCase | RegexOptions.Compiled);
                var reIgnore = new Regex(@"^(untitled|generated|played|written|words|\(brt\)|Copyright|http|www\.|e?mail|piano|acoustic|pedal|edition|sequenced|music\s+by|for\s+general|by\s+|words\s+|from\s+|arranged\s+|sung\s+|composed|dedicated|kmidi|melody|seq|track|this\s+and|1800S|midi\s+out|\S+\.com|\S+\.org|All Rights Reserved|with|when|just|Bdca426|dont|know|some|what|like|this|tk10|youre|Bwv001|Unnamed|comments|have|will|thing|come|v0100|midisource)", RegexOptions.IgnoreCase | RegexOptions.Compiled);

                var counter = 0;
                var sw = Stopwatch.StartNew();

                using var db = new LiteRepository(cxstring);
                files.AsParallel().ForAll(file =>
                {
                    var subpath = file.FullName.Substring(jukebox.Settings.MIDIPath.Length + 1);
                    var library = subpath.Contains("\\") ? subpath.Substring(0, subpath.IndexOf("\\")) : subpath;
                    var name = Path.GetFileNameWithoutExtension(file.Name);
                    var tags = new List <string> {
                        Path.GetFileName(file.DirectoryName), library
                    };
                    var tracksCount = 0;
                    var duration = 0;

                    try
                    {
                        using var str = file.OpenRead();
                        var music = MidiMusic.Read(str);
                        duration = music.GetTotalPlayTimeMilliseconds();

                        var events = music.Tracks
                                     .SelectMany(track => track.Messages)
                                     .Select(msg => msg.Event)
                                     .ToList();

                        tracksCount = music.Tracks.Count;

                        tags.AddRange(events
                                      .Where(e => e.EventType == MidiEvent.Meta && (e.Msb == MidiMetaType.TrackName || e.Msb == MidiMetaType.Text || e.Msb == MidiMetaType.InstrumentName))
                                      .Select(e => new string(Encoding.ASCII.GetChars(e.ExtraData)).Trim())
                                      .Select(m => re1.Replace(m, string.Empty))
                                      .Select(m => re2.Replace(m, " ").Trim())
                                      .Where(m => !reIgnore.IsMatch(m))
                                      );
                    }
                    catch (Exception ex)
                    {
                        logger($"Error on {file.FullName}: {ex.Message}");
                        return;
                    }

                    // add/update the tune
                    var tune = db.Query <Tune>()
                               .Where(t => t.Filepath.Equals(subpath, StringComparison.CurrentCultureIgnoreCase))
                               .FirstOrDefault()
                               ?? new Tune();
                    tune.Name = name;
                    tune.Library = library;
                    tune.Filepath = subpath;
                    tune.Tracks = tracksCount;
                    tune.Durationms = duration;
                    tune.Tags = tags
                                .Where(m => !string.IsNullOrWhiteSpace(m))
                                .Where(m => m.Length > 3)
                                .Select(m => toTitleCase(m))
                                .OrderBy(m => m)
                                .Distinct()
                                .ToList();

                    if (tune.Filepath != null)
                    {
                        db.Upsert(tune);
                    }

                    Interlocked.Increment(ref counter);
                    if (counter % 500 == 0 || counter == total)
                    {
                        var rate = counter / (float)sw.ElapsedMilliseconds; // = items per ms
                        var msleft = (total - counter) / rate;              // = ms
                        var eta = DateTime.Now.AddMilliseconds(msleft);
                        logger($"{(total - counter):#,##0} = {(counter / total):P0} eta: {eta:h:mm:ss} {subpath} => {library} / {name}");
                        progress(counter / total);
                    }
                });

                logger("Shrinking Database...");
                db.Database.Rebuild();
                jukebox.Tunes = db.Query <Tune>().ToList();
                logger("Database refresh complete");
            }));
        }
示例#16
0
 MidiMusic GetSongData(string url)
 {
     return(MidiMusic.Read(new AssetOrUrlResolver(this).ResolveStream(url)));
 }