Advertisement
Guest User

Untitled

a guest
Jul 16th, 2019
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.90 KB | None | 0 0
  1. Future<void> loadArpeggios() async {
  2. var arpeggiosFile = await loadMidi('arpeggios.mid');
  3. arpeggiosFile.tracks.forEach((track) {
  4. var isAudioTrack = false;
  5. var pattern = {};
  6. int time = 0;
  7. var trackName = 'name';
  8.  
  9. track.forEach((event) {
  10. time += event.deltaTime;
  11. if (event is NoteOnEvent) {
  12. isAudioTrack = true;
  13. // 0 -> 0:0:0
  14. // 0.25 -> 0:0:1
  15. // 0.5 -> 0:0:2
  16. // 1 -> 0:1:0
  17. // 4 -> 1:0:0
  18. var quarters = (time / 480);
  19. var fullBars = ((quarters / 4).floor().toString());
  20. var fullQuarters = (quarters % 4).floor().toString();
  21. var fullSixteenth = ((quarters % 4 % 1) / 0.25).floor().toString();
  22.  
  23. var str =
  24. '$fullBars:$fullQuarters:$fullSixteenth/${event.velocity.toString()}';
  25. if (!(pattern.containsKey(event.noteNumber))) {
  26. pattern[event.noteNumber] = [];
  27. }
  28. pattern[event.noteNumber].add(str);
  29. } else if (event is TrackNameEvent) {
  30. trackName = event.text;
  31. }
  32. });
  33.  
  34. if (isAudioTrack) {
  35. arpeggioDict[trackName] = pattern;
  36. arpeggioTrackNameMap[trackName] = track;
  37. }
  38. });
  39. }
  40.  
  41. var arpeggiosTrackNames = arpeggioDict.keys.toList();
  42. var drumsTrackNames = drumsDict.keys.toList();
  43.  
  44. Future<MidiFile> loadMidi(String name) async {
  45. Directory tempDir = await getTemporaryDirectory();
  46. String tempPath = tempDir.path;
  47. File tempFile = File('$tempPath/$name');
  48. ByteData bd = await rootBundle.load('assets/$name');
  49. await tempFile.writeAsBytes(bd.buffer.asUint8List(), flush: true);
  50. return MidiParser().parseMidiFromFile(tempFile);
  51. }
  52.  
  53. Future<List<int>> progressionToModiBuffer(List<Chord> chords, String arpeggioName,
  54. String drumPatternName, int bpm) async {
  55. List<MidiEvent> arpeggioTrack = [];
  56.  
  57. var arpeggios = await loadMidi('arpeggios.mid');
  58. var arpeggio = arpeggios.tracks.firstWhere((track) {
  59. return track
  60. .any((event) => event is TrackNameEvent && event.text == arpeggioName);
  61. });
  62. chords.asMap().forEach((index, value) {
  63. arpeggio.forEach((f) {
  64. if (f is NoteOnEvent) {
  65. var newEvent = NoteOnEvent()
  66. ..deltaTime = f.deltaTime
  67. ..channel = 0
  68. ..velocity = f.velocity
  69. ..noteNumber = mapMidiToChord(f.noteNumber, value);
  70. arpeggioTrack.add(newEvent);
  71. } else if (f is NoteOffEvent) {
  72. var newEvent = NoteOffEvent()
  73. ..deltaTime = f.deltaTime
  74. ..channel = 0
  75. ..velocity = f.velocity
  76. ..noteNumber = mapMidiToChord(f.noteNumber, value);
  77. arpeggioTrack.add(newEvent);
  78. } else if (f is TrackNameEvent && index == 0) {
  79. arpeggioTrack.add(f);
  80. }
  81. });
  82.  
  83. });
  84. arpeggioTrack.add(endOfTrackEvent);
  85.  
  86. var tracks = [getDefaultMidiTempoTrack(bpm), arpeggioTrack];
  87.  
  88. if (drumPatternName != "none") {
  89. List<MidiEvent> drumsTrack = [];
  90. var drums = await loadMidi('drums.mid');
  91. var drum = drums.tracks.firstWhere((track) {
  92. return track.any(
  93. (event) => event is TrackNameEvent && event.text == drumPatternName);
  94. });
  95.  
  96. drum.forEach((f) {
  97. if (f is NoteOnEvent) {
  98. var newEvent = NoteOnEvent()
  99. ..deltaTime = f.deltaTime
  100. ..channel = 9 // Drums magic
  101. ..velocity = f.velocity
  102. ..noteNumber = f.noteNumber;
  103. drumsTrack.add(newEvent);
  104. } else if (f is NoteOffEvent) {
  105. var newEvent = NoteOffEvent()
  106. ..deltaTime = f.deltaTime
  107. ..channel = 9 // Drums magic
  108. ..velocity = f.velocity
  109. ..noteNumber = f.noteNumber;
  110. drumsTrack.add(newEvent);
  111. } else if (f is TrackNameEvent) {
  112. drumsTrack.add(f);
  113. }
  114. });
  115.  
  116. drumsTrack.add(endOfTrackEvent);
  117. tracks.add(drumsTrack);
  118. }
  119.  
  120. return MidiWriter().writeMidiToBuffer(MidiFile(tracks, defaultMidiHeader), running: true);
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement