public void PlaybackCompletedToEnd()
        {
            var  vt = new VirtualMidiPlayerTimeManager();
            var  music = TestHelper.GetMidiMusic();
            var  qmsec = MidiMusic.GetPlayTimeMillisecondsAtTick(music.Tracks [0].Messages, 4998, 192);
            var  player = TestHelper.GetMidiPlayer(vt, music);
            bool completed = false, finished = false;

            player.PlaybackCompletedToEnd += () => completed = true;
            player.Finished += () => finished = true;
            Assert.IsTrue(!completed, "1 PlaybackCompletedToEnd already fired");
            Assert.IsTrue(!finished, "2 Finished already fired");
            player.Play();
            vt.ProceedBy(100);
            Assert.IsTrue(!completed, "3 PlaybackCompletedToEnd already fired");
            Assert.IsTrue(!finished, "4 Finished already fired");
            vt.ProceedBy(qmsec);
            Assert.AreEqual(12989, qmsec, "qmsec");
            // FIXME: this is ugly
            while (player.PlayDeltaTime < 4988)
            {
                Task.Delay(100);
            }
            Assert.AreEqual(4988, player.PlayDeltaTime, "PlayDeltaTime");
            player.Pause();
            player.Dispose();
            Assert.IsTrue(completed, "5 PlaybackCompletedToEnd not fired");
            Assert.IsTrue(finished, "6 Finished not fired");
        }
        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.");
            }
        }
Exemple #3
0
        public MidiMusic DemoPixelMidi()
        {
            MidiMusic result = new MidiMusic();

            short noteLen = 0x03C0;
            int   offset  = 4 * noteLen;

            result.DeltaTimeSpec = noteLen;
            result.Format        = 1;

            var track_sys = GetMetaTrack(FileName);

            result.AddTrack(track_sys);

            var track = new MidiTrack();

            track.AddMessage(new MidiMessage(0, new MidiEvent(MidiEvent.Meta, 3, 0, Encoding.Default.GetBytes("Demo"))));
            var delta = new int[128];

            for (int x = 0; x < 128; x++)
            {
                var noteOn  = new MidiEvent(MidiEvent.NoteOn, (byte)x, 0x64, Encoding.Default.GetBytes(""));
                var noteOff = new MidiEvent(MidiEvent.NoteOn, (byte)x, 0x00, Encoding.Default.GetBytes(""));
                track.AddMessage(new MidiMessage(0, noteOn));
                track.AddMessage(new MidiMessage(offset, noteOff));
            }
            track.AddMessage(new MidiMessage(0, new MidiEvent(MidiEvent.Meta, 0x2F, 0, Encoding.Default.GetBytes(""))));
            result.AddTrack(track);

            return(result);
        }
        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)
                    {
                    }
                }
            }
        }
        public static int getBestShift(MidiMusic midiMusic)
        {
            int shift  = 0;
            int oldHit = 0;

            for (int i = -21; i < 22; i++)
            {
                int hit = 0;
                foreach (MidiTrack track in midiMusic.Tracks)
                {
                    foreach (MidiMessage mm in track.Messages)
                    {
                        int tempo = mm.Event.Msb + i;
                        if (mapping.ContainsKey(tempo.ToString()))
                        {
                            hit++;
                        }
                    }
                }
                if (hit > oldHit)
                {
                    shift  = i;
                    oldHit = hit;
                }
            }
            return(shift);
        }
Exemple #6
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();
        }
Exemple #7
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);
            }
        }
        public static MidiPlayer GetMidiPlayer(IMidiPlayerTimeManager timeManager, MidiMusic midiMusic, IMidiAccess midiAccess = null)
        {
            var access = midiAccess ?? MidiAccessManager.Empty;
            var music  = midiMusic ?? GetMidiMusic();
            var tm     = timeManager ?? new VirtualMidiPlayerTimeManager();

            return(new MidiPlayer(music, access, tm));
        }
Exemple #9
0
        /// <summary>
        /// Reads the given file with the given fileName. Expects a MIDI standard file. Otherwise an error will be trown.
        /// </summary>
        /// <param name="filePath">The path to the file.</param>
        public void readFile(string filePath)
        {
            FileStream fileStream = File.OpenRead(filePath);
            SmfReader  reader     = new SmfReader();

            reader.Read(fileStream);
            this.music = reader.Music;
            fileStream.Close();
        }
Exemple #10
0
 void StartNewSong(MidiMusic music)
 {
     if (player != null)
     {
         player.Dispose();
     }
     player = new MidiPlayer(music, MidiState.Instance.GetMidiOutput(this));
     player.PlayAsync();
 }
Exemple #11
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())));
        }
Exemple #12
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())));
        }
Exemple #13
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();
        }
Exemple #14
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);
     }
 }
Exemple #15
0
    private void cutMusic(int from, int to, MidiMusic music, string outputFilename)
    {
        FileStream stream = File.Create(outputFilename);
        SmfWriter  writer = new SmfWriter(stream);

        writer.WriteHeader(music.Format, (short)music.Tracks.Count, music.DeltaTimeSpec);
        IList <MidiTrack> tracks = music.Tracks;

        for (var i = 0; i < tracks.Count; i++)
        {
            var  track          = tracks[i];
            int  passedTime     = 0;
            var  newTrack       = new MidiTrack();
            bool isFirstMessage = true;

            for (var j = 0; j < track.Messages.Count; j++)
            {
                var message = track.Messages[j];
                passedTime += message.DeltaTime;

                if (passedTime < from && message.Event.EventType != MidiEvent.NoteOn && message.Event.EventType != MidiEvent.NoteOff)
                {
                    var convertedMsg = MidiUtil.convertTimeToZero(message);
                    newTrack.AddMessage(convertedMsg);
                }
                else if (passedTime >= from && passedTime < to)
                {
                    if (isFirstMessage)
                    {
                        int newDeltaTime = passedTime - from;
                        newTrack.AddMessage(new MidiMessage(newDeltaTime, message.Event));
                        isFirstMessage = false;
                    }
                    else
                    {
                        newTrack.AddMessage(message);
                    }
                }
                else if (passedTime >= to && message.Event.EventType == MidiEvent.Meta && message.Event.MetaType == MidiMetaType.EndOfTrack)
                {
                    MidiMessage convertedMsg = MidiUtil.convertTimeToZero(message);
                    newTrack.AddMessage(convertedMsg);
                }
            }

            track = newTrack;
            // Debug.Log("Track " + (i + 1) + " Passed time:" + passedTime);
            writer.WriteTrack(track);
        }

        stream.Close();
    }
Exemple #16
0
 private void LogMidiInformation(MidiMusic music)
 {
     Debug.Log("Divisions: " + System.Convert.ToString(music.DeltaTimeSpec, 2));
     Debug.Log("Format: " + music.Format);
     Debug.Log("Number of tracks: " + music.Tracks.Count);
     try
     {
         Debug.Log("Time in milliseconds" + music.GetTotalPlayTimeMilliseconds());
     }
     catch (System.NotSupportedException)
     {
         Debug.Log("Library does not support calculating time of midi files with any format other than 0.");
     }
 }
Exemple #17
0
        public void analyseMidi(MidiMusic midiMusic)
        {
            minNoteVal       = midiMusic.Tracks.Min(track => track.Messages.Where(message => message.Event.MetaType > minAllowedNoteValues).Min(message => message.Event.MetaType));
            maxNoteVal       = midiMusic.Tracks.Max(track => track.Messages.Max(message => message.Event.MetaType));
            midiMusicAverage = midiMusic.Tracks.Average(track => track.Messages.Where(message => message.Event.MetaType > minAllowedNoteValues).Average(message => message.Event.MetaType));
            //foreach(var track in midiMusic.Tracks)
            //{
            //    var trackAverage = track.Messages.Average(message => message.Event.MetaType);
            //}

            largestDistanceFromAverage = Math.Max(midiMusicAverage - minNoteVal, maxNoteVal - midiMusicAverage);

            Console.WriteLine($"Midi min value: {minNoteVal}");
            Console.WriteLine($"Midi max value: {maxNoteVal}");
            Console.WriteLine($"Midi mean: {midiMusicAverage}");
        }
Exemple #18
0
        public static MidiMusic Load(string filename)
        {
            MidiMusic result = null;

            if (File.Exists(filename))
            {
                using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    SmfReader smf = new SmfReader();
                    smf.Read(fs);
                    result = smf.Music;
                }
            }

            return(result);
        }
Exemple #19
0
    // Use this for initialization
    void Start()
    {
        SmfReader reader = new SmfReader();

        reader.Read(File.OpenRead("mysong2.mid"));
        MidiMusic music = reader.Music;

        Directory.CreateDirectory("midi-out");
        this.cutMusic(10000, 30000, music, "midi-out/1.mid");

        reader.Read(File.OpenRead("midi-out/1.mid"));
        MidiMusic musicCut = reader.Music;

        Debug.Log("Original file length:" + GetTimeLengthInMinutes(music));
        Debug.Log("Cut file length: " + GetTimeLengthInMinutes(musicCut));
    }
        public void PlaySmf(MidiMusic music) //(Stream stream)
        {
            StopSmf();

            //var midiFileStream = File.OpenRead("Data/001-praise-to-the-lord.mid");
            Console.WriteLine($"Playing MIDI Stream");
            //var music = MidiMusic.Read(midiFileStream);
            _player           = new MidiPlayer(music, this.output);
            _player.Finished += () =>
            {
                // Destroy when finished
                _player = null;
            };
            // foreach (var message in music.Tracks[0].Messages.Take(20))
            // {
            //     Console.WriteLine($"Type:{message.Event.EventType.ToString()} Channel:{message.Event.Channel} Status:{message.Event.StatusByte} DeltaTime:{message.DeltaTime} ExData:{message.Event.ExtraDataLength} {BitConverter.ToString(message.Event.ExtraData.Take(message.Event.ExtraDataLength).ToArray())}");
            // }
            Console.WriteLine();
            _player.Play();
        }
        public static MidiMusic GetMidiMusic()
        {
            var music = new MidiMusic();

            music.DeltaTimeSpec = 192;
            var  track = new MidiTrack();
            byte ch    = 1;

            track.Messages.Add(new MidiMessage(188, new MidiEvent((byte)(MidiEvent.Program + ch), 1, 0, null, 0, 0)));
            for (int i = 0; i < 100; i++)
            {
                track.Messages.Add(
                    new MidiMessage(4, new MidiEvent((byte)(MidiEvent.NoteOn + ch), 60, 120, null, 0, 0)));
                track.Messages.Add(
                    new MidiMessage(44, new MidiEvent((byte)(MidiEvent.NoteOff + ch), 60, 0, null, 0, 0)));
            }

            music.Tracks.Add(track);
            return(music);
        }
Exemple #22
0
        public bool Save(string filename, MidiMusic music = null)
        {
            bool result = false;

            if (music == null)
            {
                music = Music;
            }

            if (music is MidiMusic && !string.IsNullOrEmpty(filename))
            {
                using (FileStream fs = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
                {
                    SmfWriter smf = new SmfWriter(fs);
                    smf.WriteMusic(music);
                    result = true;
                }
            }

            return(result);
        }
Exemple #23
0
        public void Play(MidiMusic music = null)
        {
            if (player is MidiPlayer)
            {
                Stop();
            }

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

            if (music is MidiMusic)
            {
                player = new MidiPlayer(music, output);
            }
            else if (Music is MidiMusic)
            {
                player = new MidiPlayer(Music, output);
            }
            else
            {
                return;
            }

            if (player is MidiPlayer)
            {
                if (player.State == PlayerState.Stopped || player.State == PlayerState.Paused)
                {
                    //player.EventReceived += (MidiEvent e) => {
                    //    if (e.EventType == MidiEvent.Program)
                    //        Console.WriteLine($"Program changed: Channel:{e.Channel} Instrument:{e.Msb}");
                    //};

                    player.PlayAsync();
                }
                //Console.WriteLine("Type [CR] to stop.");
                //Console.ReadLine();
                //player.Dispose();
            }
        }
Exemple #24
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);
            }
        }
Exemple #25
0
        void StartNewSong(int playerIndex, MidiMusic music)
        {
            MidiPlayer mml_music_player = null;

            if (players.Count > playerIndex)
            {
                players [playerIndex].Dispose();
            }

            mml_music_player = new MidiPlayer(music, Output);
            mml_music_player.PlayAsync();
            if (MusicListingChanged != null)
            {
                MusicListingChanged(this, new PlayerListingChangedEventArgs(playerIndex, music));
            }
            if (players.Count > playerIndex)
            {
                players [playerIndex] = mml_music_player;
            }
            else
            {
                players.Add(mml_music_player);
            }
        }
        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();
        }
Exemple #27
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)
            {
                ;
            }
        }
 public static MidiMusic GetMidiMusic(string resourceId)
 {
     using (var stream = typeof(TestHelper).Assembly.GetManifestResourceStream(resourceId))
         return(MidiMusic.Read(stream));
 }
Exemple #29
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;
                        }
                    }
                }
            }
        }
Exemple #30
0
 public PlayerListingChangedEventArgs(int index, MidiMusic music)
 {
     Index = index;
     Music = music;
 }