1
1
import 'package:collection/collection.dart' ;
2
2
import 'package:tekartik_midi/midi.dart' ;
3
3
4
+ /// A track event contains a list of events
4
5
class MidiTrack {
5
- List <TrackEvent > events = [];
6
+ /// List of events, do not modify directly
7
+ List <TrackEvent > get events => _events;
8
+ final _events = < TrackEvent > [];
9
+
10
+ /// Get the time of an event at a given index
11
+ /// It unfortunately requires to go through all events
12
+ int absoluteTimeAt (int index) {
13
+ var time = 0 ;
14
+ for (var i = 0 ; i <= index; i++ ) {
15
+ time += events[i].deltaTime;
16
+ }
17
+ return time;
18
+ }
19
+
20
+ /// Get the time difference between two events
21
+ /// if (index1 <= index2) similarly to compare the result will be negative
22
+ int absoluteTimeDiff (int index1, int index2) {
23
+ if (index1 <= index2) {
24
+ var time = 0 ;
25
+ for (var i = index1 + 1 ; i <= index2; i++ ) {
26
+ time -= events[i].deltaTime;
27
+ }
28
+ return time;
29
+ }
30
+ return - absoluteTimeDiff (index2, index1);
31
+ }
6
32
7
33
@override
8
34
int get hashCode {
@@ -17,8 +43,10 @@ class MidiTrack {
17
43
return false ;
18
44
}
19
45
46
+ /// Debug dump events
20
47
void dump () {
21
48
for (var e in events) {
49
+ // ignore: avoid_print
22
50
print (e);
23
51
}
24
52
}
@@ -33,21 +61,25 @@ class MidiTrack {
33
61
return out.toString ();
34
62
}
35
63
64
+ /// Add an event
36
65
void addEvent (int deltaTime, MidiEvent midiEvent) {
37
66
events.add (TrackEvent (deltaTime, midiEvent));
38
67
}
39
68
40
- void addAbsolutionEvent (int absoluteTime, MidiEvent midiEvent) {
69
+ /// Add an event at an absolute time
70
+ /// return its index
71
+ int addAbsolutionEvent (int absoluteTime, MidiEvent midiEvent) {
41
72
var time = 0 ;
42
73
for (var i = 0 ; i < events.length; i++ ) {
43
74
var event = events[i];
44
75
final newTime = time + event.deltaTime;
45
76
if (absoluteTime < newTime) {
46
77
events.insert (i, TrackEvent (absoluteTime - time, midiEvent));
47
- return ;
78
+ return i ;
48
79
}
49
80
time = newTime;
50
81
}
51
82
events.add (TrackEvent (absoluteTime - time, midiEvent));
83
+ return events.length - 1 ;
52
84
}
53
85
}
0 commit comments