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."); } }
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) { } } } }
/// <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(); }
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); } }
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()))); }
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(); }
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()))); }
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); } }
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); } }
public static MidiMusic GetMidiMusic(string resourceId) { using (var stream = typeof(TestHelper).Assembly.GetManifestResourceStream(resourceId)) return(MidiMusic.Read(stream)); }
/// <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; } } } } }
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(); }
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 MidiMusic GetMusic() { _data.Seek(0, SeekOrigin.Begin); return(MidiMusic.Read(_data)); }
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"); })); }
MidiMusic GetSongData(string url) { return(MidiMusic.Read(new AssetOrUrlResolver(this).ResolveStream(url))); }