Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
dev:control_changes [2020/04/22 02:06]
tedfelix created
dev:control_changes [2022/05/06 16:07] (current)
Line 1: Line 1:
 ====== Control Changes ====== ====== Control Changes ======
 +
 +The code that sends out Control Changes in Rosegarden is pretty convoluted.  This document points out the key areas of interest.  Hopefully this will ease future maintenance.
 +
 +Note that code related to sending out Bank Selects and Program Changes can be found along with the code related to Control Changes.  This will be pointed out below.
  
 ===== Allow Reset All Controllers (CC 121) ===== ===== Allow Reset All Controllers (CC 121) =====
Line 9: Line 13:
   Edit > Preferences... > MIDI > General tab   Edit > Preferences... > MIDI > General tab
  
-The MIDI preferences are displayed by the MIDIConfigurationPage class.  The preference itself is stored in Rosegarden.conf as follows:+The MIDI preferences are displayed by the ''MIDIConfigurationPage'' class.  The preference itself is stored in Rosegarden.conf as follows:
  
   [Sequencer_Options]   [Sequencer_Options]
Line 19: Line 23:
  
   [Sequencer_Options]   [Sequencer_Options]
-  forceChannelSetups=true+  forceChannelSetups=false
  
 When set to true, channel setups will be sent out every time play is pressed.  If outside of a Segment, the channel setups will be based on the track values in the Instrument Parameters panel (MIPP). When set to true, channel setups will be sent out every time play is pressed.  If outside of a Segment, the channel setups will be based on the track values in the Instrument Parameters panel (MIPP).
 +
 +The default for this preference is false.
  
 ===== Manage Controllers dialog ===== ===== Manage Controllers dialog =====
-   + 
-The ControlEditorDialog class is the "Manage Controllers" dialog.+To get there: Studio > Manage MIDI Devices > pick a playback device > Controllers... 
 + 
 +The ''ControlEditorDialog'' class is the "Manage Controllers" dialog.
          
-//A better name for this class might be "ManageControllers".//+//A better name for this class might be "''ManageControllers''".//
          
 Controllers can be added, modified and deleted here.  Deleting a controller here will prevent it from ever being sent out at composition load time, and playback time. Controllers can be added, modified and deleted here.  Deleting a controller here will prevent it from ever being sent out at composition load time, and playback time.
Line 33: Line 41:
 ===== MIDI Instrument Parameters ===== ===== MIDI Instrument Parameters =====
  
-The MIDIInstrumentParameterPanel class is the "Instrument Parameters" panel that appears in the lower left when a MIDI track is selected.  Here the user can adjust the initial settings for the various controllers that were configured in the "Manage Controllers" dialog for a Device.+The ''MIDIInstrumentParameterPanel'' class is the "Instrument Parameters" panel that appears in the lower left when a MIDI track is selected.  Here the user can adjust the initial settings for the various controllers that were configured in the "Manage Controllers" dialog for a Device.
  
 ===== Controller Rulers ===== ===== Controller Rulers =====
  
-The ControllerEventsRuler class provides the controller rulers that can be displayed in both the Matrix and Notation editors.  These can be enabled from both editors by:+The ''ControllerEventsRuler'' class provides the controller rulers that can be displayed in both the Matrix and Notation editors.  These can be enabled from both editors by:
  
   View > Rulers > Add Control Ruler > ...   View > Rulers > Add Control Ruler > ...
Line 47: Line 55:
 ===== Controller Sequence dialog ===== ===== Controller Sequence dialog =====
  
-The PitchbendSequenceDialog class provides both the controller sequence dialogs and the "PitchBend Sequence" dialog.+The ''PitchbendSequenceDialog'' class provides both the controller sequence dialogs and the "PitchBend Sequence" dialog.
  
 These dialogs are accessible from both the Matrix and Notation editors: These dialogs are accessible from both the Matrix and Notation editors:
Line 63: Line 71:
 - RosegardenMainWindow::setDocument() - RosegardenMainWindow::setDocument()
   > RosegardenDocument::initialiseStudio()   > RosegardenDocument::initialiseStudio()
-    > Instrument::sendChannelSetup()+    > RosegardenDocument::sendChannelSetups()  (added January 2021) 
 +      > Instrument::sendChannelSetup()
 </file> </file>
  
Line 69: Line 78:
  
   * Called when a new Composition is loaded.   * Called when a new Composition is loaded.
-  * Calls RosegardenDocument::initialiseStudio()+  * Calls ''RosegardenDocument::initialiseStudio()''
  
 ==== RosegardenDocument::initialiseStudio() ==== ==== RosegardenDocument::initialiseStudio() ====
  
-  * Calls Instrument::sendChannelSetup()+  * Calls ''RosegardenDocument::sendChannelSetups()'' 
 + 
 +==== RosegardenDocument::sendChannelSetups() ==== 
 + 
 +  * Added January 2021. 
 +  * Calls ''Instrument::sendChannelSetup()''
  
 ==== Instrument::sendChannelSetup() ==== ==== Instrument::sendChannelSetup() ====
  
   * Sends the channel setups at file load time.   * Sends the channel setups at file load time.
 +  * Sends BS/PC for the channel as well.
   * This also might be the code that sends channel setups at the beginning of a MIDI File export.   * This also might be the code that sends channel setups at the beginning of a MIDI File export.
  
Line 92: Line 107:
 ==== InternalSegmentMapper::makeReady() ==== ==== InternalSegmentMapper::makeReady() ====
  
-  * Calls InternalSegmentMapper::getControllers() to get the controllers that are needed for a channel setup. +  * Calls ''InternalSegmentMapper::getControllers()'' to get the controllers that are needed for a channel setup. 
-  * Calls ChannelManager::makeReady() to set up the channel.+  * Calls ''ChannelManager::makeReady()'' to set up the channel.
  
 ==== InternalSegmentMapper::getControllers() ==== ==== InternalSegmentMapper::getControllers() ====
  
-  * Eventually calls ControllerContextMap::getControllerValue() which gets the current CC values when in the middle of a Segment.+  * Eventually calls ''ControllerContextMap::getControllerValue()'' which gets the current CC values when in the middle of a Segment.
  
 ==== ControllerContextMap ==== ==== ControllerContextMap ====
  
-  * A map of CC values over the course of a Segment.+  * A map of CC values over the course of a ''Segment''.
   * Can be queried to find out the last CC that was sent prior to a given time.   * Can be queried to find out the last CC that was sent prior to a given time.
  
 ==== ChannelManager::makeReady() ==== ==== ChannelManager::makeReady() ====
  
-  * If playback is starting in the middle of the Segment, sends out a channel setup.+  * If playback is starting in the middle of the ''Segment'', sends out a channel setup.
  
 ===== Control Changes at MIDI File Export ===== ===== Control Changes at MIDI File Export =====
Line 112: Line 127:
 If changes are made to the way CCs are sent, MIDI export needs to be regression tested to make sure nothing breaks. If changes are made to the way CCs are sent, MIDI export needs to be regression tested to make sure nothing breaks.
  
-//I need to expand this at some point.  MIDI Export reuses some portion of the above.//+<file> 
 +- MidiFile::convertToMidi() 
 +  > MappedBufMetaIterator::fetchFixedChannelSetup(inserter) 
 +    > InternalSegmentMapper::insertChannelSetup(inserter) 
 +      > ChannelManager::insertChannelSetup(TrackId, RealTime, ...) 
 +</file>
  
 
 
dev/control_changes.1587521174.txt.gz · Last modified: 2022/05/06 16:07 (external edit)
Recent changes RSS feed Creative Commons License Valid XHTML 1.0 Valid CSS Driven by DokuWiki