128 lines
2.8 KiB
C++
128 lines
2.8 KiB
C++
#include "note.h"
|
|
|
|
const uint8_t get_octave_from_wholenote(const uint8_t wholenote) {
|
|
return wholenote == 0 ? 0 : 2+int((wholenote-1)/12);
|
|
}
|
|
const uint8_t get_note_from_wholenote(const uint8_t wholenote) {
|
|
return wholenote == 0 ? 0 : (wholenote-1)%12;
|
|
}
|
|
|
|
Note::Note() {
|
|
note = octave = instrument = effect = 0;
|
|
volume = 2;
|
|
}
|
|
|
|
Note::Note(const uint16_t note) {
|
|
this->Set(note);
|
|
}
|
|
|
|
Note::Note(const uint8_t note, const uint8_t instrument, const uint8_t volume, const uint8_t effect) {
|
|
this->note = note;
|
|
this->instrument = instrument;
|
|
this->volume = volume;
|
|
this->effect = effect;
|
|
|
|
this->octave = get_octave_from_wholenote(this->note);
|
|
this->note = get_note_from_wholenote(this->note);
|
|
}
|
|
|
|
Note::Note(const uint8_t note, const uint8_t octave, const uint8_t instrument, const uint8_t volume, const uint8_t effect) {
|
|
this->note = note;
|
|
this->octave = octave;
|
|
this->instrument = instrument;
|
|
this->volume = volume;
|
|
this->effect = effect;
|
|
}
|
|
|
|
|
|
void Note::Set(const uint16_t note) {
|
|
this->note = note >> 10;
|
|
this->instrument = (note >> 8) & 0x3;
|
|
this->volume = (note >> 4) & 0xf;
|
|
this->effect = note & 0xf;
|
|
|
|
this->octave = get_octave_from_wholenote(this->note);
|
|
this->note = get_note_from_wholenote(this->note);
|
|
}
|
|
|
|
void Note::SetAbsoluteNote(const uint8_t note) {
|
|
this->octave = get_octave_from_wholenote(note);
|
|
this->note = get_note_from_wholenote(note);
|
|
}
|
|
|
|
void Note::SetNote(const uint8_t note) {
|
|
this->note = note;
|
|
}
|
|
|
|
void Note::SetFirstNote(const uint8_t note, const uint8_t octave, const uint8_t instrument, const uint8_t volume, const uint8_t effect) {
|
|
if (GetAbsoluteNote() == 0) {
|
|
this->octave = octave;
|
|
this->instrument = instrument;
|
|
this->volume = volume;
|
|
this->effect = effect;
|
|
}
|
|
this->note = note;
|
|
}
|
|
|
|
void Note::SetSilence() {
|
|
this->note = 63;
|
|
this->octave = 0;
|
|
this->instrument = 0;
|
|
this->volume = 0;
|
|
this->effect = 0;
|
|
}
|
|
|
|
void Note::SetOctave(const uint8_t octave) {
|
|
this->octave = octave;
|
|
}
|
|
|
|
void Note::SetInstrument(const uint8_t instrument) {
|
|
this->instrument = instrument;
|
|
}
|
|
|
|
void Note::SetVolume(const uint8_t volume) {
|
|
this->volume = volume;
|
|
}
|
|
|
|
void Note::SetEffect(const uint8_t effect) {
|
|
this->effect = effect;
|
|
}
|
|
|
|
|
|
const uint16_t Note::Get() {
|
|
uint16_t result = (this->GetAbsoluteNote() << 10) + (this->instrument << 8) + (this->volume << 4) + this->effect;
|
|
return result;
|
|
}
|
|
|
|
const uint8_t Note::GetAbsoluteNote() {
|
|
if ((this->note == 0) && (this->octave == 0)) {
|
|
return 0;
|
|
} else if (this->note == 63) {
|
|
return 63;
|
|
} else {
|
|
uint8_t result = ((this->octave-2)*12)+this->note+1;
|
|
return result;
|
|
}
|
|
|
|
}
|
|
|
|
const uint8_t Note::GetNote() {
|
|
return this->note;
|
|
}
|
|
|
|
const uint8_t Note::GetOctave() {
|
|
return this->octave;
|
|
}
|
|
|
|
const uint8_t Note::GetInstrument() {
|
|
return this->instrument;
|
|
}
|
|
|
|
const uint8_t Note::GetVolume() {
|
|
return this->volume;
|
|
}
|
|
|
|
const uint8_t Note::GetEffect() {
|
|
return this->effect;
|
|
}
|