/[svn]/linuxsampler/trunk/src/engines/EngineBase.h
ViewVC logotype

Diff of /linuxsampler/trunk/src/engines/EngineBase.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3696 by schoenebeck, Sat Jan 4 11:30:38 2020 UTC revision 3697 by schoenebeck, Sat Jan 4 12:09:45 2020 UTC
# Line 885  namespace LinuxSampler { Line 885  namespace LinuxSampler {
885                      RTList<Event>::Iterator itEvent = pChannel->pEvents->first();                      RTList<Event>::Iterator itEvent = pChannel->pEvents->first();
886                      RTList<Event>::Iterator end     = pChannel->pEvents->end();                      RTList<Event>::Iterator end     = pChannel->pEvents->end();
887                      for (; itEvent != end; ++itEvent) {                      for (; itEvent != end; ++itEvent) {
888                            bool bIsCC = false; // just for resetting RPN/NRPN below
889                          switch (itEvent->Type) {                          switch (itEvent->Type) {
890                              case Event::type_note_on:                              case Event::type_note_on:
891                                  dmsg(5,("Engine: Note on received\n"));                                  dmsg(5,("Engine: Note on received\n"));
# Line 909  namespace LinuxSampler { Line 910  namespace LinuxSampler {
910                              case Event::type_control_change:                              case Event::type_control_change:
911                                  dmsg(5,("Engine: MIDI CC received\n"));                                  dmsg(5,("Engine: MIDI CC received\n"));
912                                  ProcessControlChange((EngineChannel*)itEvent->pEngineChannel, itEvent);                                  ProcessControlChange((EngineChannel*)itEvent->pEngineChannel, itEvent);
913                                    bIsCC = true;
914                                  break;                                  break;
915                              case Event::type_rpn: // this can only be reached here by an instrument script having called set_rpn()                              case Event::type_rpn: // this can only be reached here by an instrument script having called set_rpn()
916                                  dmsg(5,("Engine: MIDI RPN received\n"));                                  dmsg(5,("Engine: MIDI RPN received\n"));
917                                  ProcessHardcodedRpn((EngineChannel*)itEvent->pEngineChannel, itEvent);                                  ProcessHardcodedRpn((EngineChannel*)itEvent->pEngineChannel, itEvent);
918                                    bIsCC = true;
919                                  break;                                  break;
920                              case Event::type_nrpn: // this can only be reached here by an instrument script having called set_nrpn()                              case Event::type_nrpn: // this can only be reached here by an instrument script having called set_nrpn()
921                                  dmsg(5,("Engine: MIDI NRPN received\n"));                                  dmsg(5,("Engine: MIDI NRPN received\n"));
922                                  ProcessHardcodedNrpn((EngineChannel*)itEvent->pEngineChannel, itEvent);                                  ProcessHardcodedNrpn((EngineChannel*)itEvent->pEngineChannel, itEvent);
923                                    bIsCC = true;
924                                  break;                                  break;
925                              case Event::type_channel_pressure:                              case Event::type_channel_pressure:
926                                  dmsg(5,("Engine: MIDI Chan. Pressure received\n"));                                  dmsg(5,("Engine: MIDI Chan. Pressure received\n"));
# Line 942  namespace LinuxSampler { Line 946  namespace LinuxSampler {
946                              case Event::type_release_note:                              case Event::type_release_note:
947                                  break; // noop                                  break; // noop
948                          }                          }
949                            // reset cached RPN/NRPN parameter number and data in
950                            // case this event was not a control change event
951                            if (!bIsCC) {
952                                if (pChannel->GetMidiRpnParameter() >= 0)
953                                    pChannel->ResetMidiRpnParameter();
954                                if (pChannel->GetMidiNrpnParameter() >= 0)
955                                    pChannel->ResetMidiNrpnParameter();
956                            }
957                      }                      }
958                  }                  }
959    
# Line 1487  namespace LinuxSampler { Line 1499  namespace LinuxSampler {
1499                  EngineChannelBase<V, R, I>* pChannel =                  EngineChannelBase<V, R, I>* pChannel =
1500                      static_cast<EngineChannelBase<V, R, I>*>(pEngineChannel);                      static_cast<EngineChannelBase<V, R, I>*>(pEngineChannel);
1501    
1502                    // will be set to true if this CC event has anything to do with RPN/NRPN
1503                    bool bIsRpn = false, bIsNrpn = false;
1504    
1505                  switch (itControlChangeEvent->Param.CC.Controller) {                  switch (itControlChangeEvent->Param.CC.Controller) {
1506                      case 5: { // portamento time                      case 5: { // portamento time
1507                          pChannel->PortamentoTime = (float) itControlChangeEvent->Param.CC.Value / 127.0f * (float) CONFIG_PORTAMENTO_TIME_MAX + (float) CONFIG_PORTAMENTO_TIME_MIN;                          pChannel->PortamentoTime = (float) itControlChangeEvent->Param.CC.Value / 127.0f * (float) CONFIG_PORTAMENTO_TIME_MAX + (float) CONFIG_PORTAMENTO_TIME_MIN;
# Line 1494  namespace LinuxSampler { Line 1509  namespace LinuxSampler {
1509                      }                      }
1510                      case 6: { // data entry (MSB)                      case 6: { // data entry (MSB)
1511                          //dmsg(1,("DATA ENTRY MSB %d\n", itControlChangeEvent->Param.CC.Value));                          //dmsg(1,("DATA ENTRY MSB %d\n", itControlChangeEvent->Param.CC.Value));
   
                         // look-ahead: if next MIDI event is data entry LSB,  
                         // then skip this event here for now (to avoid double  
                         // handling of what's supposed to be one RPN/NRPN event)  
                         if (isNextEventCCNr(itControlChangeEvent, 38))  
                             break;  
   
1512                          if (pChannel->GetMidiRpnParameter() >= 0) { // RPN parameter number was sent previously ...                          if (pChannel->GetMidiRpnParameter() >= 0) { // RPN parameter number was sent previously ...
1513                                pChannel->SetMidiRpnDataMsb(
1514                                    itControlChangeEvent->Param.CC.Value
1515                                );
1516                                bIsRpn = true;
1517    
1518                                // look-ahead: if next MIDI event is data entry LSB,
1519                                // then skip this event here for now (to avoid double
1520                                // handling of what's supposed to be one RPN event)
1521                                if (isNextEventCCNr(itControlChangeEvent, 38))
1522                                    break;
1523    
1524                              int ch = itControlChangeEvent->Param.CC.Channel;                              int ch = itControlChangeEvent->Param.CC.Channel;
1525                              int param = pChannel->GetMidiRpnParameter();                              int param = pChannel->GetMidiRpnParameter();
1526                              int value = itControlChangeEvent->Param.CC.Value << 7;                              int value = pChannel->GetMidiRpnData();
1527    
1528                              // transform event type: CC event -> RPN event                              // transform event type: CC event -> RPN event
1529                              itControlChangeEvent->Type = Event::type_rpn;                              itControlChangeEvent->Type = Event::type_rpn;
# Line 1523  namespace LinuxSampler { Line 1542  namespace LinuxSampler {
1542                                  );                                  );
1543                                  // if RPN event was dropped by script, abort                                  // if RPN event was dropped by script, abort
1544                                  // here to avoid hard coded RPN processing below                                  // here to avoid hard coded RPN processing below
1545                                  if (!pEventPool->fromID(eventID)) {                                  if (!pEventPool->fromID(eventID))
                                     // to prevent other data entry messages to be misenterpreted as RPN value  
                                     pChannel->ResetMidiRpnParameter();  
1546                                      break;                                      break;
                                 }  
1547                              }                              }
1548    
1549                              // do the actual (hard-coded) RPN value change processing                              // do the actual (hard-coded) RPN value change processing
1550                              ProcessHardcodedRpn(pEngineChannel, itControlChangeEvent);                              ProcessHardcodedRpn(pEngineChannel, itControlChangeEvent);
1551    
                             // to prevent other data entry messages to be misenterpreted as RPN value  
                             pChannel->ResetMidiRpnParameter();  
1552                          } else if (pChannel->GetMidiNrpnParameter() >= 0) { // NRPN parameter number was sent previously ...                          } else if (pChannel->GetMidiNrpnParameter() >= 0) { // NRPN parameter number was sent previously ...
1553                                pChannel->SetMidiNrpnDataMsb(
1554                                    itControlChangeEvent->Param.CC.Value
1555                                );
1556                                bIsNrpn = true;
1557    
1558                                // look-ahead: if next MIDI event is data entry LSB,
1559                                // then skip this event here for now (to avoid double
1560                                // handling of what's supposed to be one NRPN event)
1561                                if (isNextEventCCNr(itControlChangeEvent, 38))
1562                                    break;
1563    
1564                              int ch = itControlChangeEvent->Param.CC.Channel;                              int ch = itControlChangeEvent->Param.CC.Channel;
1565                              int param = pChannel->GetMidiNrpnParameter();                              int param = pChannel->GetMidiNrpnParameter();
1566                              int value = itControlChangeEvent->Param.CC.Value << 7;                              int value = pChannel->GetMidiNrpnData();
1567    
1568                              // transform event type: CC event -> NRPN event                              // transform event type: CC event -> NRPN event
1569                              itControlChangeEvent->Type = Event::type_nrpn;                              itControlChangeEvent->Type = Event::type_nrpn;
# Line 1557  namespace LinuxSampler { Line 1582  namespace LinuxSampler {
1582                                  );                                  );
1583                                  // if NRPN event was dropped by script, abort                                  // if NRPN event was dropped by script, abort
1584                                  // here to avoid hard coded NRPN processing below                                  // here to avoid hard coded NRPN processing below
1585                                  if (!pEventPool->fromID(eventID)) {                                  if (!pEventPool->fromID(eventID))
                                     // to prevent other data entry messages to be misenterpreted as NRPN value  
                                     pChannel->ResetMidiNrpnParameter();  
1586                                      break;                                      break;
                                 }  
1587                              }                              }
1588    
1589                              // do the actual (hard-coded) NRPN value change processing                              // do the actual (hard-coded) NRPN value change processing
1590                              ProcessHardcodedNrpn(pEngineChannel, itControlChangeEvent);                              ProcessHardcodedNrpn(pEngineChannel, itControlChangeEvent);
   
                             // to prevent other data entry messages to be misenterpreted as NRPN value  
                             pChannel->ResetMidiNrpnParameter();  
1591                          }                          }
1592                          break;                          break;
1593                      }                      }
# Line 1585  namespace LinuxSampler { Line 1604  namespace LinuxSampler {
1604                      }                      }
1605                      case 38: { // data entry (LSB)                      case 38: { // data entry (LSB)
1606                          //dmsg(1,("DATA ENTRY LSB %d\n", itControlChangeEvent->Param.CC.Value));                          //dmsg(1,("DATA ENTRY LSB %d\n", itControlChangeEvent->Param.CC.Value));
                         int value = 0;  
   
                         // look-back: if previous MIDI event was data entry MSB,  
                         // then obtain that value for the MSB value portion  
                         if (isPrevEventCCNr(itControlChangeEvent, 6))  
                             value = prevEventOf(itControlChangeEvent)->Param.CC.Value << 7;  
   
1607                          if (pChannel->GetMidiRpnParameter() >= 0) { // RPN parameter number was sent previously ...                          if (pChannel->GetMidiRpnParameter() >= 0) { // RPN parameter number was sent previously ...
1608                                pChannel->SetMidiRpnDataLsb(
1609                                    itControlChangeEvent->Param.CC.Value
1610                                );
1611                                bIsRpn = true;
1612    
1613                              int ch = itControlChangeEvent->Param.CC.Channel;                              int ch = itControlChangeEvent->Param.CC.Channel;
1614                              int param = pChannel->GetMidiRpnParameter();                              int param = pChannel->GetMidiRpnParameter();
1615                              value |= itControlChangeEvent->Param.CC.Value;                              int value = pChannel->GetMidiRpnData();
1616    
1617                              // transform event type: CC event -> RPN event                              // transform event type: CC event -> RPN event
1618                              itControlChangeEvent->Type = Event::type_rpn;                              itControlChangeEvent->Type = Event::type_rpn;
# Line 1614  namespace LinuxSampler { Line 1631  namespace LinuxSampler {
1631                                  );                                  );
1632                                  // if RPN event was dropped by script, abort                                  // if RPN event was dropped by script, abort
1633                                  // here to avoid hard coded RPN processing below                                  // here to avoid hard coded RPN processing below
1634                                  if (!pEventPool->fromID(eventID)) {                                  if (!pEventPool->fromID(eventID))
                                     // to prevent other data entry messages to be misenterpreted as RPN value  
                                     pChannel->ResetMidiRpnParameter();  
1635                                      break;                                      break;
                                 }  
1636                              }                              }
1637    
1638                              // do the actual (hard-coded) RPN value change processing                              // do the actual (hard-coded) RPN value change processing
1639                              ProcessHardcodedRpn(pEngineChannel, itControlChangeEvent);                              ProcessHardcodedRpn(pEngineChannel, itControlChangeEvent);
1640    
                             // to prevent other data entry messages to be misenterpreted as RPN value  
                             pChannel->ResetMidiRpnParameter();  
1641                          } else if (pChannel->GetMidiNrpnParameter() >= 0) { // NRPN parameter number was sent previously ...                          } else if (pChannel->GetMidiNrpnParameter() >= 0) { // NRPN parameter number was sent previously ...
1642                                pChannel->SetMidiNrpnDataLsb(
1643                                    itControlChangeEvent->Param.CC.Value
1644                                );
1645                                bIsNrpn = true;
1646    
1647                              int ch = itControlChangeEvent->Param.CC.Channel;                              int ch = itControlChangeEvent->Param.CC.Channel;
1648                              int param = pChannel->GetMidiNrpnParameter();                              int param = pChannel->GetMidiNrpnParameter();
1649                              value |= itControlChangeEvent->Param.CC.Value;                              int value = pChannel->GetMidiNrpnData();
1650    
1651                              // transform event type: CC event -> NRPN event                              // transform event type: CC event -> NRPN event
1652                              itControlChangeEvent->Type = Event::type_nrpn;                              itControlChangeEvent->Type = Event::type_nrpn;
# Line 1648  namespace LinuxSampler { Line 1665  namespace LinuxSampler {
1665                                  );                                  );
1666                                  // if NRPN event was dropped by script, abort                                  // if NRPN event was dropped by script, abort
1667                                  // here to avoid hard coded NRPN processing below                                  // here to avoid hard coded NRPN processing below
1668                                  if (!pEventPool->fromID(eventID)) {                                  if (!pEventPool->fromID(eventID))
                                     // to prevent other data entry messages to be misenterpreted as NRPN value  
                                     pChannel->ResetMidiNrpnParameter();  
1669                                      break;                                      break;
                                 }  
1670                              }                              }
1671    
1672                              // do the actual (hard-coded) NRPN value change processing                              // do the actual (hard-coded) NRPN value change processing
1673                              ProcessHardcodedNrpn(pEngineChannel, itControlChangeEvent);                              ProcessHardcodedNrpn(pEngineChannel, itControlChangeEvent);
   
                             // to prevent other data entry messages to be misenterpreted as NRPN value  
                             pChannel->ResetMidiNrpnParameter();  
1674                          }                          }
1675                          break;                          break;
1676                      }                      }
# Line 1738  namespace LinuxSampler { Line 1749  namespace LinuxSampler {
1749                      }                      }
1750                      case 98: { // NRPN parameter LSB                      case 98: { // NRPN parameter LSB
1751                          dmsg(4,("NRPN LSB %d\n", itControlChangeEvent->Param.CC.Value));                          dmsg(4,("NRPN LSB %d\n", itControlChangeEvent->Param.CC.Value));
1752                            bIsNrpn = true;
1753                          pEngineChannel->SetMidiNrpnParameterLsb(itControlChangeEvent->Param.CC.Value);                          pEngineChannel->SetMidiNrpnParameterLsb(itControlChangeEvent->Param.CC.Value);
1754                          break;                          break;
1755                      }                      }
1756                      case 99: { // NRPN parameter MSB                      case 99: { // NRPN parameter MSB
1757                          dmsg(4,("NRPN MSB %d\n", itControlChangeEvent->Param.CC.Value));                          dmsg(4,("NRPN MSB %d\n", itControlChangeEvent->Param.CC.Value));
1758                            bIsNrpn = true;
1759                          pEngineChannel->SetMidiNrpnParameterMsb(itControlChangeEvent->Param.CC.Value);                          pEngineChannel->SetMidiNrpnParameterMsb(itControlChangeEvent->Param.CC.Value);
1760                          break;                          break;
1761                      }                      }
1762                      case 100: { // RPN parameter LSB                      case 100: { // RPN parameter LSB
1763                          dmsg(4,("RPN LSB %d\n", itControlChangeEvent->Param.CC.Value));                          dmsg(4,("RPN LSB %d\n", itControlChangeEvent->Param.CC.Value));
1764                            bIsRpn = true;
1765                          pEngineChannel->SetMidiRpnParameterLsb(itControlChangeEvent->Param.CC.Value);                          pEngineChannel->SetMidiRpnParameterLsb(itControlChangeEvent->Param.CC.Value);
1766                          break;                          break;
1767                      }                      }
1768                      case 101: { // RPN parameter MSB                      case 101: { // RPN parameter MSB
1769                          dmsg(4,("RPN MSB %d\n", itControlChangeEvent->Param.CC.Value));                          dmsg(4,("RPN MSB %d\n", itControlChangeEvent->Param.CC.Value));
1770                            bIsRpn = true;
1771                          pEngineChannel->SetMidiRpnParameterMsb(itControlChangeEvent->Param.CC.Value);                          pEngineChannel->SetMidiRpnParameterMsb(itControlChangeEvent->Param.CC.Value);
1772                          break;                          break;
1773                      }                      }
# Line 1787  namespace LinuxSampler { Line 1802  namespace LinuxSampler {
1802                          break;                          break;
1803                      }                      }
1804                  }                  }
1805    
1806                    // reset cached RPN/NRPN parameter number and data in case this
1807                    // CC event had nothing to do with RPN/NRPN
1808                    if (!bIsRpn && pChannel->GetMidiRpnParameter() >= 0)
1809                        pChannel->ResetMidiRpnParameter();
1810                    if (!bIsNrpn && pChannel->GetMidiNrpnParameter() >= 0)
1811                        pChannel->ResetMidiNrpnParameter();
1812              }              }
1813    
1814              /**              /**

Legend:
Removed from v.3696  
changed lines
  Added in v.3697

  ViewVC Help
Powered by ViewVC