660 |
// release voices on this key if needed |
// release voices on this key if needed |
661 |
if (pKey->Active && !pEngineChannel->SustainPedal) { |
if (pKey->Active && !pEngineChannel->SustainPedal) { |
662 |
itNoteOffEvent->Type = Event::type_release; // transform event type |
itNoteOffEvent->Type = Event::type_release; // transform event type |
|
} |
|
663 |
|
|
664 |
// move event to the key's own event list |
// move event to the key's own event list |
665 |
RTList<Event>::Iterator itNoteOffEventOnKeyList = itNoteOffEvent.moveToEndOf(pKey->pEvents); |
RTList<Event>::Iterator itNoteOffEventOnKeyList = itNoteOffEvent.moveToEndOf(pKey->pEvents); |
666 |
|
|
667 |
// spawn release triggered voice(s) if needed |
// spawn release triggered voice(s) if needed |
668 |
if (pKey->ReleaseTrigger) { |
if (pKey->ReleaseTrigger) { |
669 |
// first, get total amount of required voices (dependant on amount of layers) |
// first, get total amount of required voices (dependant on amount of layers) |
670 |
::gig::Region* pRegion = pEngineChannel->pInstrument->GetRegion(itNoteOffEventOnKeyList->Param.Note.Key); |
::gig::Region* pRegion = pEngineChannel->pInstrument->GetRegion(itNoteOffEventOnKeyList->Param.Note.Key); |
671 |
if (pRegion) { |
if (pRegion) { |
672 |
int voicesRequired = pRegion->Layers; |
int voicesRequired = pRegion->Layers; |
673 |
// now launch the required amount of voices |
// now launch the required amount of voices |
674 |
for (int i = 0; i < voicesRequired; i++) |
for (int i = 0; i < voicesRequired; i++) |
675 |
LaunchVoice(pEngineChannel, itNoteOffEventOnKeyList, i, true, false); //FIXME: for the moment we don't perform voice stealing for release triggered samples |
LaunchVoice(pEngineChannel, itNoteOffEventOnKeyList, i, true, false); //FIXME: for the moment we don't perform voice stealing for release triggered samples |
676 |
} |
} |
677 |
pKey->ReleaseTrigger = false; |
pKey->ReleaseTrigger = false; |
678 |
|
} |
679 |
|
|
680 |
|
// if neither a voice was spawned or postponed then remove note off event from key again |
681 |
|
if (!pKey->Active && !pKey->VoiceTheftsQueued) |
682 |
|
pKey->pEvents->free(itNoteOffEventOnKeyList); |
683 |
} |
} |
|
|
|
|
// if neither a voice was spawned or postponed then remove note off event from key again |
|
|
if (!pKey->Active && !pKey->VoiceTheftsQueued) |
|
|
pKey->pEvents->free(itNoteOffEventOnKeyList); |
|
684 |
} |
} |
685 |
|
|
686 |
/** |
/** |
1027 |
|
|
1028 |
switch (id) { |
switch (id) { |
1029 |
case 0x41: { // Roland |
case 0x41: { // Roland |
1030 |
|
dmsg(3,("Roland Sysex\n")); |
1031 |
uint8_t device_id, model_id, cmd_id; |
uint8_t device_id, model_id, cmd_id; |
1032 |
if (!reader.pop(&device_id)) goto free_sysex_data; |
if (!reader.pop(&device_id)) goto free_sysex_data; |
1033 |
if (!reader.pop(&model_id)) goto free_sysex_data; |
if (!reader.pop(&model_id)) goto free_sysex_data; |
1040 |
const RingBuffer<uint8_t>::NonVolatileReader checksum_reader = reader; // so we can calculate the check sum later |
const RingBuffer<uint8_t>::NonVolatileReader checksum_reader = reader; // so we can calculate the check sum later |
1041 |
if (reader.read(&addr[0], 3) != 3) goto free_sysex_data; |
if (reader.read(&addr[0], 3) != 3) goto free_sysex_data; |
1042 |
if (addr[0] == 0x40 && addr[1] == 0x00) { // System Parameters |
if (addr[0] == 0x40 && addr[1] == 0x00) { // System Parameters |
1043 |
|
dmsg(3,("\tSystem Parameter\n")); |
1044 |
} |
} |
1045 |
else if (addr[0] == 0x40 && addr[1] == 0x01) { // Common Parameters |
else if (addr[0] == 0x40 && addr[1] == 0x01) { // Common Parameters |
1046 |
|
dmsg(3,("\tCommon Parameter\n")); |
1047 |
} |
} |
1048 |
else if (addr[0] == 0x40 && (addr[1] & 0xf0) == 0x10) { // Part Parameters (1) |
else if (addr[0] == 0x40 && (addr[1] & 0xf0) == 0x10) { // Part Parameters (1) |
1049 |
switch (addr[3]) { |
dmsg(3,("\tPart Parameter\n")); |
1050 |
|
switch (addr[2]) { |
1051 |
case 0x40: { // scale tuning |
case 0x40: { // scale tuning |
1052 |
|
dmsg(3,("\t\tScale Tuning\n")); |
1053 |
uint8_t scale_tunes[12]; // detuning of all 12 semitones of an octave |
uint8_t scale_tunes[12]; // detuning of all 12 semitones of an octave |
1054 |
if (reader.read(&scale_tunes[0], 12) != 12) goto free_sysex_data; |
if (reader.read(&scale_tunes[0], 12) != 12) goto free_sysex_data; |
1055 |
uint8_t checksum; |
uint8_t checksum; |
1056 |
if (!reader.pop(&checksum)) goto free_sysex_data; |
if (!reader.pop(&checksum)) goto free_sysex_data; |
1057 |
if (GSCheckSum(checksum_reader, 12) != checksum) goto free_sysex_data; |
// some are not sending a GS checksum, so we ignore it for now |
1058 |
|
//if (GSCheckSum(checksum_reader, 12)) goto free_sysex_data; |
1059 |
for (int i = 0; i < 12; i++) scale_tunes[i] -= 64; |
for (int i = 0; i < 12; i++) scale_tunes[i] -= 64; |
1060 |
AdjustScale((int8_t*) scale_tunes); |
AdjustScale((int8_t*) scale_tunes); |
1061 |
|
dmsg(3,("\t\t\tNew scale applied.\n")); |
1062 |
break; |
break; |
1063 |
} |
} |
1064 |
} |
} |
1191 |
} |
} |
1192 |
|
|
1193 |
String Engine::EngineName() { |
String Engine::EngineName() { |
1194 |
return "GigEngine"; |
return LS_GIG_ENGINE_NAME; |
1195 |
} |
} |
1196 |
|
|
1197 |
String Engine::Description() { |
String Engine::Description() { |
1199 |
} |
} |
1200 |
|
|
1201 |
String Engine::Version() { |
String Engine::Version() { |
1202 |
String s = "$Revision: 1.33 $"; |
String s = "$Revision: 1.36 $"; |
1203 |
return s.substr(11, s.size() - 13); // cut dollar signs, spaces and CVS macro keyword |
return s.substr(11, s.size() - 13); // cut dollar signs, spaces and CVS macro keyword |
1204 |
} |
} |
1205 |
|
|