@@ -1502,6 +1502,13 @@ void Sequence::RecordEvent(MidiPacket packet, uint8_t track)
15021502 return ;
15031503 }
15041504
1505+ const uint16_t recordGraceClocks = 24 ; // one Quartter Note
1506+ bool isCountIn = clocksTillStart > 0 ;
1507+ bool clampToStart = isCountIn && clocksTillStart <= recordGraceClocks;
1508+ if (isCountIn && !clampToStart) {
1509+ return ;
1510+ }
1511+
15051512 std::vector<uint8_t > targets;
15061513 if (track == 0xFF )
15071514 {
@@ -1532,7 +1539,16 @@ void Sequence::RecordEvent(MidiPacket packet, uint8_t track)
15321539
15331540 SequencePattern* pattern = GetPattern (t, clipIdx, patIdx);
15341541 if (!pattern) continue ;
1535- uint32_t currentTick = trackPlayback[t].position .step * pulsesPerStep + trackPlayback[t].position .pulse ;
1542+ uint32_t currentTick = 0 ;
1543+ uint16_t pulse = trackPlayback[t].position .pulse ;
1544+ if (pulse == UINT16_MAX) {
1545+ pulse = 0 ;
1546+ }
1547+ if (clampToStart) {
1548+ currentTick = trackPlayback[t].position .step * pulsesPerStep;
1549+ } else {
1550+ currentTick = trackPlayback[t].position .step * pulsesPerStep + pulse;
1551+ }
15361552 auto & pending = trackPlayback[t].recordedNotes ;
15371553
15381554 if (status == EMidiStatus::NoteOn && velocity > 0 )
@@ -1567,7 +1583,7 @@ void Sequence::RecordEvent(MidiPacket packet, uint8_t track)
15671583 evRef.recordLayer = currentRecordLayer;
15681584 }
15691585 Sequence::TrackPlayback::RecordedNote info;
1570- info.startPulse = pulseSinceStart;
1586+ info.startPulse = clampToStart ? 0 : pulseSinceStart;
15711587 info.eventPtr = &evRef;
15721588 pending[note] = info;
15731589 dirty = true ;
0 commit comments