Skip to content

Commit 26f2fcd

Browse files
authored
Merge pull request #9 from jcavar/develop
Fix incorrect sorting of certain sequences
2 parents c155f17 + 821ff1c commit 26f2fcd

File tree

2 files changed

+53
-6
lines changed

2 files changed

+53
-6
lines changed

Sources/AudioKitEX/Sequencing/Sequence.swift

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,9 @@ extension Array where Element == SequenceEvent {
4040
return self.sorted(by: { (event1:SequenceEvent, event2:SequenceEvent) -> Bool in
4141
let event1Beat = event1.beat
4242
let event2Beat = event2.beat
43-
let simultaneous = (event1Beat == event2Beat) && (event1.data1 == event2.data1)
44-
if isNoteOn(event1.status) && isNoteOff(event2.status) && simultaneous {
45-
return false
46-
}
47-
if isNoteOff(event1.status) && isNoteOn(event2.status) && simultaneous {
48-
return true
43+
if event1Beat == event2Beat {
44+
if isNoteOn(event1.status) && isNoteOff(event2.status) { return false }
45+
if isNoteOff(event1.status) && isNoteOn(event2.status) { return true }
4946
}
5047
return event1Beat < event2Beat
5148
})

Tests/AudioKitEXTests/SequenceTests.swift

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,5 +52,55 @@ class NoteEventSequenceTests: XCTestCase {
5252
XCTAssertEqual(seq.notes[1].noteOn.data1, 62)
5353
}
5454

55+
func testNoteOffAlwaysBeforeNoteOnInBeatTimeOrdered() {
56+
let noteOn = SequenceEvent(status: noteOnByte, data1: 60, data2: 0, beat: 0)
57+
let noteOff = SequenceEvent(status: noteOffByte, data1: 60, data2: 0, beat: 0)
58+
let otherNoteOn = SequenceEvent(status: noteOnByte, data1: 61, data2: 0, beat: 0)
59+
60+
let sequences = [
61+
[noteOn, noteOff, otherNoteOn],
62+
[noteOn, otherNoteOn, noteOff],
63+
[noteOff, noteOn , otherNoteOn],
64+
[noteOff, otherNoteOn, noteOn],
65+
[otherNoteOn, noteOn, noteOff],
66+
[otherNoteOn, noteOff, noteOn]
67+
]
68+
69+
for sequence in sequences {
70+
let ordered = sequence.beatTimeOrdered()
71+
XCTAssertLessThan(ordered.firstIndex(of: noteOff)!, ordered.firstIndex(of: noteOn)!)
72+
}
73+
}
74+
75+
func testEarlierNoteBeforeInBeatTimeOrderedForSameNoteSameStatus() {
76+
let earlier = SequenceEvent(status: noteOnByte, data1: 60, data2: 0, beat: 0)
77+
let later = SequenceEvent(status: noteOnByte, data1: 60, data2: 0, beat: 1)
78+
79+
let sequences = [
80+
[earlier, later],
81+
[later, earlier],
82+
]
83+
84+
for sequence in sequences {
85+
let ordered = sequence.beatTimeOrdered()
86+
XCTAssertLessThan(ordered.firstIndex(of: earlier)!, ordered.firstIndex(of: later)!)
87+
}
88+
}
89+
90+
func testEarlierNoteBeforeInBeatTimeOrderedForSameNoteDifferentStatus() {
91+
let earlier = SequenceEvent(status: noteOnByte, data1: 60, data2: 0, beat: 0)
92+
let later = SequenceEvent(status: noteOffByte, data1: 60, data2: 0, beat: 1)
93+
94+
let sequences = [
95+
[earlier, later],
96+
[later, earlier],
97+
]
98+
99+
for sequence in sequences {
100+
let ordered = sequence.beatTimeOrdered()
101+
XCTAssertLessThan(ordered.firstIndex(of: earlier)!, ordered.firstIndex(of: later)!)
102+
}
103+
}
104+
55105
}
56106
#endif

0 commit comments

Comments
 (0)