Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Future<void> loadArpeggios() async {
- var arpeggiosFile = await loadMidi('arpeggios.mid');
- arpeggiosFile.tracks.forEach((track) {
- var isAudioTrack = false;
- var pattern = {};
- int time = 0;
- var trackName = 'name';
- track.forEach((event) {
- time += event.deltaTime;
- if (event is NoteOnEvent) {
- isAudioTrack = true;
- // 0 -> 0:0:0
- // 0.25 -> 0:0:1
- // 0.5 -> 0:0:2
- // 1 -> 0:1:0
- // 4 -> 1:0:0
- var quarters = (time / 480);
- var fullBars = ((quarters / 4).floor().toString());
- var fullQuarters = (quarters % 4).floor().toString();
- var fullSixteenth = ((quarters % 4 % 1) / 0.25).floor().toString();
- var str =
- '$fullBars:$fullQuarters:$fullSixteenth/${event.velocity.toString()}';
- if (!(pattern.containsKey(event.noteNumber))) {
- pattern[event.noteNumber] = [];
- }
- pattern[event.noteNumber].add(str);
- } else if (event is TrackNameEvent) {
- trackName = event.text;
- }
- });
- if (isAudioTrack) {
- arpeggioDict[trackName] = pattern;
- arpeggioTrackNameMap[trackName] = track;
- }
- });
- }
- var arpeggiosTrackNames = arpeggioDict.keys.toList();
- var drumsTrackNames = drumsDict.keys.toList();
- Future<MidiFile> loadMidi(String name) async {
- Directory tempDir = await getTemporaryDirectory();
- String tempPath = tempDir.path;
- File tempFile = File('$tempPath/$name');
- ByteData bd = await rootBundle.load('assets/$name');
- await tempFile.writeAsBytes(bd.buffer.asUint8List(), flush: true);
- return MidiParser().parseMidiFromFile(tempFile);
- }
- Future<List<int>> progressionToModiBuffer(List<Chord> chords, String arpeggioName,
- String drumPatternName, int bpm) async {
- List<MidiEvent> arpeggioTrack = [];
- var arpeggios = await loadMidi('arpeggios.mid');
- var arpeggio = arpeggios.tracks.firstWhere((track) {
- return track
- .any((event) => event is TrackNameEvent && event.text == arpeggioName);
- });
- chords.asMap().forEach((index, value) {
- arpeggio.forEach((f) {
- if (f is NoteOnEvent) {
- var newEvent = NoteOnEvent()
- ..deltaTime = f.deltaTime
- ..channel = 0
- ..velocity = f.velocity
- ..noteNumber = mapMidiToChord(f.noteNumber, value);
- arpeggioTrack.add(newEvent);
- } else if (f is NoteOffEvent) {
- var newEvent = NoteOffEvent()
- ..deltaTime = f.deltaTime
- ..channel = 0
- ..velocity = f.velocity
- ..noteNumber = mapMidiToChord(f.noteNumber, value);
- arpeggioTrack.add(newEvent);
- } else if (f is TrackNameEvent && index == 0) {
- arpeggioTrack.add(f);
- }
- });
- });
- arpeggioTrack.add(endOfTrackEvent);
- var tracks = [getDefaultMidiTempoTrack(bpm), arpeggioTrack];
- if (drumPatternName != "none") {
- List<MidiEvent> drumsTrack = [];
- var drums = await loadMidi('drums.mid');
- var drum = drums.tracks.firstWhere((track) {
- return track.any(
- (event) => event is TrackNameEvent && event.text == drumPatternName);
- });
- drum.forEach((f) {
- if (f is NoteOnEvent) {
- var newEvent = NoteOnEvent()
- ..deltaTime = f.deltaTime
- ..channel = 9 // Drums magic
- ..velocity = f.velocity
- ..noteNumber = f.noteNumber;
- drumsTrack.add(newEvent);
- } else if (f is NoteOffEvent) {
- var newEvent = NoteOffEvent()
- ..deltaTime = f.deltaTime
- ..channel = 9 // Drums magic
- ..velocity = f.velocity
- ..noteNumber = f.noteNumber;
- drumsTrack.add(newEvent);
- } else if (f is TrackNameEvent) {
- drumsTrack.add(f);
- }
- });
- drumsTrack.add(endOfTrackEvent);
- tracks.add(drumsTrack);
- }
- return MidiWriter().writeMidiToBuffer(MidiFile(tracks, defaultMidiHeader), running: true);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement