MidiProcessor.cs 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace OpenVIII.Core.AV.Music.Midi
  7. {
  8. using OpenVIII.AV.Midi;
  9. public class MidiProcessor
  10. {
  11. private List<Fluid.DMUS_IO_INSTRUMENT> lbinbins;
  12. private Fluid.DMUS_IO_TEMPO_ITEM tetr;
  13. private List<Fluid.DMUS_IO_SEQ_ITEM> seqt;
  14. private List<Fluid.DMUS_IO_TIMESIGNATURE_ITEM> tims;
  15. public MidiProcessor(List<Fluid.DMUS_IO_INSTRUMENT> instruments, Fluid.DMUS_IO_TEMPO_ITEM tempo, List<Fluid.DMUS_IO_SEQ_ITEM> sequences, List<Fluid.DMUS_IO_TIMESIGNATURE_ITEM> timeSignatures)
  16. {
  17. lbinbins = instruments;
  18. tetr = tempo;
  19. seqt = sequences;
  20. tims = timeSignatures;
  21. }
  22. public NAudio.Midi.MidiEventCollection Process()
  23. {
  24. var mid = new NAudio.Midi.MidiEventCollection(1, Fluid.DMUS_PPQ);
  25. mid.AddTrack();
  26. for (var i = 0; i < lbinbins.Count; i++)
  27. {
  28. var lbin = lbinbins[i];
  29. var patch_ = (int)(lbin.dwPatch & 0xFF); //MSB, LSB + patch on the least 8 bits
  30. var patch = new NAudio.Midi.PatchChangeEvent(0, (int)lbin.dwPChannel + 1, patch_);
  31. mid.AddEvent(patch, 0);
  32. }
  33. mid.AddEvent(new NAudio.Midi.TempoEvent((int)(Fluid.DMUS_MusicTimeMilisecond / tetr.dblTempo), 0), 0);
  34. for (var i = 0; i < tims.Count; i++)
  35. {
  36. var tim = tims[i];
  37. //NAudio.Midi.TimeSignatureEvent time = new NAudio.Midi.TimeSignatureEvent(tim.lTime, ,,tim);
  38. }
  39. for (var i = 0; i < seqt.Count; i++)
  40. {
  41. var ss = seqt[i];
  42. var note = new NAudio.Midi.NoteEvent(ss.mtTime, (int)ss.dwPChannel + 1, NAudio.Midi.MidiCommandCode.NoteOn, ss.bByte1, ss.bByte2);
  43. mid.AddEvent(note, 0);
  44. note = new NAudio.Midi.NoteEvent(ss.mtTime + ss.mtDuration, (int)ss.dwPChannel + 1, NAudio.Midi.MidiCommandCode.NoteOff, ss.bByte1, ss.bByte2);
  45. mid.AddEvent(note, 0);
  46. }
  47. for (var i = 0; i < 16; i++)
  48. {
  49. //native build of naudio doesn't have the numbers in the enum.
  50. //you can manually force it to take the number by doing (NAudio.Midi.MidiController)number
  51. //as suggested on https://github.com/FluidSynth/fluidsynth/issues/544#issuecomment-507844553
  52. mid.AddEvent(new NAudio.Midi.ControlChangeEvent(0, i + 1, (NAudio.Midi.MidiController)OpenVIII.AV.Midi.MidiController.NRPN_MSB, 120), 0);//99
  53. mid.AddEvent(new NAudio.Midi.ControlChangeEvent(0, i + 1, (NAudio.Midi.MidiController)OpenVIII.AV.Midi.MidiController.NRPN_LSB, 38), 0);//98
  54. mid.AddEvent(new NAudio.Midi.ControlChangeEvent(0, i + 1, (NAudio.Midi.MidiController)OpenVIII.AV.Midi.MidiController.LSBGenerator38, 127), 0);//38
  55. mid.AddEvent(new NAudio.Midi.ControlChangeEvent(0, i + 1, (NAudio.Midi.MidiController)OpenVIII.AV.Midi.MidiController.MSGgenerator38, 110), 0);//6
  56. //The DLS loader has wrong release/hold/attack so we need to tweak it via generators. It's prior to change
  57. }
  58. return mid;
  59. }
  60. }
  61. }