Skip to content

Commit

Permalink
Merge pull request #150 from jmamma/pattern_virtual_fix
Browse files Browse the repository at this point in the history
fix ElektronPattern implementation virtual methods, fix SDDrive read
  • Loading branch information
jmamma authored Dec 20, 2020
2 parents 6c748d6 + a679723 commit e0d2564
Show file tree
Hide file tree
Showing 9 changed files with 146 additions and 121 deletions.
4 changes: 1 addition & 3 deletions avr/cores/megacommand/A4/A4Pattern.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,11 @@ class A4Pattern : public ElektronPattern {

uint8_t data[8];

A4Pattern() : ElektronPattern() {
A4Pattern(bool _init = true) : ElektronPattern(_init) {
maxSteps = 64;
maxParams = 24;
maxTracks = 16;
maxLocks = 64;

init();
}

/* XXX TODO extra pattern 64 */
Expand Down
6 changes: 4 additions & 2 deletions avr/cores/megacommand/Elektron/ElektronPattern.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,14 @@ class ElektronPattern: public ElektronSysexObject {
int8_t lockTracks[64];
int8_t lockParams[64];

ElektronPattern() {
ElektronPattern(bool _init) {
maxParams = 0;
maxTracks = 0;
maxSteps = 0;
maxLocks = 0;
clearPattern();
if (_init) {
init();
}
}

/** Clear the pattern. */
Expand Down
9 changes: 9 additions & 0 deletions avr/cores/megacommand/MCL/MCLSd.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

#include "SdFat.h"
#include "new.h"
#include "type_traits.h"

#define SD_MAX_RETRIES 5

Expand All @@ -23,10 +24,18 @@ class MCLSd {
::new(data)T;
return ret;
}
/// Specialization for ElektronPattern...
template <class T> bool read_data_v_noinit(T *data, FatFile *filep) {
auto ret = read_data(data, sizeof(T), filep);
::new(data)T(false);
return ret;
}

/// save data to SD card, including the vtable
template <class T> bool write_data_v(T *data, FatFile *filep) {
return write_data(data, sizeof(T), filep);
}

};

extern MCLSd mcl_sd;
Expand Down
2 changes: 1 addition & 1 deletion avr/cores/megacommand/MCL/SDDrivePage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ void SDDrivePage::load_snapshot() {
for (int i = 0; i < 128; ++i) {
progress_i = i;
mcl_gui.draw_progress("Loading pattern", i, 128);
if (!mcl_sd.read_data_v<MDPattern>(&MD.pattern, &file)) {
if (!mcl_sd.read_data_v_noinit<MDPattern>(&MD.pattern, &file)) {
goto load_error;
}
MD.setSysexRecPos(8, i);
Expand Down
14 changes: 11 additions & 3 deletions avr/cores/megacommand/MD/MDMessages.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,11 @@ bool MDGlobal::fromSysex(uint8_t *data, uint16_t len) {

decoder.get8(&baseChannel);
decoder.get8(&unused);
decoder.get16(&tempo);
uint8_t tempo_lower;
uint8_t tempo_upper;
decoder.get8(&tempo_upper);
decoder.get8(&tempo_lower);
tempo = (tempo_upper << 7 ) | tempo_lower;
decoder.getb(&extendedMode);

uint8_t byte = 0;
Expand Down Expand Up @@ -108,7 +112,11 @@ bool MDGlobal::fromSysex(MidiClass *midi) {

decoder.get8(&baseChannel);
decoder.get8(&unused);
decoder.get16(&tempo);
uint8_t tempo_lower;
uint8_t tempo_upper;
decoder.get8(&tempo_upper);
decoder.get8(&tempo_lower);
tempo = (tempo_upper << 7 ) | tempo_lower;
decoder.getb(&extendedMode);

uint8_t byte = 0;
Expand Down Expand Up @@ -470,7 +478,7 @@ bool MDSong::fromSysex(uint8_t *data, uint16_t len) {
decoder.start7Bit();
decoder.get((uint8_t *)&rows[i], 4);
decoder.get16(&rows[i].mutes);
decoder.get16(&rows[i].tempo);
decoder.get16(&rows[i].tempo); // different from MDGlobal tempo, this is 7bit encoded
decoder.get(&rows[i].startPosition, 2);
decoder.stop7Bit();
}
Expand Down
6 changes: 4 additions & 2 deletions avr/cores/megacommand/MD/MDMessages.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,7 @@ class MDGlobal: public ElektronSysexObject {
uint8_t programChange;
uint8_t trigMode;

MDGlobal() {
}
MDGlobal() : ElektronSysexObject() {};

virtual uint8_t getPosition() { return origPosition; }
virtual void setPosition(uint8_t pos) { origPosition = pos; }
Expand Down Expand Up @@ -198,6 +197,7 @@ class MDKit: public ElektronSysexObject {
**/

public:

uint8_t origPosition;
char name[17];

Expand All @@ -224,6 +224,8 @@ class MDKit: public ElektronSysexObject {
/** The mute group selected for each track (255: OFF). **/
uint8_t muteGroups[16];

MDKit(): ElektronSysexObject() {}

virtual bool fromSysex(uint8_t *sysex, uint16_t len);
virtual bool fromSysex(MidiClass *midi);
virtual uint16_t toSysex(uint8_t *sysex, uint16_t len);
Expand Down
67 changes: 33 additions & 34 deletions avr/cores/megacommand/MD/MDPattern.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,6 @@ class MDPattern : public ElektronPattern {
public:
uint8_t origPosition;

uint8_t getPosition() { return origPosition; }
void setPosition(uint8_t _pos) { origPosition = _pos; }

/* SUPER IMPORTANT DO NOT CHANGE THE ORDER OF DECLARATION OF THESE VARIABLES
*/

Expand Down Expand Up @@ -64,12 +61,6 @@ class MDPattern : public ElektronPattern {
uint8_t kit;
uint8_t numLockedRows; // unused

uint8_t getKit() { return kit; }
void setKit(uint8_t _kit) { kit = _kit; }

uint8_t getLength() { return patternLength; }
void setLength(uint8_t _len) { patternLength = _len; }

uint32_t accentEditAll;
uint32_t slideEditAll;
uint32_t swingEditAll;
Expand All @@ -79,49 +70,57 @@ class MDPattern : public ElektronPattern {

uint8_t numRows;
int8_t paramLocks[16][24];
int8_t getLockIdx(uint8_t track, uint8_t param) {
return paramLocks[track][param];
}
void setLockIdx(uint8_t track, uint8_t param, int8_t value) {
paramLocks[track][param] = value;
}

bool isExtraPattern;

MDPattern() : ElektronPattern() {
/** ElektronPattern implementation */

virtual uint8_t getPosition() { return origPosition; }
virtual void setPosition(uint8_t _pos) { origPosition = _pos; }

virtual uint8_t getLength() { return patternLength; }
virtual void setLength(uint8_t _len) { patternLength = _len; }

virtual uint8_t getKit() { return kit; }
virtual void setKit(uint8_t _kit) { kit = _kit; }

virtual bool isTrackEmpty(uint8_t track);
virtual bool isTrigSet(uint8_t track, uint8_t trig) { return IS_BIT_SET64(trigPatterns[track], trig); }

virtual void clearPattern();
virtual void clearTrack(uint8_t track);

virtual void setTrig(uint8_t track, uint8_t trig) { SET_BIT64(trigPatterns[track], trig); }
virtual void setNote(uint8_t track, uint8_t step, uint8_t pitch);
virtual void clearTrig(uint8_t track, uint8_t trig);

virtual int8_t getLockIdx(uint8_t track, uint8_t param) { return paramLocks[track][param]; }
virtual void setLockIdx(uint8_t track, uint8_t param, int8_t value) { paramLocks[track][param] = value; }

virtual void recalculateLockPatterns();

/** ElektronSysexObject implementation */
virtual bool fromSysex(uint8_t *sysex, uint16_t len);
virtual bool fromSysex(MidiClass *midi);
virtual uint16_t toSysex(uint8_t *sysex, uint16_t len);
virtual uint16_t toSysex(ElektronDataToSysexEncoder *encoder);

MDPattern(bool _init = true) : ElektronPattern(_init) {
maxSteps = 64;
maxParams = 24;
maxTracks = 16;
maxLocks = 64;

isExtraPattern = false;
init();
}

/* XXX TODO extra pattern 64 */

virtual bool fromSysex(uint8_t *sysex, uint16_t len);
virtual bool fromSysex(MidiClass *midi);
virtual uint16_t toSysex(uint8_t *sysex, uint16_t len);
virtual uint16_t toSysex(ElektronDataToSysexEncoder *encoder);
uint16_t toSysex();

bool isTrackEmpty(uint8_t track);

void clear_step_locks(uint8_t track, uint8_t step);
void clearPattern();
void clearTrack(uint8_t track);

void clearTrig(uint8_t track, uint8_t trig);
inline void setTrig(uint8_t track, uint8_t trig) {
SET_BIT64(trigPatterns[track], trig);
}
inline bool isTrigSet(uint8_t track, uint8_t trig) {
return IS_BIT_SET64(trigPatterns[track], trig);
}
void setNote(uint8_t track, uint8_t step, uint8_t pitch);

virtual void recalculateLockPatterns();

/**
* Swap two tracks of the patterns by copying hits, param locks and
Expand Down
Loading

0 comments on commit e0d2564

Please sign in to comment.