Skip to content

Commit 3175294

Browse files
committed
Record count in grace quarter note
1 parent df300d6 commit 3175294

File tree

2 files changed

+21
-3
lines changed

2 files changed

+21
-3
lines changed

Applications/Sequencer/NotePad.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,9 @@ void SequencerNotePad::SequencerEvent(const MidiPacket& packet)
279279
uint8_t track = sequencer->track;
280280
uint8_t stepsSelected = sequencer->stepSelected.size();
281281

282-
if (sequencer->sequence.Playing(track) &&
282+
bool sequenceRunning = sequencer->sequence.Playing(track) ||
283+
(sequencer->sequence.Playing() && sequencer->sequence.GetClocksTillStart() > 0);
284+
if (sequenceRunning &&
283285
sequencer->sequence.RecordEnabled() &&
284286
sequencer->sequence.ShouldRecord(track) &&
285287
stepsSelected == 0

Applications/Sequencer/Sequence.cpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)