Skip to content

Commit 1cba82b

Browse files
committed
feat: add Track.absoluteTimeAt and Track.abolusteTimeDiff
1 parent 035a563 commit 1cba82b

File tree

2 files changed

+48
-3
lines changed

2 files changed

+48
-3
lines changed

lib/src/midi/track.dart

+35-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,34 @@
11
import 'package:collection/collection.dart';
22
import 'package:tekartik_midi/midi.dart';
33

4+
/// A track event contains a list of events
45
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+
}
632

733
@override
834
int get hashCode {
@@ -17,8 +43,10 @@ class MidiTrack {
1743
return false;
1844
}
1945

46+
/// Debug dump events
2047
void dump() {
2148
for (var e in events) {
49+
// ignore: avoid_print
2250
print(e);
2351
}
2452
}
@@ -33,21 +61,25 @@ class MidiTrack {
3361
return out.toString();
3462
}
3563

64+
/// Add an event
3665
void addEvent(int deltaTime, MidiEvent midiEvent) {
3766
events.add(TrackEvent(deltaTime, midiEvent));
3867
}
3968

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) {
4172
var time = 0;
4273
for (var i = 0; i < events.length; i++) {
4374
var event = events[i];
4475
final newTime = time + event.deltaTime;
4576
if (absoluteTime < newTime) {
4677
events.insert(i, TrackEvent(absoluteTime - time, midiEvent));
47-
return;
78+
return i;
4879
}
4980
time = newTime;
5081
}
5182
events.add(TrackEvent(absoluteTime - time, midiEvent));
83+
return events.length - 1;
5284
}
5385
}

test/track_test.dart

+13
Original file line numberDiff line numberDiff line change
@@ -48,5 +48,18 @@ void main() {
4848
expect((track.events[1].midiEvent as TempoEvent).tempo, 2);
4949
expect(track.events.length, 2);
5050
});
51+
52+
test('absoluteTime', () {
53+
final track = MidiTrack();
54+
track.addEvent(10, TempoEvent(1));
55+
track.addEvent(25, TempoEvent(2));
56+
track.addEvent(30, TempoEvent(3));
57+
expect(track.absoluteTimeAt(0), 10);
58+
expect(track.absoluteTimeAt(2), 65);
59+
expect(track.absoluteTimeDiff(0, 1), -25);
60+
expect(track.absoluteTimeDiff(0, 2), -55);
61+
expect(track.absoluteTimeDiff(1, 2), -30);
62+
expect(track.absoluteTimeDiff(2, 1), 30);
63+
});
5164
});
5265
}

0 commit comments

Comments
 (0)