From fa40e9b36016cbcc02cd7c53eaaff114570c67ff Mon Sep 17 00:00:00 2001 From: RomeoDespres <39157756+RomeoDespres@users.noreply.github.com> Date: Sat, 23 Mar 2019 11:27:41 +0100 Subject: [PATCH 1/3] Add features --- CHANGELOG.md | 30 ++- docs/api.json | 2 +- docs/source/api_table.rst | 22 +- docs/source/reapy.core.reaper.rst | 8 + reapy/config.py | 26 ++- reapy/core/__init__.py | 16 +- reapy/core/fx/fx.py | 20 +- reapy/core/fx/fx_param.py | 15 +- reapy/core/item/__init__.py | 3 +- reapy/core/item/item.py | 5 - reapy/core/item/midi_event.py | 359 ++++++++++++++++++++++++++++++ reapy/core/item/take.py | 56 ++++- reapy/core/project/project.py | 9 +- reapy/core/reaper/__init__.py | 2 +- reapy/core/reaper/reaper.py | 41 ++-- reapy/core/reaper/ui.py | 48 ++++ reapy/core/reapy_object.py | 17 ++ reapy/core/track/__init__.py | 2 +- reapy/core/track/track.py | 45 +++- reapy/core/window/__init__.py | 3 +- reapy/core/window/tooltip.py | 106 +++++++++ reapy/core/window/window.py | 4 + 22 files changed, 767 insertions(+), 72 deletions(-) create mode 100644 reapy/core/item/midi_event.py create mode 100644 reapy/core/reaper/ui.py create mode 100644 reapy/core/window/tooltip.py diff --git a/CHANGELOG.md b/CHANGELOG.md index f53d7784..191e50a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,11 +4,11 @@ All notable changes to this project will be documented in this file. ## [Unreleased] -TODO Take.sort_notes - ### Added -UNTESTED : Take.add_note (and project.time_to_beats, beats_to_time, take.ppq_to_time, time_to_ppq) +#### API Helper Functions + +- [`test_api`] #### Audio Management @@ -60,8 +60,10 @@ UNTESTED : Take.add_note (and project.time_to_beats, beats_to_time, take.ppq_to_ - [`Take.is_midi`] - [`Take.n_cc`], [`Take.n_notes`], [`Take.n_text_sysex`] - [`Take.add_note`] +- [`Take.notes`] - [`Take.time_to_ppq`], [`Take.ppq_to_time`] - [`Take.select_all_midi_events`], [`Take.unselect_all_midi_events`] +- class [`Note`] - class [`MIDIEditor`] - [`midi.reinit`] @@ -86,8 +88,12 @@ UNTESTED : Take.add_note (and project.time_to_beats, beats_to_time, take.ppq_to_ #### User Interface -- [`get_last_color_theme_file`] +- [`browse_for_file`] +- [`ui.get_color_theme`], [`ui.set_color_theme`] +- [`ui.get_leftmost_track_in_mixer`], [`ui.set_leftmost_track_in_mixer`] - [`get_main_window`] +- [`Window.refresh`] +- class [`ToolTip`] ### Removed @@ -95,6 +101,10 @@ UNTESTED : Take.add_note (and project.time_to_beats, beats_to_time, take.ppq_to_ - `Track.get_envelope` (replaced by [`Track.envelopes`]) +### Fixed + +- Bug when enabling `reapy` for MacOS (issue [here](https://forum.cockos.com/showpost.php?p=2110136&postcount=27)) +- Bug when enabling `reapy` when no Control/OSC/web has ever been enabled in REAPER (issue [here](https://forum.cockos.com/showpost.php?p=2110177&postcount=30)) ## [0.1.0] - 2019-02-28 @@ -180,6 +190,7 @@ UNTESTED : Take.add_note (and project.time_to_beats, beats_to_time, take.ppq_to_ [`Marker.delete`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.Marker.delete [`Marker`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.Marker [`NormalizedFXParam.format_value`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.NormalizedFXParam.format_value +[`Note`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.Note [`Project.add_marker`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.Project.add_marker [`Project.add_region`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.Project.add_region [`Project.add_track`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.Project.add_track @@ -266,8 +277,10 @@ UNTESTED : Take.add_note (and project.time_to_beats, beats_to_time, take.ppq_to_ [`Take.n_notes`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.Take.n_notes [`Take.n_text_sysex`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.Take.n_text_sysex [`Take.name`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.Take.name +[`Take.notes`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.Take.notes [`Take.ppq_to_time`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.Take.ppq_to_time [`Take.select_all_midi_events`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.Take.select_all_midi_events +[`Take.sort_events`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.Take.sort_events [`Take.source`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.Take.source [`Take.time_to_ppq`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.Take.time_to_ppq [`Take.track`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.Take.track @@ -278,6 +291,7 @@ UNTESTED : Take.add_note (and project.time_to_beats, beats_to_time, take.ppq_to_ [`TimeSelection.looping`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.TimeSelection.looping [`TimeSelection.shift`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.TimeSelection.shift [`TimeSelection.unloop`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.TimeSelection.unloop +[`ToolTip`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.ToolTip [`Track.add_audio_accessor`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.Track.add_audio_accessor [`Track.add_fx`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.Track.add_fx [`Track.add_item`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.Track.add_item @@ -302,6 +316,7 @@ UNTESTED : Take.add_note (and project.time_to_beats, beats_to_time, take.ppq_to_ [`Track.select`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.Track.select [`Track.unselect`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.Track.unselect [`Track.visible_fx`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.Track.visible_fx +[`Window.refresh`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.Window.refresh [`add_reascript`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.reaper.add_reascript [`arm_command`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.reaper.arm_command [`at_exit`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.defer.at_exit @@ -315,6 +330,7 @@ UNTESTED : Take.add_note (and project.time_to_beats, beats_to_time, take.ppq_to_ [`audio.is_prebuffer`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.audio.is_prebuffer [`audio.is_running`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.audio.is_running [`audio.quit`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.audio.quit +[`browse_for_file`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.reaper.browse_for_file [`clear_console`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.reaper.clear_console [`clear_peak_cache`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.reaper.clear_peak_cache [`dB_to_slider`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.reaper.dB_to_slider @@ -328,7 +344,6 @@ UNTESTED : Take.add_note (and project.time_to_beats, beats_to_time, take.ppq_to_ [`get_ext_state`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.reaper.get_ext_state [`get_global_automation_mode`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.reaper.get_global_automation_mode [`get_ini_file`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.reaper.get_ini_file -[`get_last_color_theme_file`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.reaper.get_last_color_theme_file [`get_last_touched_track`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.reaper.get_last_touched_track [`get_main_window`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.reaper.get_main_window [`get_projects`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.reaper.get_projects @@ -358,7 +373,12 @@ UNTESTED : Take.add_note (and project.time_to_beats, beats_to_time, take.ppq_to_ [`show_console_message`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.reaper.show_console_message [`show_message_box`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.reaper.show_message_box [`slider_to_dB`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.reaper.slider_to_dB +[`test_api`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.reaper.test_api [`time.time`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.time.time +[`ui.get_color_theme`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.ui.get_color_theme +[`ui.get_leftmost_track_in_mixer`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.ui.get_leftmost_track_in_mixer +[`ui.set_color_theme`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.ui.set_color_theme +[`ui.set_leftmost_track_in_mixer`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.ui.set_leftmost_track_in_mixer [`update_arrange`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.reaper.update_arrange [`update_timeline`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.reaper.update_timeline [`view_prefs`]: https://python-reapy.readthedocs.io/en/latest/reapy.core.reaper.html#reapy.core.reaper.reaper.view_prefs diff --git a/docs/api.json b/docs/api.json index 70ec6777..8e234bc3 100644 --- a/docs/api.json +++ b/docs/api.json @@ -1 +1 @@ -{"GetProjectTimeSignature": {"group": "Marker and Region Management", "reapy": ["DEPRECATED"]}, "CountTracks": {"group": "Track Management", "reapy": ["Project.n_tracks"]}, "SetMixerScroll": {"group": "User Interface", "reapy": []}, "ScaleFromEnvelopeMode": {"group": "Envelope Management", "reapy": []}, "SetCurrentBPM": {"group": "Project Management", "reapy": ["Project.bpm"]}, "RefreshToolbar": {"group": "User Interface", "reapy": []}, "TrackFX_GetPresetIndex": {"group": "FX Management", "reapy": ["FX.preset_index"]}, "GetTrackGUID": {"group": "Track Management", "reapy": []}, "OnPlayButton": {"group": "Transport Management", "reapy": ["Project.play"]}, "SetRegionRenderMatrix": {"group": "Other", "reapy": ["Region.add_rendered_track", "Region.remove_rendered_track"]}, "TimeMap_timeToQN_abs": {"group": "Other", "reapy": []}, "GetMediaSourceType": {"group": "Audio Management", "reapy": ["Source.type"]}, "SLIDER2DB": {"group": "API Helper Functions", "reapy": ["slider_to_dB"]}, "GetUserInputs": {"group": "User Interface", "reapy": []}, "TrackFX_GetParameterStepSizes": {"group": "FX Management", "reapy": []}, "SetTrackMIDILyrics": {"group": "MIDI Management", "reapy": []}, "Main_OnCommandEx": {"group": "API Helper Functions", "reapy": ["Project.perform_action"]}, "SetEnvelopePointEx": {"group": "Envelope Management", "reapy": []}, "MIDI_GetGrid": {"group": "MIDI Management", "reapy": []}, "TakeFX_GetCount": {"group": "FX Management", "reapy": ["Take.n_fxs"]}, "MIDI_SetItemExtents": {"group": "MIDI Management", "reapy": []}, "EnumTrackMIDIProgramNamesEx": {"group": "MIDI Management", "reapy": []}, "RefreshToolbar2": {"group": "User Interface", "reapy": []}, "CreateTakeAudioAccessor": {"group": "Audio Management", "reapy": ["Take.add_audio_accessor"]}, "GetPlayStateEx": {"group": "Transport Management", "reapy": ["Project.play_state"]}, "resolve_fn2": {"group": "API Helper Functions", "reapy": []}, "Help_Set": {"group": "Other", "reapy": []}, "Loop_OnArrow": {"group": "Transport Management", "reapy": ["TimeSelection.shift"]}, "MIDI_DeleteCC": {"group": "MIDI Management", "reapy": []}, "Envelope_GetParentTrack": {"group": "Envelope Management", "reapy": ["Envelope.parent"]}, "GetItemEditingTime2": {"group": "Audio Management", "reapy": []}, "atexit": {"group": "Deferring Function Calls", "reapy": ["at_exit"]}, "GoToRegion": {"group": "Transport Management", "reapy": []}, "CountTrackMediaItems": {"group": "Item Management", "reapy": ["Track.n_items"]}, "GetSubProjectFromSource": {"group": "Audio Management", "reapy": []}, "CSurf_OnPlayRateChange": {"group": "Transport Management", "reapy": []}, "TimeMap2_beatsToTime": {"group": "Other", "reapy": []}, "SetProjectMarkerByIndex2": {"group": "Marker and Region Management", "reapy": ["Marker", "Region"]}, "GetTempoMatchPlayRate": {"group": "Audio Management", "reapy": []}, "TrackFX_CopyToTrack": {"group": "FX Management", "reapy": ["FX.copy_to_track", "FX.move_to_track"]}, "PCM_Sink_ShowConfig": {"group": "Audio Management", "reapy": []}, "GSC_mainwnd": {"group": "User Interface", "reapy": []}, "Undo_DoRedo2": {"group": "Project Management", "reapy": ["Project.redo"]}, "IsMediaExtension": {"group": "API Helper Functions", "reapy": []}, "UpdateTimeline": {"group": "Arrangeview Management", "reapy": ["update_timeline"]}, "TrackFX_SetEnabled": {"group": "FX Management", "reapy": ["FX.enable", "FX.disable"]}, "OpenMediaExplorer": {"group": "User Interface", "reapy": []}, "SetMIDIEditorGrid": {"group": "MIDI Management", "reapy": []}, "TrackFX_GetParamName": {"group": "FX Management", "reapy": ["FXParam.name"]}, "GetEnvelopeStateChunk": {"group": "Envelope Management", "reapy": []}, "MIDI_GetAllEvts": {"group": "MIDI Management", "reapy": []}, "CSurf_GoStart": {"group": "Transport Management", "reapy": []}, "GetTrackAutomationMode": {"group": "Envelope Management", "reapy": ["Track.automation_mode"]}, "Resample_EnumModes": {"group": "Audio Management", "reapy": []}, "TrackFX_GetNumParams": {"group": "FX Management", "reapy": ["FX.n_params"]}, "TimeMap_QNToTime_abs": {"group": "Other", "reapy": []}, "midi_reinit": {"group": "MIDI Management", "reapy": ["midi.reinit"]}, "MoveEditCursor": {"group": "Transport Management", "reapy": []}, "relative_fn": {"group": "API Helper Functions", "reapy": []}, "SetToggleCommandState": {"group": "API Helper Functions", "reapy": []}, "GetTrackMIDILyrics": {"group": "MIDI Management", "reapy": []}, "PCM_Sink_GetExtension": {"group": "Audio Management", "reapy": []}, "CSurf_OnFXChange": {"group": "Track Management", "reapy": []}, "TrackFX_SetPreset": {"group": "FX Management", "reapy": ["FX.preset"]}, "MIDI_GetTrackHash": {"group": "MIDI Management", "reapy": []}, "Undo_DoUndo2": {"group": "Project Management", "reapy": ["Project.undo"]}, "GetMediaItem": {"group": "Item Management", "reapy": ["Project.items"]}, "CSurf_OnPause": {"group": "Transport Management", "reapy": []}, "GetPlayPosition2": {"group": "Transport Management", "reapy": ["Project.buffer_position"]}, "MIDI_EnumSelNotes": {"group": "MIDI Management", "reapy": []}, "MIDI_GetScale": {"group": "MIDI Management", "reapy": []}, "ShowConsoleMsg": {"group": "API Helper Functions", "reapy": ["print", "show_console_message"]}, "PreventUIRefresh": {"group": "User Interface", "reapy": []}, "SetMediaItemSelected": {"group": "Item Management", "reapy": []}, "CSurf_OnSendPanChange": {"group": "Track Management", "reapy": []}, "Track_GetPeakHoldDB": {"group": "Track Management", "reapy": []}, "TrackFX_SetPresetByIndex": {"group": "FX Management", "reapy": ["FX.preset"]}, "joystick_getaxis": {"group": "Joystick Management", "reapy": []}, "EditTempoTimeSigMarker": {"group": "Marker and Region Management", "reapy": []}, "MIDIEditor_OnCommand": {"group": "MIDI Management", "reapy": ["MIDIEditor.perform_action"]}, "joystick_getpov": {"group": "Joystick Management", "reapy": []}, "GetMediaItem_Track": {"group": "Track Management", "reapy": ["Item.track"]}, "mkpanstr": {"group": "API Helper Functions", "reapy": []}, "format_timestr_pos": {"group": "API Helper Functions", "reapy": []}, "Envelope_GetParentTake": {"group": "Envelope Management", "reapy": ["Envelope.parent"]}, "TakeFX_GetFloatingWindow": {"group": "FX Management", "reapy": ["FX.window"]}, "MIDI_DeleteEvt": {"group": "MIDI Management", "reapy": []}, "CSurf_OnInputMonitorChangeEx": {"group": "Track Management", "reapy": []}, "DeleteTrackMediaItem": {"group": "Item Management", "reapy": ["Item.delete"]}, "EnumerateSubdirectories": {"group": "File Management", "reapy": ["os.listdir"]}, "GetSelectedMediaItem": {"group": "Item Management", "reapy": ["Project.selected_items", "Project.get_selected_item"]}, "SetProjectMarker3": {"group": "Marker and Region Management", "reapy": ["Marker", "Region"]}, "TakeFX_SetOpen": {"group": "FX Management", "reapy": ["FX.open_ui", "FX.close_ui"]}, "CSurf_OnSoloChange": {"group": "Track Management", "reapy": []}, "GetPeakFileName": {"group": "Audio Management", "reapy": []}, "MIDI_SetAllEvts": {"group": "MIDI Management", "reapy": []}, "GetMediaItemTakeInfo_Value": {"group": "Item Management", "reapy": ["Take.get_info_value"]}, "TimeMap_QNToMeasures": {"group": "Other", "reapy": []}, "TrackFX_GetFXGUID": {"group": "FX Management", "reapy": []}, "time_precise": {"group": "API Helper Functions", "reapy": ["time.time"]}, "InsertTrackAtIndex": {"group": "Track Management", "reapy": ["Project.add_track"]}, "Master_GetPlayRateAtTime": {"group": "Transport Management", "reapy": ["Project.get_play_rate"]}, "DockWindowActivate": {"group": "User Interface", "reapy": []}, "GetMousePosition": {"group": "User Interface", "reapy": []}, "SetEditCurPos2": {"group": "Transport Management", "reapy": ["Project.cursor_position"]}, "TimeMap_GetDividedBpmAtTime": {"group": "Other", "reapy": []}, "GetTrackNumSends": {"group": "Track Management", "reapy": ["Track.n_sends", "Track.n_receives"]}, "GetOutputChannelName": {"group": "Audio/MIDI Device Management", "reapy": ["audio.get_output_names"]}, "CSurf_OnStop": {"group": "Track Management", "reapy": []}, "SoloAllTracks": {"group": "Track Management", "reapy": ["Project.solo_all_tracks", "Project.unsolo_all_tracks"]}, "GetTrackReceiveUIMute": {"group": "Track Management", "reapy": []}, "EnsureNotCompletelyOffscreen": {"group": "Other", "reapy": []}, "GetLastMarkerAndCurRegion": {"group": "Marker and Region Management", "reapy": []}, "MIDI_EnumSelCC": {"group": "MIDI Management", "reapy": []}, "PCM_Source_Destroy": {"group": "Audio Management", "reapy": ["Source.delete"]}, "MIDI_GetHash": {"group": "MIDI Management", "reapy": []}, "CountTempoTimeSigMarkers": {"group": "Marker and Region Management", "reapy": ["Project.n_tempo_markers"]}, "TrackFX_GetInstrument": {"group": "FX Management", "reapy": ["Track.instrument"]}, "SetTakeStretchMarker": {"group": "Marker and Region Management", "reapy": []}, "DockWindowAddEx": {"group": "User Interface", "reapy": []}, "SetMediaItemPosition": {"group": "Item Management", "reapy": ["Item.position"]}, "guidToString": {"group": "API Helper Functions", "reapy": []}, "TrackFX_NavigatePresets": {"group": "FX Management", "reapy": ["FX.use_next_preset", "FX.use_previous_preset"]}, "InsertMedia": {"group": "Audio Management", "reapy": []}, "CSurf_OnSoloChangeEx": {"group": "Track Management", "reapy": []}, "TakeFX_EndParamEdit": {"group": "FX Management", "reapy": []}, "SetExtState": {"group": "Extended States", "reapy": ["set_ext_state"]}, "CSurf_OnMuteChangeEx": {"group": "Track Management", "reapy": []}, "Main_openProject": {"group": "Project Management", "reapy": ["open_project"]}, "GetLastColorThemeFile": {"group": "User Interface", "reapy": ["get_last_color_theme_file"]}, "TrackFX_FormatParamValue": {"group": "FX Management", "reapy": ["FXParam.format_value"]}, "TakeFX_SetNamedConfigParm": {"group": "FX Management", "reapy": []}, "TakeFX_SetParam": {"group": "FX Management", "reapy": ["FX.params"]}, "MIDI_SetEvt": {"group": "MIDI Management", "reapy": []}, "ViewPrefs": {"group": "User Interface", "reapy": ["view_prefs"]}, "GetTCPFXParm": {"group": "FX Management", "reapy": []}, "GetMediaSourceLength": {"group": "Audio Management", "reapy": ["Source.length"]}, "parse_timestr_len": {"group": "API Helper Functions", "reapy": []}, "GetAudioAccessorEndTime": {"group": "Audio Management", "reapy": ["AudioAccessor.end_time"]}, "RemoveTrackSend": {"group": "Track Management", "reapy": ["Send.delete"]}, "GetTrackNumMediaItems": {"group": "Track Management", "reapy": ["Track.n_items"]}, "GetResourcePath": {"group": "API Helper Functions", "reapy": ["get_resource_path"]}, "ToggleTrackSendUIMute": {"group": "API Helper Functions", "reapy": []}, "GetMediaItemTake_Source": {"group": "Item Management", "reapy": ["Take.source"]}, "CountSelectedMediaItems": {"group": "Item Management", "reapy": ["Project.n_selected_items"]}, "GetNumMIDIInputs": {"group": "Audio/MIDI Device Management", "reapy": ["midi.get_n_inputs"]}, "GetMasterTrack": {"group": "Track Management", "reapy": ["Project.master_track"]}, "GetTakeEnvelopeByName": {"group": "Envelope Management", "reapy": ["Take.envelopes"]}, "SetOnlyTrackSelected": {"group": "Track Management", "reapy": ["Track.make_only_selected_track"]}, "GetTrackEnvelopeByName": {"group": "Envelope Management", "reapy": ["Track.envelopes"]}, "DB2SLIDER": {"group": "API Helper Functions", "reapy": ["dB_to_slider"]}, "TrackFX_GetFloatingWindow": {"group": "FX Management", "reapy": ["FX.window"]}, "TakeFX_GetUserPresetFilename": {"group": "FX Management", "reapy": ["FX.preset_file"]}, "MIDI_GetPPQPosFromProjTime": {"group": "MIDI Management", "reapy": ["Take.time_to_ppq"]}, "MB": {"group": "User Interface", "reapy": ["reapy.show_message_box"]}, "EnumPitchShiftModes": {"group": "Pitch Shifting", "reapy": []}, "Track_GetPeakInfo": {"group": "Track Management", "reapy": []}, "DeleteProjectMarker": {"group": "Marker and Region Management", "reapy": ["Marker.delete", "Region.delete"]}, "GetCursorPositionEx": {"group": "Transport Management", "reapy": ["Project.cursor_position"]}, "MIDIEditor_LastFocused_OnCommand": {"group": "MIDI Management", "reapy": ["midi.get_active_editor", "MIDIEditor.perform_action"]}, "GetPeakFileNameEx2": {"group": "Audio Management", "reapy": []}, "TrackFX_EndParamEdit": {"group": "FX Management", "reapy": []}, "GetAudioAccessorStartTime": {"group": "Audio Management", "reapy": ["AudioAccessor.start_time"]}, "GetNumMIDIOutputs": {"group": "Audio/MIDI Device Management", "reapy": ["midi.get_n_outputs"]}, "CSurf_OnArrow": {"group": "Arrangeview Management", "reapy": []}, "AnyTrackSolo": {"group": "Track Management", "reapy": ["Project.any_track_solo"]}, "CSurf_SetSurfaceRecArm": {"group": "Track Management", "reapy": []}, "GetPlayPosition": {"group": "Transport Management", "reapy": ["Project.play_position"]}, "TakeFX_GetEnvelope": {"group": "FX Management", "reapy": ["FXParam.envelope", "FXParam.add_envelope"]}, "InsertAutomationItem": {"group": "Automation Management", "reapy": []}, "IsTrackVisible": {"group": "Track Management", "reapy": []}, "MIDI_EnumSelEvts": {"group": "MIDI Management", "reapy": []}, "MIDI_DeleteNote": {"group": "MIDI Management", "reapy": []}, "SetTrackAutomationMode": {"group": "Envelope Management", "reapy": ["Track.automation_mode"]}, "GetSetMediaItemTakeInfo_String": {"group": "Item Management", "reapy": []}, "GetProjectName": {"group": "Project Management", "reapy": ["Project.name"]}, "FindTempoTimeSigMarker": {"group": "Marker and Region Management", "reapy": []}, "Undo_EndBlock": {"group": "Project Management", "reapy": ["Project.end_undo_block"]}, "DeleteProjectMarkerByIndex": {"group": "Marker and Region Management", "reapy": ["Marker.delete", "Region.delete"]}, "TakeFX_GetFXGUID": {"group": "FX Management", "reapy": []}, "GetCursorContext2": {"group": "Arrangeview Management", "reapy": []}, "GetEnvelopeName": {"group": "Envelope Management", "reapy": ["Envelope.name"]}, "CSurf_OnVolumeChangeEx": {"group": "Track Management", "reapy": []}, "TakeFX_GetEnabled": {"group": "FX Management", "reapy": ["FX.is_enabled"]}, "GetSetItemState": {"group": "Item Management", "reapy": ["DEPRECATED"]}, "SetTrackSendInfo_Value": {"group": "Track Management", "reapy": ["Send"]}, "GetExtState": {"group": "Extended States", "reapy": ["get_ext_state"]}, "LICE_ClipLine": {"group": "User Interface", "reapy": []}, "GetDisplayedMediaItemColor2": {"group": "Item Management", "reapy": []}, "InsertMediaSection": {"group": "Audio Management", "reapy": []}, "MIDI_GetPPQPos_StartOfMeasure": {"group": "MIDI Management", "reapy": []}, "TakeFX_FormatParamValue": {"group": "FX Management", "reapy": ["FXParam.format_value"]}, "SetMediaItemTakeInfo_Value": {"group": "Item Management", "reapy": []}, "TakeFX_AddByName": {"group": "FX Management", "reapy": ["Take.add_fx"]}, "GetTrackName": {"group": "Track Management", "reapy": ["Track.name"]}, "Main_OnCommand": {"group": "API Helper Functions", "reapy": ["perform_action"]}, "SelectAllMediaItems": {"group": "Item Management", "reapy": ["Project.select_all_items"]}, "MoveMediaItemToTrack": {"group": "Item Management", "reapy": ["Item.track"]}, "TimeMap2_GetNextChangeTime": {"group": "Other", "reapy": []}, "CSurf_SetSurfaceMute": {"group": "Track Management", "reapy": []}, "GetSet_LoopTimeRange": {"group": "Transport Management", "reapy": ["Project.time_selection"]}, "format_timestr_len": {"group": "API Helper Functions", "reapy": []}, "TakeFX_GetOffline": {"group": "FX Management", "reapy": ["FX.is_online"]}, "CSurf_OnPanChange": {"group": "Track Management", "reapy": []}, "GetOS": {"group": "API Helper Functions", "reapy": []}, "GetEnvelopePointEx": {"group": "Envelope Management", "reapy": []}, "PCM_Source_CreateFromType": {"group": "Audio Management", "reapy": []}, "StuffMIDIMessage": {"group": "MIDI Management", "reapy": []}, "MIDIEditor_GetSetting_int": {"group": "MIDI Management", "reapy": ["MIDIEditor"]}, "GetProjectTimeOffset": {"group": "Project Management", "reapy": []}, "AddProjectMarker": {"group": "Marker and Region Management", "reapy": ["Project.add_marker", "Project.add_region"]}, "TimeMap_GetMetronomePattern": {"group": "Other", "reapy": []}, "GetFXEnvelope": {"group": "Envelope Management", "reapy": ["FXParam.envelope", "FXParam.add_envelope"]}, "MIDI_GetEvt": {"group": "MIDI Management", "reapy": []}, "SetTrackSendUIVol": {"group": "Track Management", "reapy": []}, "GetSelectedEnvelope": {"group": "Envelope Management", "reapy": ["Project.selected_envelope"]}, "SetMasterTrackVisibility": {"group": "Track Management", "reapy": []}, "TrackFX_GetIOSize": {"group": "FX Management", "reapy": ["FX.n_inputs", "FX.n_outputs"]}, "MIDIEditor_GetActive": {"group": "MIDI Management", "reapy": ["midi.get_active_editor"]}, "DeleteTakeStretchMarkers": {"group": "Marker and Region Management", "reapy": []}, "GetCurrentProjectInLoadSave": {"group": "Project Management", "reapy": []}, "SetTrackSendUIPan": {"group": "Track Management", "reapy": []}, "Undo_EndBlock2": {"group": "Project Management", "reapy": ["Project.end_undo_block"]}, "OnStopButtonEx": {"group": "Transport Management", "reapy": ["Project.stop"]}, "TrackFX_GetParamEx": {"group": "FX Management", "reapy": []}, "TakeFX_FormatParamValueNormalized": {"group": "FX Management", "reapy": ["NormalizedFXParam.format_value"]}, "DestroyAudioAccessor": {"group": "Audio Management", "reapy": ["AudioAccessor.delete"]}, "TrackFX_GetOpen": {"group": "Track Management", "reapy": ["FX.is_ui_open"]}, "CreateTrackAudioAccessor": {"group": "Audio Management", "reapy": ["Track.add_audio_accessor"]}, "Undo_CanUndo2": {"group": "Project Management", "reapy": ["Project.can_undo"]}, "CSurf_OnScroll": {"group": "Arrangeview Management", "reapy": []}, "parse_timestr": {"group": "API Helper Functions", "reapy": []}, "Undo_OnStateChange2": {"group": "Project Management", "reapy": []}, "GetTrackMIDINoteRange": {"group": "MIDI Management", "reapy": []}, "CountProjectMarkers": {"group": "Marker and Region Management", "reapy": ["Project.n_markers", "Project.n_regions"]}, "UpdateArrange": {"group": "Arrangeview Management", "reapy": ["update_arrange"]}, "TakeFX_Show": {"group": "FX Management", "reapy": ["FX.open_chain", "FX.open_floating_window", "FX.close_chain", "FX.close_floating_window"]}, "TrackFX_GetNamedConfigParm": {"group": "FX Management", "reapy": []}, "MediaItemDescendsFromTrack": {"group": "Other", "reapy": []}, "CSurf_OnWidthChangeEx": {"group": "Track Management", "reapy": []}, "GetMouseModifier": {"group": "User Interface", "reapy": []}, "TrackFX_GetUserPresetFilename": {"group": "FX Management", "reapy": ["FX.preset_file"]}, "TakeFX_SetPreset": {"group": "FX Management", "reapy": ["FX.preset"]}, "TakeFX_GetParamNormalized": {"group": "FX Management", "reapy": ["FXParam.normalized"]}, "DeleteTrack": {"group": "Track Management", "reapy": ["Track.delete"]}, "TakeFX_GetChainVisible": {"group": "FX Management", "reapy": ["Take.visible_fx"]}, "PCM_Source_CreateFromFile": {"group": "Audio Management", "reapy": []}, "TrackFX_CopyToTake": {"group": "FX Management", "reapy": ["FX.copy_to_take", "FX.move_to_take"]}, "joystick_update": {"group": "Joystick Management", "reapy": []}, "GetTrackSendUIMute": {"group": "Track Management", "reapy": []}, "AddRemoveReaScript": {"group": "API Helper Functions", "reapy": ["add_reascript", "remove_reascript"]}, "CSurf_OnRecvPanChange": {"group": "Track Management", "reapy": []}, "MIDI_SelectAll": {"group": "MIDI Management", "reapy": ["Take.select_all_midi_events", "Take.unselect_all_midi_events"]}, "TrackFX_GetFXName": {"group": "FX Management", "reapy": ["FX.name"]}, "TakeFX_GetFXName": {"group": "FX Management", "reapy": ["FX.name"]}, "PluginWantsAlwaysRunFx": {"group": "FX Management", "reapy": []}, "GetConfigWantsDock": {"group": "User Interface", "reapy": []}, "Dock_UpdateDockID": {"group": "User Interface", "reapy": []}, "EnumProjectMarkers3": {"group": "Marker and Region Management", "reapy": ["Project.markers", "Project.regions"]}, "GetMediaTrackInfo_Value": {"group": "Track Management", "reapy": []}, "DockWindowRemove": {"group": "User Interface", "reapy": []}, "DeleteEnvelopePointRangeEx": {"group": "Envelope Management", "reapy": ["AutomationItem.delete_points_in_range"]}, "ExecProcess": {"group": "API Helper Functions", "reapy": []}, "GetTrack": {"group": "Track Management", "reapy": ["Project.tracks"]}, "GetTrackMIDINoteName": {"group": "MIDI Management", "reapy": []}, "CountAutomationItems": {"group": "Automation Management", "reapy": ["Envelope.n_items"]}, "Master_NormalizeTempo": {"group": "Transport Management", "reapy": []}, "TakeFX_GetPresetIndex": {"group": "FX Management", "reapy": ["FX.preset_index"]}, "GetUserFileNameForRead": {"group": "User Interface", "reapy": []}, "AddTakeToMediaItem": {"group": "Item Management", "reapy": ["Item.add_take"]}, "UpdateItemInProject": {"group": "Item Management", "reapy": ["Item.update"]}, "TrackFX_GetByName": {"group": "FX Management", "reapy": []}, "GetSetEnvelopeState": {"group": "Envelope Management", "reapy": ["DEPRECATED"]}, "GetTrackUIMute": {"group": "Track Management", "reapy": []}, "GetSetTrackGroupMembershipHigh": {"group": "Track Management", "reapy": []}, "GetNumAudioInputs": {"group": "Audio/MIDI Device Management", "reapy": ["audio.get_n_inputs"]}, "GR_SelectColor": {"group": "User Interface", "reapy": []}, "OpenColorThemeFile": {"group": "User Interface", "reapy": []}, "TakeFX_SetEnabled": {"group": "FX Management", "reapy": ["FX.enable", "FX.disable"]}, "CSurf_OnSendVolumeChange": {"group": "Track Management", "reapy": []}, "Undo_CanRedo2": {"group": "Project Management", "reapy": ["Project.can_redo"]}, "EnumPitchShiftSubModes": {"group": "Pitch Shifting", "reapy": []}, "GetSetAutomationItemInfo": {"group": "Automation Management", "reapy": ["AutomationItem.length", "AutomationItem.pool", "AutomationItem.position"]}, "ColorToNative": {"group": "API Helper Functions", "reapy": ["rgb_to_native"]}, "GetSetTrackState": {"group": "Track Management", "reapy": ["DEPRECATED"]}, "SetTrackColor": {"group": "Track Management", "reapy": ["Track.color"]}, "TakeFX_NavigatePresets": {"group": "FX Management", "reapy": ["FX.use_next_preset", "FX.use_previous_preset"]}, "DeleteEnvelopePointRange": {"group": "Envelope Management", "reapy": ["Envelope.delete_points_in_range"]}, "TakeFX_SetPinMappings": {"group": "FX Management", "reapy": []}, "my_getViewport": {"group": "User Interface", "reapy": []}, "Envelope_SortPointsEx": {"group": "Envelope Management", "reapy": []}, "GetMixerScroll": {"group": "User Interface", "reapy": []}, "DockWindowRefresh": {"group": "User Interface", "reapy": []}, "GetDisplayedMediaItemColor": {"group": "Item Management", "reapy": []}, "GetTrackUIPan": {"group": "Track Management", "reapy": []}, "GetAudioAccessorSamples": {"group": "Audio Management", "reapy": ["AudioAccessor.get_samples"]}, "Undo_OnStateChangeEx": {"group": "Project Management", "reapy": []}, "image_resolve_fn": {"group": "API Helper Functions", "reapy": []}, "GetUnderrunTime": {"group": "Audio/MIDI Device Management", "reapy": []}, "PCM_Source_CreateFromFileEx": {"group": "Audio Management", "reapy": []}, "GetMaxMidiInputs": {"group": "Audio/MIDI Device Management", "reapy": ["midi.get_max_inputs"]}, "GetMIDIInputName": {"group": "Audio/MIDI Device Management", "reapy": ["midi.get_input_names"]}, "Undo_OnStateChange_Item": {"group": "Project Management", "reapy": []}, "SetMediaItemLength": {"group": "Item Management", "reapy": ["Item.length"]}, "GetExePath": {"group": "API Helper Functions", "reapy": ["get_exe_dir"]}, "GetSetTrackGroupMembership": {"group": "Track Management", "reapy": []}, "GetHZoomLevel": {"group": "Arrangeview Management", "reapy": []}, "IsMediaItemSelected": {"group": "Item Management", "reapy": ["Item.is_selected"]}, "GetCursorPosition": {"group": "Transport Management", "reapy": ["Project.cursor_position"]}, "TrackFX_Delete": {"group": "FX Management", "reapy": ["FX.delete"]}, "MIDIEditor_GetMode": {"group": "MIDI Management", "reapy": ["MIDIEditor.mode"]}, "MIDI_GetCC": {"group": "MIDI Management", "reapy": []}, "SetProjectMarker2": {"group": "Marker and Region Management", "reapy": ["Marker", "Region"]}, "Main_UpdateLoopInfo": {"group": "Other", "reapy": []}, "SetEnvelopePoint": {"group": "Envelope Management", "reapy": []}, "MIDI_GetPPQPos_EndOfMeasure": {"group": "MIDI Management", "reapy": []}, "Splash_GetWnd": {"group": "Other", "reapy": []}, "GetEnvelopePointByTime": {"group": "Envelope Management", "reapy": []}, "CSurf_OnRew": {"group": "Transport Management", "reapy": []}, "MarkTrackItemsDirty": {"group": "Other", "reapy": []}, "GetPlayPositionEx": {"group": "Transport Management", "reapy": ["Project.play_position"]}, "SetMediaItemInfo_Value": {"group": "Item Management", "reapy": []}, "GetMediaItemTakeByGUID": {"group": "Item Management", "reapy": []}, "GetOutputLatency": {"group": "Audio/MIDI Device Management", "reapy": ["audio.get_output_latency"]}, "TakeFX_GetNumParams": {"group": "FX Management", "reapy": ["FX.n_params"]}, "PCM_Source_GetSectionInfo": {"group": "Audio Management", "reapy": []}, "TrackFX_SetEQParam": {"group": "FX Management", "reapy": []}, "OnPlayButtonEx": {"group": "Transport Management", "reapy": ["Project.play"]}, "GetTrackSendName": {"group": "Track Management", "reapy": []}, "HasTrackMIDIProgramsEx": {"group": "MIDI Management", "reapy": []}, "OscLocalMessageToHost": {"group": "Audio/MIDI Device Management", "reapy": []}, "MIDI_GetPPQPosFromProjQN": {"group": "MIDI Management", "reapy": []}, "TrackFX_GetEQParam": {"group": "FX Management", "reapy": []}, "GoToMarker": {"group": "Transport Management", "reapy": []}, "APIExists": {"group": "API Helper Functions", "reapy": []}, "GetParentTrack": {"group": "Track Management", "reapy": ["Track.parent_track"]}, "GetMediaItemNumTakes": {"group": "Item Management", "reapy": ["Item.n_takes"]}, "joystick_destroy": {"group": "Joystick Management", "reapy": []}, "TimeMap_timeToQN": {"group": "Other", "reapy": ["Project.time_to_beats"]}, "GetToggleCommandState": {"group": "API Helper Functions", "reapy": []}, "GetTrackReceiveUIVolPan": {"group": "Track Management", "reapy": []}, "Undo_BeginBlock2": {"group": "Project Management", "reapy": ["Project.begin_undo_block"]}, "SetMediaTrackInfo_Value": {"group": "Track Management", "reapy": []}, "GetMaxMidiOutputs": {"group": "Audio/MIDI Device Management", "reapy": ["midi.get_max_outputs"]}, "GetMediaItemTake_Peaks": {"group": "Item Management", "reapy": []}, "InsertEnvelopePointEx": {"group": "Envelope Management", "reapy": []}, "CSurf_NumTracks": {"group": "Track Management", "reapy": []}, "GetSetProjectAuthor": {"group": "Project Management", "reapy": []}, "TimeMap2_timeToQN": {"group": "Other", "reapy": ["Project.time_to_beats"]}, "joystick_create": {"group": "Joystick Management", "reapy": []}, "TimeMap_GetMeasureInfo": {"group": "Other", "reapy": []}, "GetTrackMediaItem": {"group": "Item Management", "reapy": ["Track.items"]}, "joystick_getinfo": {"group": "Joystick Management", "reapy": []}, "CSurf_GetTouchState": {"group": "Track Management", "reapy": []}, "SetProjectMarker": {"group": "Marker and Region Management", "reapy": ["Marker", "Region"]}, "GetMasterTrackVisibility": {"group": "Track Management", "reapy": []}, "TakeFX_GetParameterStepSizes": {"group": "FX Management", "reapy": []}, "CSurf_OnTrackSelection": {"group": "Track Management", "reapy": []}, "CSurf_SetSurfaceVolume": {"group": "Track Management", "reapy": []}, "GetTrackMIDINoteNameEx": {"group": "MIDI Management", "reapy": []}, "NamedCommandLookup": {"group": "API Helper Functions", "reapy": ["get_command_id"]}, "GetProjectTimeSignature2": {"group": "Marker and Region Management", "reapy": ["Project.bpm", "Project.bpi"]}, "CSurf_OnRecArmChangeEx": {"group": "Track Management", "reapy": []}, "GetAudioDeviceInfo": {"group": "Audio Management", "reapy": []}, "GetTrackReceiveName": {"group": "Track Management", "reapy": []}, "TrackList_AdjustWindows": {"group": "FX Management", "reapy": []}, "SplitMediaItem": {"group": "Item Management", "reapy": ["Item.split"]}, "GetPlayState": {"group": "Transport Management", "reapy": ["Project.play_state"]}, "GetProjectStateChangeCount": {"group": "Project Management", "reapy": []}, "Master_NormalizePlayRate": {"group": "Transport Management", "reapy": []}, "CSurf_OnMuteChange": {"group": "Track Management", "reapy": []}, "IsTrackSelected": {"group": "Track Management", "reapy": ["Track.is_selected"]}, "GetMainHwnd": {"group": "User Interface", "reapy": ["get_main_window"]}, "CSurf_OnSelectedChange": {"group": "Track Management", "reapy": []}, "ShowMessageBox": {"group": "User Interface", "reapy": ["show_message_box"]}, "CSurf_ResetAllCachedVolPanStates": {"group": "Track Management", "reapy": []}, "Undo_BeginBlock": {"group": "Project Management", "reapy": ["Project.begin_undo_block"]}, "GetSet_LoopTimeRange2": {"group": "Transport Management", "reapy": ["Project.time_selection"]}, "EnumProjectMarkers2": {"group": "Marker and Region Management", "reapy": ["Project.markers", "Project.regions"]}, "GetSetMediaTrackInfo_String": {"group": "Track Management", "reapy": []}, "ClearPeakCache": {"group": "API Helper Functions", "reapy": ["clear_peak_cache"]}, "GetFocusedFX": {"group": "FX Management", "reapy": ["Project.focused_fx"]}, "TimeMap_curFrameRate": {"group": "Other", "reapy": []}, "GetSetEnvelopeState2": {"group": "Envelope Management", "reapy": ["DEPRECATED"]}, "HasExtState": {"group": "Extended States", "reapy": ["has_ext_state"]}, "TrackFX_SetEQBandEnabled": {"group": "FX Management", "reapy": []}, "GetLastTouchedTrack": {"group": "Track Management", "reapy": ["get_last_touched_track"]}, "GetTakeNumStretchMarkers": {"group": "Marker and Region Management", "reapy": []}, "SetTrackStateChunk": {"group": "Track Management", "reapy": []}, "TimeMap_GetTimeSigAtTime": {"group": "Other", "reapy": []}, "DockIsChildOfDock": {"group": "User Interface", "reapy": []}, "GetPeakFileNameEx": {"group": "Audio Management", "reapy": []}, "GetSelectedTrackEnvelope": {"group": "Envelope Management", "reapy": ["Project.selected_envelope"]}, "ShowActionList": {"group": "API Helper Functions", "reapy": []}, "GetSet_ArrangeView2": {"group": "Arrangeview Management", "reapy": []}, "DockWindowAdd": {"group": "User Interface", "reapy": []}, "GetSelectedTrack2": {"group": "Track Management", "reapy": ["Project.selected_tracks", "Project.get_selected_track"]}, "MIDI_SetNote": {"group": "MIDI Management", "reapy": []}, "GetAllProjectPlayStates": {"group": "Transport Management", "reapy": ["get_projects", "Project.play_state"]}, "TimeMap2_GetDividedBpmAtTime": {"group": "Other", "reapy": []}, "CSurf_GoEnd": {"group": "Transport Management", "reapy": []}, "GetTrackSendInfo_Value": {"group": "Track Management", "reapy": ["Send"]}, "Envelope_Evaluate": {"group": "Envelope Management", "reapy": ["Envelope.get_value", "Envelope.get_derivatives"]}, "AddMediaItemToTrack": {"group": "Item Management", "reapy": ["Track.add_item"]}, "AudioAccessorValidateState": {"group": "Audio Management", "reapy": ["AudioAccessor.has_state_changed"]}, "CSurf_OnVolumeChange": {"group": "Track Management", "reapy": []}, "TakeFX_GetPinMappings": {"group": "FX Management", "reapy": []}, "Audio_Quit": {"group": "Audio/MIDI Device Management", "reapy": ["audio.quit"]}, "mkvolpanstr": {"group": "API Helper Functions", "reapy": []}, "GetMasterMuteSoloFlags": {"group": "Track Management", "reapy": ["DEPRECATED"]}, "GetSetRepeatEx": {"group": "Transport Management", "reapy": ["TimeSelection.looping", "TimeSelection.loop", "TimeSelection.unloop"]}, "ApplyNudge": {"group": "Item Management", "reapy": []}, "ValidatePtr": {"group": "API Helper Functions", "reapy": []}, "CountTakes": {"group": "Item Management", "reapy": ["Item.n_takes"]}, "GetMediaSourceParent": {"group": "Audio Management", "reapy": []}, "GetSetMediaItemInfo_String": {"group": "Item Management", "reapy": []}, "TakeFX_GetParamName": {"group": "FX Management", "reapy": ["FXParam.name"]}, "MIDIEditor_GetTake": {"group": "MIDI Management", "reapy": ["MIDIEditor.take"]}, "TrackCtl_SetToolTip": {"group": "User Interface", "reapy": []}, "genGuid": {"group": "API Helper Functions", "reapy": []}, "CSurf_OnWidthChange": {"group": "Track Management", "reapy": []}, "SetCursorContext": {"group": "Arrangeview Management", "reapy": []}, "SelectProjectInstance": {"group": "Project Management", "reapy": ["Project.make_current_project"]}, "GetSetTrackState2": {"group": "Track Management", "reapy": ["DEPRECATED"]}, "format_timestr": {"group": "API Helper Functions", "reapy": []}, "TrackFX_Show": {"group": "Track Management", "reapy": ["FX.open_chain", "FX.open_floating_window", "FX.close_chain", "FX.close_floating_window"]}, "TrackFX_SetParam": {"group": "FX Management", "reapy": ["FX.params"]}, "TakeFX_SetOffline": {"group": "FX Management", "reapy": ["FX.make_online", "FX.make_offline"]}, "GetSelectedTrack": {"group": "Track Management", "reapy": ["Project.selected_tracks", "Project.get_selected_track"]}, "SetProjectGrid": {"group": "Project Management", "reapy": []}, "CountEnvelopePoints": {"group": "Envelope Management", "reapy": ["Envelope.n_points"]}, "CSurf_OnTempoChange": {"group": "Project Management", "reapy": []}, "MIDI_InsertNote": {"group": "MIDI Management", "reapy": ["Take.add_note"]}, "GetTakeStretchMarkerSlope": {"group": "Marker and Region Management", "reapy": []}, "GetNumTracks": {"group": "Track Management", "reapy": ["Project.n_tracks"]}, "GetProjectPathEx": {"group": "Project Management", "reapy": ["Project.path"]}, "AddProjectMarker2": {"group": "Marker and Region Management", "reapy": ["Project.add_marker", "Project.add_region"]}, "SetProjectMarker4": {"group": "Marker and Region Management", "reapy": ["Marker", "Region"]}, "GetArmedCommand": {"group": "Other", "reapy": ["get_armed_command"]}, "OnStopButton": {"group": "Transport Management", "reapy": ["Project.stop"]}, "TrackFX_AddByName": {"group": "FX Management", "reapy": ["Track.add_fx"]}, "EnumTrackMIDIProgramNames": {"group": "MIDI Management", "reapy": []}, "SetEnvelopeStateChunk": {"group": "Envelope Management", "reapy": []}, "defer": {"group": "Deferring Function Calls", "reapy": ["defer"]}, "SetItemStateChunk": {"group": "Item Management", "reapy": []}, "APITest": {"group": "API Helper Functions", "reapy": []}, "ReorderSelectedTracks": {"group": "Track Management", "reapy": []}, "GetMediaSourceNumChannels": {"group": "Audio Management", "reapy": ["Source.n_channels"]}, "MIDI_SetTextSysexEvt": {"group": "MIDI Management", "reapy": []}, "TrackFX_SetNamedConfigParm": {"group": "FX Management", "reapy": []}, "ClearConsole": {"group": "API Helper Functions", "reapy": ["clear_console"]}, "file_exists": {"group": "File Management", "reapy": ["os.path.isfile"]}, "MIDI_InsertEvt": {"group": "MIDI Management", "reapy": []}, "MIDI_GetProjTimeFromPPQPos": {"group": "MIDI Management", "reapy": ["Take.ppq_to_time"]}, "mkvolstr": {"group": "API Helper Functions", "reapy": []}, "CSurf_OnFwd": {"group": "Transport Management", "reapy": []}, "CSurf_ScrubAmt": {"group": "Transport Management", "reapy": []}, "CSurf_OnRecvVolumeChange": {"group": "Track Management", "reapy": []}, "Main_SaveProject": {"group": "Project Management", "reapy": ["Project.save"]}, "joystick_enum": {"group": "Joystick Management", "reapy": []}, "EnumProjExtState": {"group": "Project Management", "reapy": []}, "TrackFX_SetParamNormalized": {"group": "FX Management", "reapy": ["FXParam.normalized"]}, "EnumerateFiles": {"group": "File Management", "reapy": ["os.listdir"]}, "CSurf_SetSurfacePan": {"group": "Track Management", "reapy": []}, "MIDI_InsertTextSysexEvt": {"group": "MIDI Management", "reapy": []}, "GetInputChannelName": {"group": "Audio/MIDI Device Management", "reapy": ["audio.get_input_names"]}, "GetActiveTake": {"group": "Item Management", "reapy": ["Item.active_take"]}, "Master_GetPlayRate": {"group": "Transport Management", "reapy": ["Project.play_rate"]}, "GetMediaItemTake": {"group": "Item Management", "reapy": ["Item.takes", "Item.get_take"]}, "GetProjectLength": {"group": "Project Management", "reapy": ["Project.length"]}, "stringToGuid": {"group": "API Helper Functions", "reapy": []}, "GetMediaItemTrack": {"group": "Track Management", "reapy": ["Item.track"]}, "HasTrackMIDIPrograms": {"group": "MIDI Management", "reapy": []}, "GetTakeName": {"group": "Item Management", "reapy": ["Take.name"]}, "AddTempoTimeSigMarker": {"group": "Marker and Region Management", "reapy": ["DEPRECATED"]}, "TrackFX_GetCount": {"group": "FX Management", "reapy": ["Track.n_fxs"]}, "GetLastTouchedFX": {"group": "FX Management", "reapy": ["Project.last_touched_fx"]}, "TakeFX_GetFormattedParamValue": {"group": "FX Management", "reapy": ["FXParam.formatted"]}, "GetMediaItemTake_Track": {"group": "Item Management", "reapy": ["Take.track"]}, "SetTakeStretchMarkerSlope": {"group": "Marker and Region Management", "reapy": []}, "TrackFX_GetParam": {"group": "FX Management", "reapy": ["FX.params"]}, "OnPauseButton": {"group": "Transport Management", "reapy": ["Project.pause"]}, "MIDI_InsertCC": {"group": "MIDI Management", "reapy": []}, "MarkProjectDirty": {"group": "Project Management", "reapy": ["Project.mark_dirty"]}, "GetTake": {"group": "Item Management", "reapy": ["Item.takes"]}, "parse_timestr_pos": {"group": "API Helper Functions", "reapy": []}, "CSurf_SetSurfaceSelected": {"group": "Track Management", "reapy": []}, "MIDI_EnumSelTextSysexEvts": {"group": "MIDI Management", "reapy": []}, "TakeFX_CopyToTrack": {"group": "FX Management", "reapy": ["FX.copy_to_track", "FX.move_to_track"]}, "GetNumAudioOutputs": {"group": "Audio/MIDI Device Management", "reapy": ["audio.get_n_outputs"]}, "ShowPopupMenu": {"group": "User Interface", "reapy": []}, "TakeFX_Delete": {"group": "FX Management", "reapy": ["FX.delete"]}, "EnumProjectMarkers": {"group": "Marker and Region Management", "reapy": ["Project.markers", "Project.regions"]}, "TrackList_UpdateAllExternalSurfaces": {"group": "Other", "reapy": []}, "SetTrackMIDINoteName": {"group": "MIDI Management", "reapy": []}, "EnumRegionRenderMatrix": {"group": "Project Management", "reapy": ["Region.rendered_tracks"]}, "CSurf_FlushUndo": {"group": "Other", "reapy": []}, "GetSetProjectNotes": {"group": "Project Management", "reapy": []}, "CSurf_TrackFromID": {"group": "Track Management", "reapy": []}, "OnPauseButtonEx": {"group": "Transport Management", "reapy": ["Project.pause"]}, "ScaleToEnvelopeMode": {"group": "Envelope Management", "reapy": []}, "GetEnvelopePointByTimeEx": {"group": "Envelope Management", "reapy": []}, "SetActiveTake": {"group": "Item Management", "reapy": ["Take.make_active_take"]}, "GetInputOutputLatency": {"group": "Audio/MIDI Device Management", "reapy": ["audio.get_input_latency", "audio.get_output_latency"]}, "GetPlayPosition2Ex": {"group": "Transport Management", "reapy": ["Project.buffer_position"]}, "MIDI_GetTextSysexEvt": {"group": "MIDI Management", "reapy": []}, "GetProjectPath": {"group": "Project Management", "reapy": ["Project.path"]}, "TakeFX_GetNamedConfigParm": {"group": "FX Management", "reapy": []}, "SetMediaItemTake_Source": {"group": "Item Management", "reapy": []}, "GetTakeEnvelope": {"group": "Envelope Management", "reapy": ["Take.envelopes"]}, "GetToggleCommandStateEx": {"group": "API Helper Functions", "reapy": []}, "SetProjectMarkerByIndex": {"group": "Marker and Region Management", "reapy": ["Marker", "Region"]}, "Audio_IsPreBuffer": {"group": "Audio/MIDI Device Management", "reapy": ["audio.is_prebuffer"]}, "TrackFX_FormatParamValueNormalized": {"group": "FX Management", "reapy": ["NormalizedFXParam.format_value"]}, "GetFreeDiskSpaceForRecordPath": {"group": "Project Management", "reapy": []}, "GetMediaSourceFileName": {"group": "Audio Management", "reapy": ["Source.filename"]}, "BypassFxAllTracks": {"group": "Track Management", "reapy": ["Project.bypass_fx_on_all_tracks"]}, "RecursiveCreateDirectory": {"group": "API Helper Functions", "reapy": ["os.makedirs"]}, "CSurf_SetTrackListChange": {"group": "Other", "reapy": []}, "TrackFX_GetParamNormalized": {"group": "FX Management", "reapy": ["FXParam.normalized"]}, "Undo_OnStateChange": {"group": "Project Management", "reapy": []}, "MIDI_CountEvts": {"group": "MIDI Management", "reapy": ["Take.n_cc", "Take.n_notes", "Take.n_text_sysex"]}, "SetTrackSelected": {"group": "Track Management", "reapy": ["Track.is_selected", "Track.select", "Track.unselect"]}, "get_ini_file": {"group": "API Helper Functions", "reapy": ["get_ini_file"]}, "CSurf_OnZoom": {"group": "Arrangeview Management", "reapy": []}, "PCM_Source_GetPeaks": {"group": "Audio Management", "reapy": []}, "TrackFX_GetRecCount": {"group": "FX Management", "reapy": []}, "TrackFX_GetEnabled": {"group": "FX Management", "reapy": ["FX.is_enabled"]}, "GetMIDIOutputName": {"group": "Audio/MIDI Device Management", "reapy": ["midi.get_output_names"]}, "GetItemStateChunk": {"group": "Item Management", "reapy": []}, "GetMediaItemTake_Item": {"group": "Item Management", "reapy": ["Take.item"]}, "TrackFX_GetChainVisible": {"group": "FX Management", "reapy": ["Track.visible_fx"]}, "GetSetItemState2": {"group": "Item Management", "reapy": ["DEPRECATED"]}, "ValidatePtr2": {"group": "API Helper Functions", "reapy": []}, "CSurf_OnRecord": {"group": "Transport Management", "reapy": []}, "SetGlobalAutomationOverride": {"group": "Envelope Management", "reapy": ["set_global_automation_mode"]}, "GetMediaItemInfo_Value": {"group": "Item Management", "reapy": ["Item.get_info_value"]}, "CountTakeEnvelopes": {"group": "Item Management", "reapy": ["Take.n_envelopes"]}, "CSurf_OnInputMonitorChange": {"group": "Track Management", "reapy": []}, "TrackFX_SetPinMappings": {"group": "FX Management", "reapy": []}, "DeleteExtState": {"group": "Extended States", "reapy": ["delete_ext_state"]}, "TimeMap2_timeToBeats": {"group": "Other", "reapy": []}, "GetEnvelopePoint": {"group": "Envelope Management", "reapy": []}, "GetTrackUIVolPan": {"group": "Track Management", "reapy": []}, "GetProjExtState": {"group": "Project Management", "reapy": []}, "MIDIEditor_GetSetting_str": {"group": "MIDI Management", "reapy": ["MIDIEditor"]}, "CSurf_SetRepeatState": {"group": "Transport Management", "reapy": []}, "IsProjectDirty": {"group": "Project Management", "reapy": ["Project.is_dirty"]}, "Undo_OnStateChangeEx2": {"group": "Project Management", "reapy": []}, "CountMediaItems": {"group": "Item Management", "reapy": ["Project.n_items"]}, "resolve_fn": {"group": "API Helper Functions", "reapy": []}, "GetCursorContext": {"group": "Arrangeview Management", "reapy": []}, "GetTrackEnvelope": {"group": "Envelope Management", "reapy": ["Track.envelopes"]}, "GetTrackColor": {"group": "Track Management", "reapy": ["Track.color"]}, "CSurf_OnPanChangeEx": {"group": "Track Management", "reapy": []}, "DockWindowRefreshForHWND": {"group": "User Interface", "reapy": []}, "RenderFileSection": {"group": "Other", "reapy": []}, "GetItemProjectContext": {"group": "Item Management", "reapy": ["Item.project"]}, "CSurf_OnPlay": {"group": "Transport Management", "reapy": []}, "Audio_Init": {"group": "Audio/MIDI Device Management", "reapy": ["audio.init"]}, "TakeFX_GetParamEx": {"group": "FX Management", "reapy": ["FX.params"]}, "CountEnvelopePointsEx": {"group": "Envelope Management", "reapy": ["AutomationItem.n_points"]}, "TakeFX_GetIOSize": {"group": "FX Management", "reapy": ["FX.n_inputs", "FX.n_outputs"]}, "GetTempoTimeSigMarker": {"group": "Marker and Region Management", "reapy": []}, "GetAppVersion": {"group": "API Helper Functions", "reapy": ["get_reaper_version"]}, "CountSelectedTracks": {"group": "Track Management", "reapy": ["Project.n_selected_tracks"]}, "GetSetProjectGrid": {"group": "Project Management", "reapy": []}, "TakeIsMIDI": {"group": "MIDI Management", "reapy": ["Take.is_midi"]}, "TrackFX_GetFormattedParamValue": {"group": "FX Management", "reapy": ["FXParam.formatted"]}, "TakeFX_GetOpen": {"group": "FX Management", "reapy": ["FX.is_ui_open"]}, "MIDI_Sort": {"group": "MIDI Management", "reapy": []}, "ReaScriptError": {"group": "API Helper Functions", "reapy": []}, "SnapToGrid": {"group": "Project Management", "reapy": []}, "TrackFX_GetEQBandEnabled": {"group": "FX Management", "reapy": []}, "SetProjExtState": {"group": "Project Management", "reapy": []}, "ArmCommand": {"group": "Other", "reapy": ["arm_command", "disarm_command"]}, "TrackFX_GetEQ": {"group": "FX Management", "reapy": []}, "TakeFX_GetParam": {"group": "FX Management", "reapy": ["FX.params"]}, "joystick_getbuttonmask": {"group": "Joystick Management", "reapy": []}, "GetEnvelopeScalingMode": {"group": "Envelope Management", "reapy": []}, "CSurf_SetAutoMode": {"group": "Envelope Management", "reapy": []}, "MIDI_DeleteTextSysexEvt": {"group": "MIDI Management", "reapy": []}, "TrackFX_GetRecChainVisible": {"group": "FX Management", "reapy": []}, "GetTrackStateChunk": {"group": "Track Management", "reapy": []}, "CreateNewMIDIItemInProj": {"group": "Item Management", "reapy": ["Track.add_midi_item"]}, "Envelope_SortPoints": {"group": "Envelope Management", "reapy": []}, "MuteAllTracks": {"group": "Transport Management", "reapy": ["Project.mute_all_tracks", "Project.unmute_all_tracks"]}, "TimeMap_QNToTime": {"group": "Other", "reapy": ["Project.beats_to_time"]}, "GetTooltipWindow": {"group": "User Interface", "reapy": []}, "GetMediaSourceSampleRate": {"group": "Audio Management", "reapy": ["Source.sample_rate"]}, "SetTempoTimeSigMarker": {"group": "Marker and Region Management", "reapy": []}, "CountTrackEnvelopes": {"group": "Envelope Management", "reapy": ["Track.n_envelopes"]}, "TrackFX_SetOpen": {"group": "Track Management", "reapy": ["FX.open_ui", "FX.close_ui"]}, "GetAudioAccessorHash": {"group": "Audio Management", "reapy": ["AudioAccessor.hash"]}, "CSurf_SetPlayState": {"group": "Transport Management", "reapy": []}, "TrackFX_SetOffline": {"group": "FX Management", "reapy": ["FX.make_online", "FX.make_offline"]}, "TimeMap2_QNToTime": {"group": "Other", "reapy": ["Project.beats_to_time"]}, "adjustZoom": {"group": "Arrangeview Management", "reapy": []}, "MIDI_GetNote": {"group": "MIDI Management", "reapy": []}, "GetGlobalAutomationOverride": {"group": "Envelope Management", "reapy": ["get_global_automation_mode"]}, "Master_GetTempo": {"group": "Transport Management", "reapy": ["Project.bpm"]}, "PCM_Sink_Enum": {"group": "Audio Management", "reapy": []}, "parsepanstr": {"group": "API Helper Functions", "reapy": []}, "CountSelectedTracks2": {"group": "Track Management", "reapy": ["Project.n_selected_tracks"]}, "MIDI_SetCC": {"group": "MIDI Management", "reapy": []}, "SetAutomationMode": {"group": "Envelope Management", "reapy": []}, "DeleteTempoTimeSigMarker": {"group": "Marker and Region Management", "reapy": []}, "GetSetRepeat": {"group": "Transport Management", "reapy": ["TimeSelection.is_looping", "TimeSelection.loop", "TimeSelection.unloop"]}, "TakeFX_GetPreset": {"group": "FX Management", "reapy": ["FX.preset"]}, "TakeFX_CopyToTake": {"group": "FX Management", "reapy": ["FX.copy_to_take", "FX.move_to_take"]}, "TakeFX_SetParamNormalized": {"group": "FX Management", "reapy": ["FXParam.normalized"]}, "ClearAllRecArmed": {"group": "Track Management", "reapy": ["Project.disarm_rec_on_all_tracks"]}, "Audio_IsRunning": {"group": "Audio/MIDI Device Management", "reapy": ["audio.is_running"]}, "TakeFX_SetPresetByIndex": {"group": "FX Management", "reapy": ["FX.preset"]}, "SetEditCurPos": {"group": "Transport Management", "reapy": ["Project.cursor_position"]}, "CSurf_SetSurfaceSolo": {"group": "Track Management", "reapy": []}, "GetTrackDepth": {"group": "Track Management", "reapy": ["Track.depth"]}, "CSurf_TrackToID": {"group": "Track Management", "reapy": []}, "CSurf_OnRecArmChange": {"group": "Track Management", "reapy": []}, "CSurf_OnRewFwd": {"group": "Transport Management", "reapy": []}, "TrackFX_GetOffline": {"group": "FX Management", "reapy": ["FX.is_online"]}, "GetTrackState": {"group": "Track Management", "reapy": []}, "GetTrackSendUIVolPan": {"group": "Track Management", "reapy": []}, "SetTrackMIDINoteNameEx": {"group": "MIDI Management", "reapy": []}, "ReverseNamedCommandLookup": {"group": "API Helper Functions", "reapy": ["get_command_name"]}, "ColorFromNative": {"group": "API Helper Functions", "reapy": ["rgb_from_native"]}, "EnumProjects": {"group": "Project Management", "reapy": ["Project"]}, "TrackFX_GetPreset": {"group": "FX Management", "reapy": ["FX.preset"]}, "GetTakeStretchMarker": {"group": "Marker and Region Management", "reapy": []}, "MIDI_GetProjQNFromPPQPos": {"group": "MIDI Management", "reapy": []}, "Envelope_FormatValue": {"group": "Envelope Management", "reapy": ["Envelope.get_value", "Envelope.get_derivatives"]}, "InsertEnvelopePoint": {"group": "Envelope Management", "reapy": []}, "SetMouseModifier": {"group": "User Interface", "reapy": []}, "GetTrackEnvelopeByChunkName": {"group": "Envelope Management", "reapy": ["Track.envelopes"]}, "CountTCPFXParms": {"group": "Track Management", "reapy": []}, "CreateTrackSend": {"group": "Track Management", "reapy": ["Track.add_send"]}, "TrackFX_GetPinMappings": {"group": "FX Management", "reapy": []}} \ No newline at end of file +{"GetProjectTimeSignature": {"group": "Marker and Region Management", "reapy": ["DEPRECATED"]}, "CountTracks": {"group": "Track Management", "reapy": ["Project.n_tracks"]}, "SetMixerScroll": {"group": "User Interface", "reapy": ["ui.set_leftmost_track_in_mixer"]}, "ScaleFromEnvelopeMode": {"group": "Envelope Management", "reapy": []}, "SetCurrentBPM": {"group": "Project Management", "reapy": ["Project.bpm"]}, "RefreshToolbar": {"group": "User Interface", "reapy": []}, "TrackFX_GetPresetIndex": {"group": "FX Management", "reapy": ["FX.preset_index"]}, "GetTrackGUID": {"group": "Track Management", "reapy": []}, "OnPlayButton": {"group": "Transport Management", "reapy": ["Project.play"]}, "SetRegionRenderMatrix": {"group": "Other", "reapy": ["Region.add_rendered_track", "Region.remove_rendered_track"]}, "TimeMap_timeToQN_abs": {"group": "Other", "reapy": []}, "GetMediaSourceType": {"group": "Audio Management", "reapy": ["Source.type"]}, "SLIDER2DB": {"group": "API Helper Functions", "reapy": ["slider_to_dB"]}, "GetUserInputs": {"group": "User Interface", "reapy": []}, "TrackFX_GetParameterStepSizes": {"group": "FX Management", "reapy": []}, "SetTrackMIDILyrics": {"group": "MIDI Management", "reapy": []}, "Main_OnCommandEx": {"group": "API Helper Functions", "reapy": ["Project.perform_action"]}, "SetEnvelopePointEx": {"group": "Envelope Management", "reapy": []}, "MIDI_GetGrid": {"group": "MIDI Management", "reapy": []}, "TakeFX_GetCount": {"group": "FX Management", "reapy": ["Take.n_fxs"]}, "MIDI_SetItemExtents": {"group": "MIDI Management", "reapy": []}, "EnumTrackMIDIProgramNamesEx": {"group": "MIDI Management", "reapy": []}, "RefreshToolbar2": {"group": "User Interface", "reapy": []}, "CreateTakeAudioAccessor": {"group": "Audio Management", "reapy": ["Take.add_audio_accessor"]}, "GetPlayStateEx": {"group": "Transport Management", "reapy": ["Project.play_state"]}, "resolve_fn2": {"group": "API Helper Functions", "reapy": []}, "Help_Set": {"group": "Other", "reapy": []}, "Loop_OnArrow": {"group": "Transport Management", "reapy": ["TimeSelection.shift"]}, "MIDI_DeleteCC": {"group": "MIDI Management", "reapy": []}, "Envelope_GetParentTrack": {"group": "Envelope Management", "reapy": ["Envelope.parent"]}, "GetItemEditingTime2": {"group": "Audio Management", "reapy": []}, "atexit": {"group": "Deferring Function Calls", "reapy": ["at_exit"]}, "GoToRegion": {"group": "Transport Management", "reapy": []}, "CountTrackMediaItems": {"group": "Item Management", "reapy": ["Track.n_items"]}, "GetSubProjectFromSource": {"group": "Audio Management", "reapy": []}, "CSurf_OnPlayRateChange": {"group": "Transport Management", "reapy": []}, "TimeMap2_beatsToTime": {"group": "Other", "reapy": []}, "SetProjectMarkerByIndex2": {"group": "Marker and Region Management", "reapy": ["Marker", "Region"]}, "GetTempoMatchPlayRate": {"group": "Audio Management", "reapy": []}, "TrackFX_CopyToTrack": {"group": "FX Management", "reapy": ["FX.copy_to_track", "FX.move_to_track"]}, "PCM_Sink_ShowConfig": {"group": "Audio Management", "reapy": []}, "GSC_mainwnd": {"group": "User Interface", "reapy": []}, "Undo_DoRedo2": {"group": "Project Management", "reapy": ["Project.redo"]}, "IsMediaExtension": {"group": "API Helper Functions", "reapy": []}, "UpdateTimeline": {"group": "Arrangeview Management", "reapy": ["update_timeline"]}, "TrackFX_SetEnabled": {"group": "FX Management", "reapy": ["FX.enable", "FX.disable"]}, "OpenMediaExplorer": {"group": "User Interface", "reapy": []}, "SetMIDIEditorGrid": {"group": "MIDI Management", "reapy": []}, "TrackFX_GetParamName": {"group": "FX Management", "reapy": ["FXParam.name"]}, "GetEnvelopeStateChunk": {"group": "Envelope Management", "reapy": []}, "MIDI_GetAllEvts": {"group": "MIDI Management", "reapy": []}, "CSurf_GoStart": {"group": "Transport Management", "reapy": []}, "GetTrackAutomationMode": {"group": "Envelope Management", "reapy": ["Track.automation_mode"]}, "Resample_EnumModes": {"group": "Audio Management", "reapy": []}, "TrackFX_GetNumParams": {"group": "FX Management", "reapy": ["FX.n_params"]}, "TimeMap_QNToTime_abs": {"group": "Other", "reapy": []}, "midi_reinit": {"group": "MIDI Management", "reapy": ["midi.reinit"]}, "MoveEditCursor": {"group": "Transport Management", "reapy": []}, "relative_fn": {"group": "API Helper Functions", "reapy": []}, "SetToggleCommandState": {"group": "API Helper Functions", "reapy": []}, "GetTrackMIDILyrics": {"group": "MIDI Management", "reapy": []}, "PCM_Sink_GetExtension": {"group": "Audio Management", "reapy": []}, "CSurf_OnFXChange": {"group": "Track Management", "reapy": []}, "TrackFX_SetPreset": {"group": "FX Management", "reapy": ["FX.preset"]}, "MIDI_GetTrackHash": {"group": "MIDI Management", "reapy": []}, "Undo_DoUndo2": {"group": "Project Management", "reapy": ["Project.undo"]}, "GetMediaItem": {"group": "Item Management", "reapy": ["Project.items"]}, "CSurf_OnPause": {"group": "Transport Management", "reapy": []}, "GetPlayPosition2": {"group": "Transport Management", "reapy": ["Project.buffer_position"]}, "MIDI_EnumSelNotes": {"group": "MIDI Management", "reapy": []}, "MIDI_GetScale": {"group": "MIDI Management", "reapy": []}, "ShowConsoleMsg": {"group": "API Helper Functions", "reapy": ["print", "show_console_message"]}, "PreventUIRefresh": {"group": "User Interface", "reapy": []}, "SetMediaItemSelected": {"group": "Item Management", "reapy": []}, "CSurf_OnSendPanChange": {"group": "Track Management", "reapy": []}, "Track_GetPeakHoldDB": {"group": "Track Management", "reapy": []}, "TrackFX_SetPresetByIndex": {"group": "FX Management", "reapy": ["FX.preset"]}, "joystick_getaxis": {"group": "Joystick Management", "reapy": []}, "EditTempoTimeSigMarker": {"group": "Marker and Region Management", "reapy": []}, "MIDIEditor_OnCommand": {"group": "MIDI Management", "reapy": ["MIDIEditor.perform_action"]}, "joystick_getpov": {"group": "Joystick Management", "reapy": []}, "GetMediaItem_Track": {"group": "Track Management", "reapy": ["Item.track"]}, "mkpanstr": {"group": "API Helper Functions", "reapy": []}, "format_timestr_pos": {"group": "API Helper Functions", "reapy": []}, "Envelope_GetParentTake": {"group": "Envelope Management", "reapy": ["Envelope.parent"]}, "TakeFX_GetFloatingWindow": {"group": "FX Management", "reapy": ["FX.window"]}, "MIDI_DeleteEvt": {"group": "MIDI Management", "reapy": []}, "CSurf_OnInputMonitorChangeEx": {"group": "Track Management", "reapy": []}, "DeleteTrackMediaItem": {"group": "Item Management", "reapy": ["Item.delete"]}, "EnumerateSubdirectories": {"group": "File Management", "reapy": ["os.listdir"]}, "GetSelectedMediaItem": {"group": "Item Management", "reapy": ["Project.selected_items", "Project.get_selected_item"]}, "SetProjectMarker3": {"group": "Marker and Region Management", "reapy": ["Marker", "Region"]}, "TakeFX_SetOpen": {"group": "FX Management", "reapy": ["FX.open_ui", "FX.close_ui"]}, "CSurf_OnSoloChange": {"group": "Track Management", "reapy": []}, "GetPeakFileName": {"group": "Audio Management", "reapy": []}, "MIDI_SetAllEvts": {"group": "MIDI Management", "reapy": []}, "GetMediaItemTakeInfo_Value": {"group": "Item Management", "reapy": ["Take.get_info_value"]}, "TimeMap_QNToMeasures": {"group": "Other", "reapy": []}, "TrackFX_GetFXGUID": {"group": "FX Management", "reapy": []}, "time_precise": {"group": "API Helper Functions", "reapy": ["time.time"]}, "InsertTrackAtIndex": {"group": "Track Management", "reapy": ["Project.add_track"]}, "Master_GetPlayRateAtTime": {"group": "Transport Management", "reapy": ["Project.get_play_rate"]}, "DockWindowActivate": {"group": "User Interface", "reapy": []}, "GetMousePosition": {"group": "User Interface", "reapy": []}, "SetEditCurPos2": {"group": "Transport Management", "reapy": ["Project.cursor_position"]}, "TimeMap_GetDividedBpmAtTime": {"group": "Other", "reapy": []}, "GetTrackNumSends": {"group": "Track Management", "reapy": ["Track.n_sends", "Track.n_receives"]}, "GetOutputChannelName": {"group": "Audio/MIDI Device Management", "reapy": ["audio.get_output_names"]}, "CSurf_OnStop": {"group": "Track Management", "reapy": []}, "SoloAllTracks": {"group": "Track Management", "reapy": ["Project.solo_all_tracks", "Project.unsolo_all_tracks"]}, "GetTrackReceiveUIMute": {"group": "Track Management", "reapy": []}, "EnsureNotCompletelyOffscreen": {"group": "Other", "reapy": []}, "GetLastMarkerAndCurRegion": {"group": "Marker and Region Management", "reapy": []}, "MIDI_EnumSelCC": {"group": "MIDI Management", "reapy": []}, "PCM_Source_Destroy": {"group": "Audio Management", "reapy": ["Source.delete"]}, "MIDI_GetHash": {"group": "MIDI Management", "reapy": []}, "CountTempoTimeSigMarkers": {"group": "Marker and Region Management", "reapy": ["Project.n_tempo_markers"]}, "TrackFX_GetInstrument": {"group": "FX Management", "reapy": ["Track.instrument"]}, "SetTakeStretchMarker": {"group": "Marker and Region Management", "reapy": []}, "DockWindowAddEx": {"group": "User Interface", "reapy": []}, "SetMediaItemPosition": {"group": "Item Management", "reapy": ["Item.position"]}, "guidToString": {"group": "API Helper Functions", "reapy": []}, "TrackFX_NavigatePresets": {"group": "FX Management", "reapy": ["FX.use_next_preset", "FX.use_previous_preset"]}, "InsertMedia": {"group": "Audio Management", "reapy": []}, "CSurf_OnSoloChangeEx": {"group": "Track Management", "reapy": []}, "TakeFX_EndParamEdit": {"group": "FX Management", "reapy": []}, "SetExtState": {"group": "Extended States", "reapy": ["set_ext_state"]}, "CSurf_OnMuteChangeEx": {"group": "Track Management", "reapy": []}, "Main_openProject": {"group": "Project Management", "reapy": ["open_project"]}, "GetLastColorThemeFile": {"group": "User Interface", "reapy": ["ui.get_color_theme"]}, "TrackFX_FormatParamValue": {"group": "FX Management", "reapy": ["FXParam.format_value"]}, "TakeFX_SetNamedConfigParm": {"group": "FX Management", "reapy": []}, "TakeFX_SetParam": {"group": "FX Management", "reapy": ["FX.params"]}, "MIDI_SetEvt": {"group": "MIDI Management", "reapy": []}, "ViewPrefs": {"group": "User Interface", "reapy": ["view_prefs"]}, "GetTCPFXParm": {"group": "FX Management", "reapy": []}, "GetMediaSourceLength": {"group": "Audio Management", "reapy": ["Source.length"]}, "parse_timestr_len": {"group": "API Helper Functions", "reapy": []}, "GetAudioAccessorEndTime": {"group": "Audio Management", "reapy": ["AudioAccessor.end_time"]}, "RemoveTrackSend": {"group": "Track Management", "reapy": ["Send.delete"]}, "GetTrackNumMediaItems": {"group": "Track Management", "reapy": ["Track.n_items"]}, "GetResourcePath": {"group": "API Helper Functions", "reapy": ["get_resource_path"]}, "ToggleTrackSendUIMute": {"group": "API Helper Functions", "reapy": []}, "GetMediaItemTake_Source": {"group": "Item Management", "reapy": ["Take.source"]}, "CountSelectedMediaItems": {"group": "Item Management", "reapy": ["Project.n_selected_items"]}, "GetNumMIDIInputs": {"group": "Audio/MIDI Device Management", "reapy": ["midi.get_n_inputs"]}, "GetMasterTrack": {"group": "Track Management", "reapy": ["Project.master_track"]}, "GetTakeEnvelopeByName": {"group": "Envelope Management", "reapy": ["Take.envelopes"]}, "SetOnlyTrackSelected": {"group": "Track Management", "reapy": ["Track.make_only_selected_track"]}, "GetTrackEnvelopeByName": {"group": "Envelope Management", "reapy": ["Track.envelopes"]}, "DB2SLIDER": {"group": "API Helper Functions", "reapy": ["dB_to_slider"]}, "TrackFX_GetFloatingWindow": {"group": "FX Management", "reapy": ["FX.window"]}, "TakeFX_GetUserPresetFilename": {"group": "FX Management", "reapy": ["FX.preset_file"]}, "MIDI_GetPPQPosFromProjTime": {"group": "MIDI Management", "reapy": ["Take.time_to_ppq"]}, "MB": {"group": "User Interface", "reapy": ["reapy.show_message_box"]}, "EnumPitchShiftModes": {"group": "Pitch Shifting", "reapy": []}, "Track_GetPeakInfo": {"group": "Track Management", "reapy": []}, "DeleteProjectMarker": {"group": "Marker and Region Management", "reapy": ["Marker.delete", "Region.delete"]}, "GetCursorPositionEx": {"group": "Transport Management", "reapy": ["Project.cursor_position"]}, "MIDIEditor_LastFocused_OnCommand": {"group": "MIDI Management", "reapy": ["midi.get_active_editor", "MIDIEditor.perform_action"]}, "GetPeakFileNameEx2": {"group": "Audio Management", "reapy": []}, "TrackFX_EndParamEdit": {"group": "FX Management", "reapy": []}, "GetAudioAccessorStartTime": {"group": "Audio Management", "reapy": ["AudioAccessor.start_time"]}, "GetNumMIDIOutputs": {"group": "Audio/MIDI Device Management", "reapy": ["midi.get_n_outputs"]}, "CSurf_OnArrow": {"group": "Arrangeview Management", "reapy": []}, "AnyTrackSolo": {"group": "Track Management", "reapy": ["Project.any_track_solo"]}, "CSurf_SetSurfaceRecArm": {"group": "Track Management", "reapy": []}, "GetPlayPosition": {"group": "Transport Management", "reapy": ["Project.play_position"]}, "TakeFX_GetEnvelope": {"group": "FX Management", "reapy": ["FXParam.envelope", "FXParam.add_envelope"]}, "InsertAutomationItem": {"group": "Automation Management", "reapy": []}, "IsTrackVisible": {"group": "Track Management", "reapy": []}, "MIDI_EnumSelEvts": {"group": "MIDI Management", "reapy": []}, "MIDI_DeleteNote": {"group": "MIDI Management", "reapy": []}, "SetTrackAutomationMode": {"group": "Envelope Management", "reapy": ["Track.automation_mode"]}, "GetSetMediaItemTakeInfo_String": {"group": "Item Management", "reapy": []}, "GetProjectName": {"group": "Project Management", "reapy": ["Project.name"]}, "FindTempoTimeSigMarker": {"group": "Marker and Region Management", "reapy": []}, "Undo_EndBlock": {"group": "Project Management", "reapy": ["Project.end_undo_block"]}, "DeleteProjectMarkerByIndex": {"group": "Marker and Region Management", "reapy": ["Marker.delete", "Region.delete"]}, "TakeFX_GetFXGUID": {"group": "FX Management", "reapy": []}, "GetCursorContext2": {"group": "Arrangeview Management", "reapy": []}, "GetEnvelopeName": {"group": "Envelope Management", "reapy": ["Envelope.name"]}, "CSurf_OnVolumeChangeEx": {"group": "Track Management", "reapy": []}, "TakeFX_GetEnabled": {"group": "FX Management", "reapy": ["FX.is_enabled"]}, "GetSetItemState": {"group": "Item Management", "reapy": ["DEPRECATED"]}, "SetTrackSendInfo_Value": {"group": "Track Management", "reapy": ["Send"]}, "GetExtState": {"group": "Extended States", "reapy": ["get_ext_state"]}, "LICE_ClipLine": {"group": "User Interface", "reapy": []}, "GetDisplayedMediaItemColor2": {"group": "Item Management", "reapy": []}, "InsertMediaSection": {"group": "Audio Management", "reapy": []}, "MIDI_GetPPQPos_StartOfMeasure": {"group": "MIDI Management", "reapy": []}, "TakeFX_FormatParamValue": {"group": "FX Management", "reapy": ["FXParam.format_value"]}, "SetMediaItemTakeInfo_Value": {"group": "Item Management", "reapy": []}, "TakeFX_AddByName": {"group": "FX Management", "reapy": ["Take.add_fx"]}, "GetTrackName": {"group": "Track Management", "reapy": ["Track.name"]}, "Main_OnCommand": {"group": "API Helper Functions", "reapy": ["perform_action"]}, "SelectAllMediaItems": {"group": "Item Management", "reapy": ["Project.select_all_items"]}, "MoveMediaItemToTrack": {"group": "Item Management", "reapy": ["Item.track"]}, "TimeMap2_GetNextChangeTime": {"group": "Other", "reapy": []}, "CSurf_SetSurfaceMute": {"group": "Track Management", "reapy": []}, "GetSet_LoopTimeRange": {"group": "Transport Management", "reapy": ["Project.time_selection"]}, "format_timestr_len": {"group": "API Helper Functions", "reapy": []}, "TakeFX_GetOffline": {"group": "FX Management", "reapy": ["FX.is_online"]}, "CSurf_OnPanChange": {"group": "Track Management", "reapy": []}, "GetOS": {"group": "API Helper Functions", "reapy": []}, "GetEnvelopePointEx": {"group": "Envelope Management", "reapy": []}, "PCM_Source_CreateFromType": {"group": "Audio Management", "reapy": []}, "StuffMIDIMessage": {"group": "MIDI Management", "reapy": []}, "MIDIEditor_GetSetting_int": {"group": "MIDI Management", "reapy": ["MIDIEditor"]}, "GetProjectTimeOffset": {"group": "Project Management", "reapy": []}, "AddProjectMarker": {"group": "Marker and Region Management", "reapy": ["Project.add_marker", "Project.add_region"]}, "TimeMap_GetMetronomePattern": {"group": "Other", "reapy": []}, "GetFXEnvelope": {"group": "Envelope Management", "reapy": ["FXParam.envelope", "FXParam.add_envelope"]}, "MIDI_GetEvt": {"group": "MIDI Management", "reapy": []}, "SetTrackSendUIVol": {"group": "Track Management", "reapy": []}, "GetSelectedEnvelope": {"group": "Envelope Management", "reapy": ["Project.selected_envelope"]}, "SetMasterTrackVisibility": {"group": "Track Management", "reapy": []}, "TrackFX_GetIOSize": {"group": "FX Management", "reapy": ["FX.n_inputs", "FX.n_outputs"]}, "MIDIEditor_GetActive": {"group": "MIDI Management", "reapy": ["midi.get_active_editor"]}, "DeleteTakeStretchMarkers": {"group": "Marker and Region Management", "reapy": []}, "GetCurrentProjectInLoadSave": {"group": "Project Management", "reapy": []}, "SetTrackSendUIPan": {"group": "Track Management", "reapy": []}, "Undo_EndBlock2": {"group": "Project Management", "reapy": ["Project.end_undo_block"]}, "OnStopButtonEx": {"group": "Transport Management", "reapy": ["Project.stop"]}, "TrackFX_GetParamEx": {"group": "FX Management", "reapy": []}, "TakeFX_FormatParamValueNormalized": {"group": "FX Management", "reapy": ["NormalizedFXParam.format_value"]}, "DestroyAudioAccessor": {"group": "Audio Management", "reapy": ["AudioAccessor.delete"]}, "TrackFX_GetOpen": {"group": "Track Management", "reapy": ["FX.is_ui_open"]}, "CreateTrackAudioAccessor": {"group": "Audio Management", "reapy": ["Track.add_audio_accessor"]}, "Undo_CanUndo2": {"group": "Project Management", "reapy": ["Project.can_undo"]}, "CSurf_OnScroll": {"group": "Arrangeview Management", "reapy": []}, "parse_timestr": {"group": "API Helper Functions", "reapy": []}, "Undo_OnStateChange2": {"group": "Project Management", "reapy": []}, "GetTrackMIDINoteRange": {"group": "MIDI Management", "reapy": []}, "CountProjectMarkers": {"group": "Marker and Region Management", "reapy": ["Project.n_markers", "Project.n_regions"]}, "UpdateArrange": {"group": "Arrangeview Management", "reapy": ["update_arrange"]}, "TakeFX_Show": {"group": "FX Management", "reapy": ["FX.open_chain", "FX.open_floating_window", "FX.close_chain", "FX.close_floating_window"]}, "TrackFX_GetNamedConfigParm": {"group": "FX Management", "reapy": []}, "MediaItemDescendsFromTrack": {"group": "Other", "reapy": []}, "CSurf_OnWidthChangeEx": {"group": "Track Management", "reapy": []}, "GetMouseModifier": {"group": "User Interface", "reapy": []}, "TrackFX_GetUserPresetFilename": {"group": "FX Management", "reapy": ["FX.preset_file"]}, "TakeFX_SetPreset": {"group": "FX Management", "reapy": ["FX.preset"]}, "TakeFX_GetParamNormalized": {"group": "FX Management", "reapy": ["FXParam.normalized"]}, "DeleteTrack": {"group": "Track Management", "reapy": ["Track.delete"]}, "TakeFX_GetChainVisible": {"group": "FX Management", "reapy": ["Take.visible_fx"]}, "PCM_Source_CreateFromFile": {"group": "Audio Management", "reapy": []}, "TrackFX_CopyToTake": {"group": "FX Management", "reapy": ["FX.copy_to_take", "FX.move_to_take"]}, "joystick_update": {"group": "Joystick Management", "reapy": []}, "GetTrackSendUIMute": {"group": "Track Management", "reapy": []}, "AddRemoveReaScript": {"group": "API Helper Functions", "reapy": ["add_reascript", "remove_reascript"]}, "CSurf_OnRecvPanChange": {"group": "Track Management", "reapy": []}, "MIDI_SelectAll": {"group": "MIDI Management", "reapy": ["Take.select_all_midi_events", "Take.unselect_all_midi_events"]}, "TrackFX_GetFXName": {"group": "FX Management", "reapy": ["FX.name"]}, "TakeFX_GetFXName": {"group": "FX Management", "reapy": ["FX.name"]}, "PluginWantsAlwaysRunFx": {"group": "FX Management", "reapy": []}, "GetConfigWantsDock": {"group": "User Interface", "reapy": []}, "Dock_UpdateDockID": {"group": "User Interface", "reapy": []}, "EnumProjectMarkers3": {"group": "Marker and Region Management", "reapy": ["Project.markers", "Project.regions"]}, "GetMediaTrackInfo_Value": {"group": "Track Management", "reapy": []}, "DockWindowRemove": {"group": "User Interface", "reapy": []}, "DeleteEnvelopePointRangeEx": {"group": "Envelope Management", "reapy": ["AutomationItem.delete_points_in_range"]}, "ExecProcess": {"group": "API Helper Functions", "reapy": []}, "GetTrack": {"group": "Track Management", "reapy": ["Project.tracks"]}, "GetTrackMIDINoteName": {"group": "MIDI Management", "reapy": []}, "CountAutomationItems": {"group": "Automation Management", "reapy": ["Envelope.n_items"]}, "Master_NormalizeTempo": {"group": "Transport Management", "reapy": []}, "TakeFX_GetPresetIndex": {"group": "FX Management", "reapy": ["FX.preset_index"]}, "GetUserFileNameForRead": {"group": "User Interface", "reapy": ["browse_for_file"]}, "AddTakeToMediaItem": {"group": "Item Management", "reapy": ["Item.add_take"]}, "UpdateItemInProject": {"group": "Item Management", "reapy": ["Item.update"]}, "TrackFX_GetByName": {"group": "FX Management", "reapy": []}, "GetSetEnvelopeState": {"group": "Envelope Management", "reapy": ["DEPRECATED"]}, "GetTrackUIMute": {"group": "Track Management", "reapy": []}, "GetSetTrackGroupMembershipHigh": {"group": "Track Management", "reapy": []}, "GetNumAudioInputs": {"group": "Audio/MIDI Device Management", "reapy": ["audio.get_n_inputs"]}, "GR_SelectColor": {"group": "User Interface", "reapy": []}, "OpenColorThemeFile": {"group": "User Interface", "reapy": ["ui.set_color_theme"]}, "TakeFX_SetEnabled": {"group": "FX Management", "reapy": ["FX.enable", "FX.disable"]}, "CSurf_OnSendVolumeChange": {"group": "Track Management", "reapy": []}, "Undo_CanRedo2": {"group": "Project Management", "reapy": ["Project.can_redo"]}, "EnumPitchShiftSubModes": {"group": "Pitch Shifting", "reapy": []}, "GetSetAutomationItemInfo": {"group": "Automation Management", "reapy": ["AutomationItem.length", "AutomationItem.pool", "AutomationItem.position"]}, "ColorToNative": {"group": "API Helper Functions", "reapy": ["rgb_to_native"]}, "GetSetTrackState": {"group": "Track Management", "reapy": ["DEPRECATED"]}, "SetTrackColor": {"group": "Track Management", "reapy": ["Track.color"]}, "TakeFX_NavigatePresets": {"group": "FX Management", "reapy": ["FX.use_next_preset", "FX.use_previous_preset"]}, "DeleteEnvelopePointRange": {"group": "Envelope Management", "reapy": ["Envelope.delete_points_in_range"]}, "TakeFX_SetPinMappings": {"group": "FX Management", "reapy": []}, "my_getViewport": {"group": "User Interface", "reapy": []}, "Envelope_SortPointsEx": {"group": "Envelope Management", "reapy": []}, "GetMixerScroll": {"group": "User Interface", "reapy": ["ui.get_leftmost_track_in_mixer"]}, "DockWindowRefresh": {"group": "User Interface", "reapy": ["Window.refresh"]}, "GetDisplayedMediaItemColor": {"group": "Item Management", "reapy": []}, "GetTrackUIPan": {"group": "Track Management", "reapy": []}, "GetAudioAccessorSamples": {"group": "Audio Management", "reapy": ["AudioAccessor.get_samples"]}, "Undo_OnStateChangeEx": {"group": "Project Management", "reapy": []}, "image_resolve_fn": {"group": "API Helper Functions", "reapy": []}, "GetUnderrunTime": {"group": "Audio/MIDI Device Management", "reapy": []}, "PCM_Source_CreateFromFileEx": {"group": "Audio Management", "reapy": []}, "GetMaxMidiInputs": {"group": "Audio/MIDI Device Management", "reapy": ["midi.get_max_inputs"]}, "GetMIDIInputName": {"group": "Audio/MIDI Device Management", "reapy": ["midi.get_input_names"]}, "Undo_OnStateChange_Item": {"group": "Project Management", "reapy": []}, "SetMediaItemLength": {"group": "Item Management", "reapy": ["Item.length"]}, "GetExePath": {"group": "API Helper Functions", "reapy": ["get_exe_dir"]}, "GetSetTrackGroupMembership": {"group": "Track Management", "reapy": []}, "GetHZoomLevel": {"group": "Arrangeview Management", "reapy": []}, "IsMediaItemSelected": {"group": "Item Management", "reapy": ["Item.is_selected"]}, "GetCursorPosition": {"group": "Transport Management", "reapy": ["Project.cursor_position"]}, "TrackFX_Delete": {"group": "FX Management", "reapy": ["FX.delete"]}, "MIDIEditor_GetMode": {"group": "MIDI Management", "reapy": ["MIDIEditor.mode"]}, "MIDI_GetCC": {"group": "MIDI Management", "reapy": []}, "SetProjectMarker2": {"group": "Marker and Region Management", "reapy": ["Marker", "Region"]}, "Main_UpdateLoopInfo": {"group": "Other", "reapy": []}, "SetEnvelopePoint": {"group": "Envelope Management", "reapy": []}, "MIDI_GetPPQPos_EndOfMeasure": {"group": "MIDI Management", "reapy": []}, "Splash_GetWnd": {"group": "Other", "reapy": []}, "GetEnvelopePointByTime": {"group": "Envelope Management", "reapy": []}, "CSurf_OnRew": {"group": "Transport Management", "reapy": []}, "MarkTrackItemsDirty": {"group": "Other", "reapy": []}, "GetPlayPositionEx": {"group": "Transport Management", "reapy": ["Project.play_position"]}, "SetMediaItemInfo_Value": {"group": "Item Management", "reapy": []}, "GetMediaItemTakeByGUID": {"group": "Item Management", "reapy": []}, "GetOutputLatency": {"group": "Audio/MIDI Device Management", "reapy": ["audio.get_output_latency"]}, "TakeFX_GetNumParams": {"group": "FX Management", "reapy": ["FX.n_params"]}, "PCM_Source_GetSectionInfo": {"group": "Audio Management", "reapy": []}, "TrackFX_SetEQParam": {"group": "FX Management", "reapy": []}, "OnPlayButtonEx": {"group": "Transport Management", "reapy": ["Project.play"]}, "GetTrackSendName": {"group": "Track Management", "reapy": []}, "HasTrackMIDIProgramsEx": {"group": "MIDI Management", "reapy": []}, "OscLocalMessageToHost": {"group": "Audio/MIDI Device Management", "reapy": []}, "MIDI_GetPPQPosFromProjQN": {"group": "MIDI Management", "reapy": []}, "TrackFX_GetEQParam": {"group": "FX Management", "reapy": []}, "GoToMarker": {"group": "Transport Management", "reapy": []}, "APIExists": {"group": "API Helper Functions", "reapy": []}, "GetParentTrack": {"group": "Track Management", "reapy": ["Track.parent_track"]}, "GetMediaItemNumTakes": {"group": "Item Management", "reapy": ["Item.n_takes"]}, "joystick_destroy": {"group": "Joystick Management", "reapy": []}, "TimeMap_timeToQN": {"group": "Other", "reapy": ["Project.time_to_beats"]}, "GetToggleCommandState": {"group": "API Helper Functions", "reapy": []}, "GetTrackReceiveUIVolPan": {"group": "Track Management", "reapy": []}, "Undo_BeginBlock2": {"group": "Project Management", "reapy": ["Project.begin_undo_block"]}, "SetMediaTrackInfo_Value": {"group": "Track Management", "reapy": []}, "GetMaxMidiOutputs": {"group": "Audio/MIDI Device Management", "reapy": ["midi.get_max_outputs"]}, "GetMediaItemTake_Peaks": {"group": "Item Management", "reapy": []}, "InsertEnvelopePointEx": {"group": "Envelope Management", "reapy": []}, "CSurf_NumTracks": {"group": "Track Management", "reapy": []}, "GetSetProjectAuthor": {"group": "Project Management", "reapy": []}, "TimeMap2_timeToQN": {"group": "Other", "reapy": ["Project.time_to_beats"]}, "joystick_create": {"group": "Joystick Management", "reapy": []}, "TimeMap_GetMeasureInfo": {"group": "Other", "reapy": []}, "GetTrackMediaItem": {"group": "Item Management", "reapy": ["Track.items"]}, "joystick_getinfo": {"group": "Joystick Management", "reapy": []}, "CSurf_GetTouchState": {"group": "Track Management", "reapy": []}, "SetProjectMarker": {"group": "Marker and Region Management", "reapy": ["Marker", "Region"]}, "GetMasterTrackVisibility": {"group": "Track Management", "reapy": []}, "TakeFX_GetParameterStepSizes": {"group": "FX Management", "reapy": []}, "CSurf_OnTrackSelection": {"group": "Track Management", "reapy": []}, "CSurf_SetSurfaceVolume": {"group": "Track Management", "reapy": []}, "GetTrackMIDINoteNameEx": {"group": "MIDI Management", "reapy": []}, "NamedCommandLookup": {"group": "API Helper Functions", "reapy": ["get_command_id"]}, "GetProjectTimeSignature2": {"group": "Marker and Region Management", "reapy": ["Project.bpm", "Project.bpi"]}, "CSurf_OnRecArmChangeEx": {"group": "Track Management", "reapy": []}, "GetAudioDeviceInfo": {"group": "Audio Management", "reapy": []}, "GetTrackReceiveName": {"group": "Track Management", "reapy": []}, "TrackList_AdjustWindows": {"group": "FX Management", "reapy": []}, "SplitMediaItem": {"group": "Item Management", "reapy": ["Item.split"]}, "GetPlayState": {"group": "Transport Management", "reapy": ["Project.play_state"]}, "GetProjectStateChangeCount": {"group": "Project Management", "reapy": []}, "Master_NormalizePlayRate": {"group": "Transport Management", "reapy": []}, "CSurf_OnMuteChange": {"group": "Track Management", "reapy": []}, "IsTrackSelected": {"group": "Track Management", "reapy": ["Track.is_selected"]}, "GetMainHwnd": {"group": "User Interface", "reapy": ["get_main_window"]}, "CSurf_OnSelectedChange": {"group": "Track Management", "reapy": []}, "ShowMessageBox": {"group": "User Interface", "reapy": ["show_message_box"]}, "CSurf_ResetAllCachedVolPanStates": {"group": "Track Management", "reapy": []}, "Undo_BeginBlock": {"group": "Project Management", "reapy": ["Project.begin_undo_block"]}, "GetSet_LoopTimeRange2": {"group": "Transport Management", "reapy": ["Project.time_selection"]}, "EnumProjectMarkers2": {"group": "Marker and Region Management", "reapy": ["Project.markers", "Project.regions"]}, "GetSetMediaTrackInfo_String": {"group": "Track Management", "reapy": []}, "ClearPeakCache": {"group": "API Helper Functions", "reapy": ["clear_peak_cache"]}, "GetFocusedFX": {"group": "FX Management", "reapy": ["Project.focused_fx"]}, "TimeMap_curFrameRate": {"group": "Other", "reapy": []}, "GetSetEnvelopeState2": {"group": "Envelope Management", "reapy": ["DEPRECATED"]}, "HasExtState": {"group": "Extended States", "reapy": ["has_ext_state"]}, "TrackFX_SetEQBandEnabled": {"group": "FX Management", "reapy": []}, "GetLastTouchedTrack": {"group": "Track Management", "reapy": ["get_last_touched_track"]}, "GetTakeNumStretchMarkers": {"group": "Marker and Region Management", "reapy": []}, "SetTrackStateChunk": {"group": "Track Management", "reapy": []}, "TimeMap_GetTimeSigAtTime": {"group": "Other", "reapy": []}, "DockIsChildOfDock": {"group": "User Interface", "reapy": []}, "GetPeakFileNameEx": {"group": "Audio Management", "reapy": []}, "GetSelectedTrackEnvelope": {"group": "Envelope Management", "reapy": ["Project.selected_envelope"]}, "ShowActionList": {"group": "API Helper Functions", "reapy": []}, "GetSet_ArrangeView2": {"group": "Arrangeview Management", "reapy": []}, "DockWindowAdd": {"group": "User Interface", "reapy": []}, "GetSelectedTrack2": {"group": "Track Management", "reapy": ["Project.selected_tracks", "Project.get_selected_track"]}, "MIDI_SetNote": {"group": "MIDI Management", "reapy": []}, "GetAllProjectPlayStates": {"group": "Transport Management", "reapy": ["get_projects", "Project.play_state"]}, "TimeMap2_GetDividedBpmAtTime": {"group": "Other", "reapy": []}, "CSurf_GoEnd": {"group": "Transport Management", "reapy": []}, "GetTrackSendInfo_Value": {"group": "Track Management", "reapy": ["Send"]}, "Envelope_Evaluate": {"group": "Envelope Management", "reapy": ["Envelope.get_value", "Envelope.get_derivatives"]}, "AddMediaItemToTrack": {"group": "Item Management", "reapy": ["Track.add_item"]}, "AudioAccessorValidateState": {"group": "Audio Management", "reapy": ["AudioAccessor.has_state_changed"]}, "CSurf_OnVolumeChange": {"group": "Track Management", "reapy": []}, "TakeFX_GetPinMappings": {"group": "FX Management", "reapy": []}, "Audio_Quit": {"group": "Audio/MIDI Device Management", "reapy": ["audio.quit"]}, "mkvolpanstr": {"group": "API Helper Functions", "reapy": []}, "GetMasterMuteSoloFlags": {"group": "Track Management", "reapy": ["DEPRECATED"]}, "GetSetRepeatEx": {"group": "Transport Management", "reapy": ["TimeSelection.looping", "TimeSelection.loop", "TimeSelection.unloop"]}, "ApplyNudge": {"group": "Item Management", "reapy": []}, "ValidatePtr": {"group": "API Helper Functions", "reapy": []}, "CountTakes": {"group": "Item Management", "reapy": ["Item.n_takes"]}, "GetMediaSourceParent": {"group": "Audio Management", "reapy": []}, "GetSetMediaItemInfo_String": {"group": "Item Management", "reapy": []}, "TakeFX_GetParamName": {"group": "FX Management", "reapy": ["FXParam.name"]}, "MIDIEditor_GetTake": {"group": "MIDI Management", "reapy": ["MIDIEditor.take"]}, "TrackCtl_SetToolTip": {"group": "User Interface", "reapy": ["ToolTip"]}, "genGuid": {"group": "API Helper Functions", "reapy": []}, "CSurf_OnWidthChange": {"group": "Track Management", "reapy": []}, "SetCursorContext": {"group": "Arrangeview Management", "reapy": []}, "SelectProjectInstance": {"group": "Project Management", "reapy": ["Project.make_current_project"]}, "GetSetTrackState2": {"group": "Track Management", "reapy": ["DEPRECATED"]}, "format_timestr": {"group": "API Helper Functions", "reapy": []}, "TrackFX_Show": {"group": "Track Management", "reapy": ["FX.open_chain", "FX.open_floating_window", "FX.close_chain", "FX.close_floating_window"]}, "TrackFX_SetParam": {"group": "FX Management", "reapy": ["FX.params"]}, "TakeFX_SetOffline": {"group": "FX Management", "reapy": ["FX.make_online", "FX.make_offline"]}, "GetSelectedTrack": {"group": "Track Management", "reapy": ["Project.selected_tracks", "Project.get_selected_track"]}, "SetProjectGrid": {"group": "Project Management", "reapy": []}, "CountEnvelopePoints": {"group": "Envelope Management", "reapy": ["Envelope.n_points"]}, "CSurf_OnTempoChange": {"group": "Project Management", "reapy": []}, "MIDI_InsertNote": {"group": "MIDI Management", "reapy": ["Take.add_note"]}, "GetTakeStretchMarkerSlope": {"group": "Marker and Region Management", "reapy": []}, "GetNumTracks": {"group": "Track Management", "reapy": ["Project.n_tracks"]}, "GetProjectPathEx": {"group": "Project Management", "reapy": ["Project.path"]}, "AddProjectMarker2": {"group": "Marker and Region Management", "reapy": ["Project.add_marker", "Project.add_region"]}, "SetProjectMarker4": {"group": "Marker and Region Management", "reapy": ["Marker", "Region"]}, "GetArmedCommand": {"group": "Other", "reapy": ["get_armed_command"]}, "OnStopButton": {"group": "Transport Management", "reapy": ["Project.stop"]}, "TrackFX_AddByName": {"group": "FX Management", "reapy": ["Track.add_fx"]}, "EnumTrackMIDIProgramNames": {"group": "MIDI Management", "reapy": []}, "SetEnvelopeStateChunk": {"group": "Envelope Management", "reapy": []}, "defer": {"group": "Deferring Function Calls", "reapy": ["defer"]}, "SetItemStateChunk": {"group": "Item Management", "reapy": []}, "APITest": {"group": "API Helper Functions", "reapy": ["test_api"]}, "ReorderSelectedTracks": {"group": "Track Management", "reapy": []}, "GetMediaSourceNumChannels": {"group": "Audio Management", "reapy": ["Source.n_channels"]}, "MIDI_SetTextSysexEvt": {"group": "MIDI Management", "reapy": []}, "TrackFX_SetNamedConfigParm": {"group": "FX Management", "reapy": []}, "ClearConsole": {"group": "API Helper Functions", "reapy": ["clear_console"]}, "file_exists": {"group": "File Management", "reapy": ["os.path.isfile"]}, "MIDI_InsertEvt": {"group": "MIDI Management", "reapy": []}, "MIDI_GetProjTimeFromPPQPos": {"group": "MIDI Management", "reapy": ["Take.ppq_to_time"]}, "mkvolstr": {"group": "API Helper Functions", "reapy": []}, "CSurf_OnFwd": {"group": "Transport Management", "reapy": []}, "CSurf_ScrubAmt": {"group": "Transport Management", "reapy": []}, "CSurf_OnRecvVolumeChange": {"group": "Track Management", "reapy": []}, "Main_SaveProject": {"group": "Project Management", "reapy": ["Project.save"]}, "joystick_enum": {"group": "Joystick Management", "reapy": []}, "EnumProjExtState": {"group": "Project Management", "reapy": []}, "TrackFX_SetParamNormalized": {"group": "FX Management", "reapy": ["FXParam.normalized"]}, "EnumerateFiles": {"group": "File Management", "reapy": ["os.listdir"]}, "CSurf_SetSurfacePan": {"group": "Track Management", "reapy": []}, "MIDI_InsertTextSysexEvt": {"group": "MIDI Management", "reapy": []}, "GetInputChannelName": {"group": "Audio/MIDI Device Management", "reapy": ["audio.get_input_names"]}, "GetActiveTake": {"group": "Item Management", "reapy": ["Item.active_take"]}, "Master_GetPlayRate": {"group": "Transport Management", "reapy": ["Project.play_rate"]}, "GetMediaItemTake": {"group": "Item Management", "reapy": ["Item.takes", "Item.get_take"]}, "GetProjectLength": {"group": "Project Management", "reapy": ["Project.length"]}, "stringToGuid": {"group": "API Helper Functions", "reapy": []}, "GetMediaItemTrack": {"group": "Track Management", "reapy": ["Item.track"]}, "HasTrackMIDIPrograms": {"group": "MIDI Management", "reapy": []}, "GetTakeName": {"group": "Item Management", "reapy": ["Take.name"]}, "AddTempoTimeSigMarker": {"group": "Marker and Region Management", "reapy": ["DEPRECATED"]}, "TrackFX_GetCount": {"group": "FX Management", "reapy": ["Track.n_fxs"]}, "GetLastTouchedFX": {"group": "FX Management", "reapy": ["Project.last_touched_fx"]}, "TakeFX_GetFormattedParamValue": {"group": "FX Management", "reapy": ["FXParam.formatted"]}, "GetMediaItemTake_Track": {"group": "Item Management", "reapy": ["Take.track"]}, "SetTakeStretchMarkerSlope": {"group": "Marker and Region Management", "reapy": []}, "TrackFX_GetParam": {"group": "FX Management", "reapy": ["FX.params"]}, "OnPauseButton": {"group": "Transport Management", "reapy": ["Project.pause"]}, "MIDI_InsertCC": {"group": "MIDI Management", "reapy": []}, "MarkProjectDirty": {"group": "Project Management", "reapy": ["Project.mark_dirty"]}, "GetTake": {"group": "Item Management", "reapy": ["Item.takes"]}, "parse_timestr_pos": {"group": "API Helper Functions", "reapy": []}, "CSurf_SetSurfaceSelected": {"group": "Track Management", "reapy": []}, "MIDI_EnumSelTextSysexEvts": {"group": "MIDI Management", "reapy": []}, "TakeFX_CopyToTrack": {"group": "FX Management", "reapy": ["FX.copy_to_track", "FX.move_to_track"]}, "GetNumAudioOutputs": {"group": "Audio/MIDI Device Management", "reapy": ["audio.get_n_outputs"]}, "ShowPopupMenu": {"group": "User Interface", "reapy": []}, "TakeFX_Delete": {"group": "FX Management", "reapy": ["FX.delete"]}, "EnumProjectMarkers": {"group": "Marker and Region Management", "reapy": ["Project.markers", "Project.regions"]}, "TrackList_UpdateAllExternalSurfaces": {"group": "Other", "reapy": []}, "SetTrackMIDINoteName": {"group": "MIDI Management", "reapy": []}, "EnumRegionRenderMatrix": {"group": "Project Management", "reapy": ["Region.rendered_tracks"]}, "CSurf_FlushUndo": {"group": "Other", "reapy": []}, "GetSetProjectNotes": {"group": "Project Management", "reapy": []}, "CSurf_TrackFromID": {"group": "Track Management", "reapy": []}, "OnPauseButtonEx": {"group": "Transport Management", "reapy": ["Project.pause"]}, "ScaleToEnvelopeMode": {"group": "Envelope Management", "reapy": []}, "GetEnvelopePointByTimeEx": {"group": "Envelope Management", "reapy": []}, "SetActiveTake": {"group": "Item Management", "reapy": ["Take.make_active_take"]}, "GetInputOutputLatency": {"group": "Audio/MIDI Device Management", "reapy": ["audio.get_input_latency", "audio.get_output_latency"]}, "GetPlayPosition2Ex": {"group": "Transport Management", "reapy": ["Project.buffer_position"]}, "MIDI_GetTextSysexEvt": {"group": "MIDI Management", "reapy": []}, "GetProjectPath": {"group": "Project Management", "reapy": ["Project.path"]}, "TakeFX_GetNamedConfigParm": {"group": "FX Management", "reapy": []}, "SetMediaItemTake_Source": {"group": "Item Management", "reapy": []}, "GetTakeEnvelope": {"group": "Envelope Management", "reapy": ["Take.envelopes"]}, "GetToggleCommandStateEx": {"group": "API Helper Functions", "reapy": []}, "SetProjectMarkerByIndex": {"group": "Marker and Region Management", "reapy": ["Marker", "Region"]}, "Audio_IsPreBuffer": {"group": "Audio/MIDI Device Management", "reapy": ["audio.is_prebuffer"]}, "TrackFX_FormatParamValueNormalized": {"group": "FX Management", "reapy": ["NormalizedFXParam.format_value"]}, "GetFreeDiskSpaceForRecordPath": {"group": "Project Management", "reapy": []}, "GetMediaSourceFileName": {"group": "Audio Management", "reapy": ["Source.filename"]}, "BypassFxAllTracks": {"group": "Track Management", "reapy": ["Project.bypass_fx_on_all_tracks"]}, "RecursiveCreateDirectory": {"group": "API Helper Functions", "reapy": ["os.makedirs"]}, "CSurf_SetTrackListChange": {"group": "Other", "reapy": []}, "TrackFX_GetParamNormalized": {"group": "FX Management", "reapy": ["FXParam.normalized"]}, "Undo_OnStateChange": {"group": "Project Management", "reapy": []}, "MIDI_CountEvts": {"group": "MIDI Management", "reapy": ["Take.n_cc", "Take.n_notes", "Take.n_text_sysex"]}, "SetTrackSelected": {"group": "Track Management", "reapy": ["Track.is_selected", "Track.select", "Track.unselect"]}, "get_ini_file": {"group": "API Helper Functions", "reapy": ["get_ini_file"]}, "CSurf_OnZoom": {"group": "Arrangeview Management", "reapy": []}, "PCM_Source_GetPeaks": {"group": "Audio Management", "reapy": []}, "TrackFX_GetRecCount": {"group": "FX Management", "reapy": []}, "TrackFX_GetEnabled": {"group": "FX Management", "reapy": ["FX.is_enabled"]}, "GetMIDIOutputName": {"group": "Audio/MIDI Device Management", "reapy": ["midi.get_output_names"]}, "GetItemStateChunk": {"group": "Item Management", "reapy": []}, "GetMediaItemTake_Item": {"group": "Item Management", "reapy": ["Take.item"]}, "TrackFX_GetChainVisible": {"group": "FX Management", "reapy": ["Track.visible_fx"]}, "GetSetItemState2": {"group": "Item Management", "reapy": ["DEPRECATED"]}, "ValidatePtr2": {"group": "API Helper Functions", "reapy": []}, "CSurf_OnRecord": {"group": "Transport Management", "reapy": []}, "SetGlobalAutomationOverride": {"group": "Envelope Management", "reapy": ["set_global_automation_mode"]}, "GetMediaItemInfo_Value": {"group": "Item Management", "reapy": ["Item.get_info_value"]}, "CountTakeEnvelopes": {"group": "Item Management", "reapy": ["Take.n_envelopes"]}, "CSurf_OnInputMonitorChange": {"group": "Track Management", "reapy": []}, "TrackFX_SetPinMappings": {"group": "FX Management", "reapy": []}, "DeleteExtState": {"group": "Extended States", "reapy": ["delete_ext_state"]}, "TimeMap2_timeToBeats": {"group": "Other", "reapy": []}, "GetEnvelopePoint": {"group": "Envelope Management", "reapy": []}, "GetTrackUIVolPan": {"group": "Track Management", "reapy": []}, "GetProjExtState": {"group": "Project Management", "reapy": []}, "MIDIEditor_GetSetting_str": {"group": "MIDI Management", "reapy": ["MIDIEditor"]}, "CSurf_SetRepeatState": {"group": "Transport Management", "reapy": []}, "IsProjectDirty": {"group": "Project Management", "reapy": ["Project.is_dirty"]}, "Undo_OnStateChangeEx2": {"group": "Project Management", "reapy": []}, "CountMediaItems": {"group": "Item Management", "reapy": ["Project.n_items"]}, "resolve_fn": {"group": "API Helper Functions", "reapy": []}, "GetCursorContext": {"group": "Arrangeview Management", "reapy": []}, "GetTrackEnvelope": {"group": "Envelope Management", "reapy": ["Track.envelopes"]}, "GetTrackColor": {"group": "Track Management", "reapy": ["Track.color"]}, "CSurf_OnPanChangeEx": {"group": "Track Management", "reapy": []}, "DockWindowRefreshForHWND": {"group": "User Interface", "reapy": []}, "RenderFileSection": {"group": "Other", "reapy": []}, "GetItemProjectContext": {"group": "Item Management", "reapy": ["Item.project"]}, "CSurf_OnPlay": {"group": "Transport Management", "reapy": []}, "Audio_Init": {"group": "Audio/MIDI Device Management", "reapy": ["audio.init"]}, "TakeFX_GetParamEx": {"group": "FX Management", "reapy": ["FX.params"]}, "CountEnvelopePointsEx": {"group": "Envelope Management", "reapy": ["AutomationItem.n_points"]}, "TakeFX_GetIOSize": {"group": "FX Management", "reapy": ["FX.n_inputs", "FX.n_outputs"]}, "GetTempoTimeSigMarker": {"group": "Marker and Region Management", "reapy": []}, "GetAppVersion": {"group": "API Helper Functions", "reapy": ["get_reaper_version"]}, "CountSelectedTracks": {"group": "Track Management", "reapy": ["Project.n_selected_tracks"]}, "GetSetProjectGrid": {"group": "Project Management", "reapy": []}, "TakeIsMIDI": {"group": "MIDI Management", "reapy": ["Take.is_midi"]}, "TrackFX_GetFormattedParamValue": {"group": "FX Management", "reapy": ["FXParam.formatted"]}, "TakeFX_GetOpen": {"group": "FX Management", "reapy": ["FX.is_ui_open"]}, "MIDI_Sort": {"group": "MIDI Management", "reapy": ["Take.sort_events"]}, "ReaScriptError": {"group": "API Helper Functions", "reapy": []}, "SnapToGrid": {"group": "Project Management", "reapy": []}, "TrackFX_GetEQBandEnabled": {"group": "FX Management", "reapy": []}, "SetProjExtState": {"group": "Project Management", "reapy": []}, "ArmCommand": {"group": "Other", "reapy": ["arm_command", "disarm_command"]}, "TrackFX_GetEQ": {"group": "FX Management", "reapy": []}, "TakeFX_GetParam": {"group": "FX Management", "reapy": ["FX.params"]}, "joystick_getbuttonmask": {"group": "Joystick Management", "reapy": []}, "GetEnvelopeScalingMode": {"group": "Envelope Management", "reapy": []}, "CSurf_SetAutoMode": {"group": "Envelope Management", "reapy": []}, "MIDI_DeleteTextSysexEvt": {"group": "MIDI Management", "reapy": []}, "TrackFX_GetRecChainVisible": {"group": "FX Management", "reapy": []}, "GetTrackStateChunk": {"group": "Track Management", "reapy": []}, "CreateNewMIDIItemInProj": {"group": "Item Management", "reapy": ["Track.add_midi_item"]}, "Envelope_SortPoints": {"group": "Envelope Management", "reapy": []}, "MuteAllTracks": {"group": "Transport Management", "reapy": ["Project.mute_all_tracks", "Project.unmute_all_tracks"]}, "TimeMap_QNToTime": {"group": "Other", "reapy": ["Project.beats_to_time"]}, "GetTooltipWindow": {"group": "User Interface", "reapy": ["ToolTip"]}, "GetMediaSourceSampleRate": {"group": "Audio Management", "reapy": ["Source.sample_rate"]}, "SetTempoTimeSigMarker": {"group": "Marker and Region Management", "reapy": []}, "CountTrackEnvelopes": {"group": "Envelope Management", "reapy": ["Track.n_envelopes"]}, "TrackFX_SetOpen": {"group": "Track Management", "reapy": ["FX.open_ui", "FX.close_ui"]}, "GetAudioAccessorHash": {"group": "Audio Management", "reapy": ["AudioAccessor.hash"]}, "CSurf_SetPlayState": {"group": "Transport Management", "reapy": []}, "TrackFX_SetOffline": {"group": "FX Management", "reapy": ["FX.make_online", "FX.make_offline"]}, "TimeMap2_QNToTime": {"group": "Other", "reapy": ["Project.beats_to_time"]}, "adjustZoom": {"group": "Arrangeview Management", "reapy": []}, "MIDI_GetNote": {"group": "MIDI Management", "reapy": ["Take.notes", "Note"]}, "GetGlobalAutomationOverride": {"group": "Envelope Management", "reapy": ["get_global_automation_mode"]}, "Master_GetTempo": {"group": "Transport Management", "reapy": ["Project.bpm"]}, "PCM_Sink_Enum": {"group": "Audio Management", "reapy": []}, "parsepanstr": {"group": "API Helper Functions", "reapy": []}, "CountSelectedTracks2": {"group": "Track Management", "reapy": ["Project.n_selected_tracks"]}, "MIDI_SetCC": {"group": "MIDI Management", "reapy": []}, "SetAutomationMode": {"group": "Envelope Management", "reapy": []}, "DeleteTempoTimeSigMarker": {"group": "Marker and Region Management", "reapy": []}, "GetSetRepeat": {"group": "Transport Management", "reapy": ["TimeSelection.is_looping", "TimeSelection.loop", "TimeSelection.unloop"]}, "TakeFX_GetPreset": {"group": "FX Management", "reapy": ["FX.preset"]}, "TakeFX_CopyToTake": {"group": "FX Management", "reapy": ["FX.copy_to_take", "FX.move_to_take"]}, "TakeFX_SetParamNormalized": {"group": "FX Management", "reapy": ["FXParam.normalized"]}, "ClearAllRecArmed": {"group": "Track Management", "reapy": ["Project.disarm_rec_on_all_tracks"]}, "Audio_IsRunning": {"group": "Audio/MIDI Device Management", "reapy": ["audio.is_running"]}, "TakeFX_SetPresetByIndex": {"group": "FX Management", "reapy": ["FX.preset"]}, "SetEditCurPos": {"group": "Transport Management", "reapy": ["Project.cursor_position"]}, "CSurf_SetSurfaceSolo": {"group": "Track Management", "reapy": []}, "GetTrackDepth": {"group": "Track Management", "reapy": ["Track.depth"]}, "CSurf_TrackToID": {"group": "Track Management", "reapy": []}, "CSurf_OnRecArmChange": {"group": "Track Management", "reapy": []}, "CSurf_OnRewFwd": {"group": "Transport Management", "reapy": []}, "TrackFX_GetOffline": {"group": "FX Management", "reapy": ["FX.is_online"]}, "GetTrackState": {"group": "Track Management", "reapy": []}, "GetTrackSendUIVolPan": {"group": "Track Management", "reapy": []}, "SetTrackMIDINoteNameEx": {"group": "MIDI Management", "reapy": []}, "ReverseNamedCommandLookup": {"group": "API Helper Functions", "reapy": ["get_command_name"]}, "ColorFromNative": {"group": "API Helper Functions", "reapy": ["rgb_from_native"]}, "EnumProjects": {"group": "Project Management", "reapy": ["Project"]}, "TrackFX_GetPreset": {"group": "FX Management", "reapy": ["FX.preset"]}, "GetTakeStretchMarker": {"group": "Marker and Region Management", "reapy": []}, "MIDI_GetProjQNFromPPQPos": {"group": "MIDI Management", "reapy": []}, "Envelope_FormatValue": {"group": "Envelope Management", "reapy": ["Envelope.get_value", "Envelope.get_derivatives"]}, "InsertEnvelopePoint": {"group": "Envelope Management", "reapy": []}, "SetMouseModifier": {"group": "User Interface", "reapy": []}, "GetTrackEnvelopeByChunkName": {"group": "Envelope Management", "reapy": ["Track.envelopes"]}, "CountTCPFXParms": {"group": "Track Management", "reapy": []}, "CreateTrackSend": {"group": "Track Management", "reapy": ["Track.add_send"]}, "TrackFX_GetPinMappings": {"group": "FX Management", "reapy": []}} \ No newline at end of file diff --git a/docs/source/api_table.rst b/docs/source/api_table.rst index 8c458b74..1365ee0b 100644 --- a/docs/source/api_table.rst +++ b/docs/source/api_table.rst @@ -50,7 +50,7 @@ API Helper Functions "`ValidatePtr `_","" "`genGuid `_","" "`format_timestr `_","" - "`APITest `_","" + "`APITest `_","`test_api `_" "`ClearConsole `_","`clear_console `_" "`mkvolstr `_","" "`stringToGuid `_","" @@ -472,9 +472,9 @@ MIDI Management "`MIDI_CountEvts `_","`Take.n_cc `_; `Take.n_notes `_; `Take.n_text_sysex `_" "`MIDIEditor_GetSetting_str `_","`MIDIEditor `_" "`TakeIsMIDI `_","`Take.is_midi `_" - "`MIDI_Sort `_","" + "`MIDI_Sort `_","`Take.sort_events `_" "`MIDI_DeleteTextSysexEvt `_","" - "`MIDI_GetNote `_","" + "`MIDI_GetNote `_","`Take.notes `_; `Note `_" "`MIDI_SetCC `_","" "`SetTrackMIDINoteNameEx `_","" "`MIDI_GetProjQNFromPPQPos `_","" @@ -773,7 +773,7 @@ User Interface .. csv-table:: :header: "ReaScript API function", "reapy API function" - "`SetMixerScroll `_","" + "`SetMixerScroll `_","`ui.set_leftmost_track_in_mixer `_" "`RefreshToolbar `_","" "`GetUserInputs `_","" "`RefreshToolbar2 `_","" @@ -783,7 +783,7 @@ User Interface "`DockWindowActivate `_","" "`GetMousePosition `_","" "`DockWindowAddEx `_","" - "`GetLastColorThemeFile `_","`get_last_color_theme_file `_" + "`GetLastColorThemeFile `_","`ui.get_color_theme `_" "`ViewPrefs `_","`view_prefs `_" "`MB `_","`reapy.show_message_box `_" "`LICE_ClipLine `_","" @@ -791,20 +791,20 @@ User Interface "`GetConfigWantsDock `_","" "`Dock_UpdateDockID `_","" "`DockWindowRemove `_","" - "`GetUserFileNameForRead `_","" + "`GetUserFileNameForRead `_","`browse_for_file `_" "`GR_SelectColor `_","" - "`OpenColorThemeFile `_","" + "`OpenColorThemeFile `_","`ui.set_color_theme `_" "`my_getViewport `_","" - "`GetMixerScroll `_","" - "`DockWindowRefresh `_","" + "`GetMixerScroll `_","`ui.get_leftmost_track_in_mixer `_" + "`DockWindowRefresh `_","`Window.refresh `_" "`GetMainHwnd `_","`get_main_window `_" "`ShowMessageBox `_","`show_message_box `_" "`DockIsChildOfDock `_","" "`DockWindowAdd `_","" - "`TrackCtl_SetToolTip `_","" + "`TrackCtl_SetToolTip `_","`ToolTip `_" "`ShowPopupMenu `_","" "`DockWindowRefreshForHWND `_","" - "`GetTooltipWindow `_","" + "`GetTooltipWindow `_","`ToolTip `_" "`SetMouseModifier `_","" diff --git a/docs/source/reapy.core.reaper.rst b/docs/source/reapy.core.reaper.rst index 3fd4e4b5..6b4e07aa 100644 --- a/docs/source/reapy.core.reaper.rst +++ b/docs/source/reapy.core.reaper.rst @@ -37,6 +37,14 @@ reapy.core.reaper.reaper module :undoc-members: :show-inheritance: +reapy.core.reaper.ui module +------------------------------- + +.. automodule:: reapy.core.reaper.ui + :members: + :undoc-members: + :show-inheritance: + Module contents --------------- diff --git a/reapy/config.py b/reapy/config.py index 52ff9d5d..0b3cf77d 100644 --- a/reapy/config.py +++ b/reapy/config.py @@ -3,6 +3,7 @@ from reapy.reascripts import activate_reapy_server from configparser import ConfigParser +from collections import OrderedDict import json import os @@ -10,12 +11,33 @@ WEB_INTERFACE_PORT = 2307 +class CaseInsensitiveDict(OrderedDict): + + """OrderedDict with case-insensitive keys.""" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._dict = OrderedDict(*args, **kwargs) + for key, value in self._dict.items(): + self._dict[key.lower()] = value + + def __contains__(self, key): + return key.lower() in self._dict + + def __getitem__(self, key): + return self._dict[key.lower()] + + def __setitem__(self, key, value): + super().__setitem__(key, value) + self._dict[key.lower()] = value + + class Config(ConfigParser): """Parser for REAPER .ini file.""" def __init__(self): - super(Config, self).__init__(strict=False, delimiters="=") + super(Config, self).__init__(strict=False, delimiters="=", dict_type=CaseInsensitiveDict) self.optionxform = str self.read(reapy.get_ini_file()) @@ -37,7 +59,7 @@ def create_new_web_interface(port): Web interface port. """ config = Config() - csurf_count = int(config["reaper"]["csurf_cnt"]) + csurf_count = int(config["reaper"].get("csurf_cnt", "0")) csurf_count += 1 config["reaper"]["csurf_cnt"] = str(csurf_count) key = "csurf_{}".format(csurf_count - 1) diff --git a/reapy/core/__init__.py b/reapy/core/__init__.py index e9271a1f..ec9a4c62 100755 --- a/reapy/core/__init__.py +++ b/reapy/core/__init__.py @@ -1,17 +1,18 @@ -from .reapy_object import ReapyObject +from .reapy_object import ReapyObject, ReapyObjectList from .audio_accessor import AudioAccessor from .envelope import Envelope, EnvelopeList from .fx import FX, FXList, FXParam, FXParamsList -from .item import Item, MIDIItem, Source, Take +from .item import CC, CCList, Item, Note, NoteList, Source, Take from .project import Marker, Project, Region, TimeSelection -from .track import AutomationItem, Send, Track -from .window import MIDIEditor, Window +from .track import AutomationItem, Send, Track, TrackList +from .window import MIDIEditor, ToolTip, Window __all__ = [ # core.reapy_object "ReapyObject", + "ReapyObjectList", #core.audio_accessor "AudioAccessor", # core.envelope @@ -23,8 +24,11 @@ "FXParam", "FXParamsList", # core.item + "CC", + "CCList", "Item", - "MIDIItem", + "Note", + "NoteList", "Source", "Take", # core.project @@ -36,7 +40,9 @@ "AutomationItem", "Send", "Track", + "TrackList", # core.window "MIDIEditor", + "ToolTip", "Window", ] diff --git a/reapy/core/fx/fx.py b/reapy/core/fx/fx.py index 4ad0c845..413aad96 100644 --- a/reapy/core/fx/fx.py +++ b/reapy/core/fx/fx.py @@ -2,7 +2,7 @@ import reapy from reapy import reascript_api as RPR -from reapy.core import ReapyObject +from reapy.core import ReapyObject, ReapyObjectList from reapy.errors import DistError, UndefinedFXParamError from reapy.tools import Program @@ -292,6 +292,10 @@ def preset(self): FX preset name. :type: str + + Attribute can be set by passing a str or int. In the first + case, the str can either be a preset name or the path to a + .vstpreset file. Otherwise, the int is the preset index. """ preset = self.functions["GetPreset"]( self.parent_id, self.index, "", 2048 @@ -366,7 +370,7 @@ def window(self): return window -class FXList(ReapyObject): +class FXList(ReapyObjectList): """ Container class for a list of FXs. @@ -386,13 +390,7 @@ class FXList(ReapyObject): _class_name = "FXList" - def __init__(self, parent=None, parent_id=None): - if parent is None: - if parent_id.startswith("(MediaTrack*)"): - parent_class = reapy.Track - else: - parent_class = reapy.Take - parent = parent_class(parent_id) + def __init__(self, parent): self.parent = parent def __getitem__(self, i): @@ -422,5 +420,5 @@ def _get_fx_index(self, name): return index @property - def _kwargs(self): - return {"parent_id": self.parent.id} + def _args(self): + return self.parent, diff --git a/reapy/core/fx/fx_param.py b/reapy/core/fx/fx_param.py index 80dbfbb2..a141baba 100644 --- a/reapy/core/fx/fx_param.py +++ b/reapy/core/fx/fx_param.py @@ -1,7 +1,8 @@ import reapy import reapy.reascript_api as RPR -from reapy.core import ReapyObject +from reapy.core import ReapyObject, ReapyObjectList from reapy.errors import DistError +from reapy.tools import Program class FXParam(float): @@ -177,7 +178,7 @@ def range(self): return min, max -class FXParamsList(ReapyObject): +class FXParamsList(ReapyObjectList): """ Container class for a list of FX parameters. @@ -221,6 +222,16 @@ def __getitem__(self, i): param = FXParam(value, self, i, self.functions) return param + def __iter__(self): + code = """ + values = [param_list.functions["GetParam"]( + param_list.parent_id, param_list.fx_index, i, 0, 0 + )[0] for i in range(len(param_list))] + """ + values, = Program(code, "values").run(param_list=self) + for i, value in enumerate(values): + yield FXParam(value, self, i, self.functions) + def __len__(self): length = self.parent_fx.n_params return length diff --git a/reapy/core/item/__init__.py b/reapy/core/item/__init__.py index 8c6f4114..6224ca0f 100644 --- a/reapy/core/item/__init__.py +++ b/reapy/core/item/__init__.py @@ -1,3 +1,4 @@ -from .item import Item, MIDIItem +from .item import Item +from .midi_event import CC, CCList, Note, NoteList from .source import Source from .take import Take diff --git a/reapy/core/item/item.py b/reapy/core/item/item.py index 259b3de4..f60d08f7 100644 --- a/reapy/core/item/item.py +++ b/reapy/core/item/item.py @@ -229,8 +229,3 @@ def track(self, track): def update(self): """Update item in REAPER interface.""" RPR.UpdateItemInProject(self.id) - - -class MIDIItem(Item): - - pass diff --git a/reapy/core/item/midi_event.py b/reapy/core/item/midi_event.py new file mode 100644 index 00000000..2ba9bc6d --- /dev/null +++ b/reapy/core/item/midi_event.py @@ -0,0 +1,359 @@ +import reapy +import reapy.reascript_api as RPR +from reapy.core import ReapyObject, ReapyObjectList +from reapy.tools import Program + + +class MIDIEvent(ReapyObject): + + """Abstract class for MIDI events.""" + + def __init__(self, parent, index): + """ + Create event. + + Parameters + ---------- + parent : Take + Take to which the event belongs. + index : int + Event index. It is specific to the event type, which means + a Note and a CC can have the same index. + """ + self.index = index + self.parent = parent + + @property + def _args(self): + return self.parent, self.index + + +class MIDIEventList(ReapyObjectList): + + def __init__(self, parent): + """ + Create event list. + + Parameters + ---------- + parent : Take + Take to which the event list belongs. + """ + self.parent = parent + + def __getitem__(self, key): + with reapy.inside_reaper(): + if key >= len(self): + raise IndexError + return self._elements_class(self.parent, key) + + def __len__(self): + return getattr(self.parent, self._n_elements) + + @property + def _args(self): + return self.parent, + + @property + def _elements_class(self): + raise NotImplementedError + + @property + def _n_elements(self): + raise NotImplementedError + + +class CC(MIDIEvent): + + """MIDI CC event.""" + + @property + def channel(self): + """ + CC channel between 0 and 15. + + :type: int + + See also + -------- + CC.infos + For maximum efficiency when querying several properties of + a CC. + """ + return RPR.MIDI_GetCC( + self.parent.id, self.index, 0, 0, 0, 0, 0, 0, 0 + )[7] + + @property + def channel_message(self): + """ + CC channel message. + + :type: int + + See also + -------- + CC.infos + For maximum efficiency when querying several properties of + a CC. + """ + return RPR.MIDI_GetCC( + self.parent.id, self.index, 0, 0, 0, 0, 0, 0, 0 + )[6] + + @property + def infos(self): + """ + Return infos about CC. + + Keys are {"selected", "muted", "position", "channel", + "channel_message", "messages"}. + + :type: dict + """ + code = """ + res = list(RPR.MIDI_GetCC( + take.id, index, 0, 0, 0, 0, 0, 0, 0 + ))[3:] + res[0] = bool(res[0]) + res[1] = bool(res[1]) + res[2] = take.ppq_to_time(res[2]) + res[-2] = res[-2], res[-1] + res.pop() + keys = ( + "selected", "muted", "position", "channel_message", "channel", + "messages" + ) + infos = {k: r for k, r in zip(keys, res)} + """ + infos, = Program(code, "infos").run( + take=self.parent, index=self.index + ) + return infos + + @property + def messages(self): + """ + CC messages. + + :type: 2-list of int + + See also + -------- + CC.infos + For maximum efficiency when querying several properties of + a CC. + """ + return RPR.MIDI_GetCC( + self.parent.id, self.index, 0, 0, 0, 0, 0, 0, 0 + )[-2:] + + @property + def muted(self): + """ + Whether CC is muted. + + :type: bool + + See also + -------- + CC.infos + For maximum efficiency when querying several properties of + a CC. + """ + return bool(RPR.MIDI_GetCC( + self.parent.id, self.index, 0, 0, 0, 0, 0, 0, 0 + )[4]) + + @property + def position(self): + """ + CC position in seconds. + + :type: float + + See also + -------- + CC.infos + For maximum efficiency when querying several properties of + a CC. + """ + return self.infos["position"] + + @property + def selected(self): + """ + Whether CC is selected. + + :type: bool + + See also + -------- + CC.infos + For maximum efficiency when querying several properties of + a CC. + """ + return bool(RPR.MIDI_GetCC( + self.parent.id, self.index, 0, 0, 0, 0, 0, 0, 0 + )[3]) + + +class CCList(MIDIEventList): + + _elements_class = CC + _n_elements = "n_cc" + + +class Note(MIDIEvent): + + """MIDI note.""" + + @property + def channel(self): + """ + Note channel between 0 and 15. + + :type: int + + See also + -------- + Note.infos + For maximum efficiency when querying several properties of + a Note. + """ + return RPR.MIDI_GetNote( + self.parent.id, self.index, 0, 0, 0, 0, 0, 0, 0 + )[7] + + @property + def end(self): + """ + Note end in seconds. + + :type: float + + See also + -------- + Note.infos + For maximum efficiency when querying several properties of + a Note. + """ + return self.infos["end"] + + @property + def infos(self): + """ + Return infos about note. + + Keys are {"selected", "muted", "start", "end", "channel", + "pitch", "velocity"}. + + :type: dict + """ + code = """ + res = list(RPR.MIDI_GetNote( + take.id, index, 0, 0, 0, 0, 0, 0, 0 + ))[3:] + res[0] = bool(res[0]) + res[1] = bool(res[1]) + res[2] = take.ppq_to_time(res[2]) + res[3] = take.ppq_to_time(res[3]) + keys = ( + "selected", "muted", "start", "end", "channel", "pitch", + "velocity" + ) + infos = {k: r for k, r in zip(keys, res)} + """ + infos, = Program(code, "infos").run( + take=self.parent, index=self.index + ) + return infos + + @property + def muted(self): + """ + Whether note is muted. + + :type: bool + + See also + -------- + Note.infos + For maximum efficiency when querying several properties of + a Note. + """ + return bool(RPR.MIDI_GetNote( + self.parent.id, self.index, 0, 0, 0, 0, 0, 0, 0 + )[4]) + + @property + def pitch(self): + """ + Note pitch between 0 and 127. + + :type: int + + See also + -------- + Note.infos + For maximum efficiency when querying several properties of + a Note. + """ + return RPR.MIDI_GetNote( + self.parent.id, self.index, 0, 0, 0, 0, 0, 0, 0 + )[8] + + @property + def selected(self): + """ + Whether note is selected. + + :type: bool + + See also + -------- + Note.infos + For maximum efficiency when querying several properties of + a Note. + """ + return bool(RPR.MIDI_GetNote( + self.parent.id, self.index, 0, 0, 0, 0, 0, 0, 0 + )[3]) + + @property + def start(self): + """ + Note start in seconds. + + :type: float + + See also + -------- + Note.infos + For maximum efficiency when querying several properties of + a Note. + """ + return self.infos["start"] + + @property + def velocity(self): + """ + Note velocity between 0 and 127. + + :type: int + + See also + -------- + Note.infos + For maximum efficiency when querying several properties of + a Note. + """ + return RPR.MIDI_GetNote( + self.parent.id, self.index, 0, 0, 0, 0, 0, 0, 0 + )[9] + + +class NoteList(MIDIEventList): + + _elements_class = Note + _n_elements = "n_notes" diff --git a/reapy/core/item/take.py b/reapy/core/item/take.py index cb6ae224..0f3da9e5 100644 --- a/reapy/core/item/take.py +++ b/reapy/core/item/take.py @@ -64,7 +64,7 @@ def add_fx(self, name, even_if_exists=True): def add_note( self, start, end, pitch, velocity=100, channel=0, selected=False, - muted=False, unit="seconds", sort_notes=True + muted=False, unit="seconds", sort=True ): """ Add MIDI note to take. @@ -88,17 +88,17 @@ def add_note( unit : {"seconds", "ppq", "beats"}, optional Time unit for ``start`` and ``end`` (default="seconds"). ``"ppq"`` refers to MIDI ticks. - sort_notes : bool, optional + sort : bool, optional Whether to resort notes after creating new note (default=True). If False, then the new note will be ``take.notes[-1]``. Otherwise it will be at its place in the time-sorted list ``take.notes``. Set to False for improved efficiency when adding several notes, then call - ``take.sort_notes`` at the end. + ``Take.sort_events`` at the end. See also -------- - Take.sort_notes + Take.sort_events """ code = """ if unit == "beats": @@ -112,10 +112,19 @@ def add_note( """ args = ( self.id, selected, muted, start, end, channel, pitch, velocity, - sort_notes + sort ) Program(code).run(take=self, unit=unit, args=args) + @property + def cc_events(self): + """ + List of CC events on take. + + :type: CCList + """ + return reapy.CCList(self) + @property def envelopes(self): return reapy.EnvelopeList(self) @@ -226,6 +235,18 @@ def name(self): return RPR.GetTakeName(self.id) return "" + @property + def notes(self): + """ + List of MIDI notes on take. + + Unless ``Take.add_note`` has been called with ``sort=False``, + notes are time-sorted. + + :type: NoteList + """ + return reapy.NoteList(self) + def ppq_to_time(self, ppq): """ Convert time in MIDI ticks to seconds. @@ -262,6 +283,31 @@ def select_all_midi_events(self, select=True): """ RPR.MIDI_SelectAll(self.id, select) + def sort_events(self): + """ + Sort MIDI events on take. + + This is only needed if ``Take.add_note`` was called with + ``sort=False``. + + Examples + -------- + The following example creates 100 MIDI notes on take in + reversed order, with ``sort=False`` for efficiency. Thus, + ``take.notes`` is not time-sorted. ``take.sort_events`` is + called afterwards so that ``take.notes`` is time-sorted. + + >>> for i in range(100): + ... take.add_note(99 - i, 100 - i, pitch=0, sort=False) + ... + >>> take.notes[0].start, take.notes[1].start + 99.0, 98.0 + >>> take.sort_events() + >>> take.notes[0].start, take.notes[1].start + 0.0, 1.0 + """ + RPR.MIDI_Sort(self.id) + @property def source(self): """ diff --git a/reapy/core/project/project.py b/reapy/core/project/project.py index 27aafec0..ef55c0e9 100755 --- a/reapy/core/project/project.py +++ b/reapy/core/project/project.py @@ -903,14 +903,9 @@ def tracks(self): """ List of project tracks. - :type: list of Track - """ - code = """ - n_tracks = project.n_tracks - tracks = [reapy.Track(i, project) for i in range(n_tracks)] + :type: TrackList """ - tracks = Program(code, "tracks").run(project=self)[0] - return tracks + return reapy.TrackList(self) def undo(self): """ diff --git a/reapy/core/reaper/__init__.py b/reapy/core/reaper/__init__.py index a6081781..5d3a884c 100644 --- a/reapy/core/reaper/__init__.py +++ b/reapy/core/reaper/__init__.py @@ -1,3 +1,3 @@ -from . import audio, midi +from . import audio, midi, ui from .reaper import * from .defer import defer, at_exit diff --git a/reapy/core/reaper/reaper.py b/reapy/core/reaper/reaper.py index 045f15fd..49a10204 100644 --- a/reapy/core/reaper/reaper.py +++ b/reapy/core/reaper/reaper.py @@ -56,6 +56,27 @@ def arm_command(command_id, section=""): RPR.ArmCommand(command_id, section) +def browse_for_file(window_title="", extension=""): + """ + Ask the user to select a file. + + Parameters + ---------- + window_title : str, optional + Window title (default="") + extension : str, optional + Extension for file (e.g. "mp3", "txt"...) (default=all types). + + Returns + ------- + path : str or NoneType + Path to file, or None if user cancelled. + """ + success, path, *_ = RPR.GetUserFileNameForRead("", window_title, extension) + if success: + return path + + def clear_console(): """ Clear Reaper console. @@ -246,18 +267,6 @@ def get_ini_file(): return path -def get_last_color_theme_file(): - """ - Return path to last color theme file. - - Returns - ------- - color_theme : str - Path to last color theme file. - """ - return RPR.GetLastColorThemeFile() - - def get_last_touched_track(): """ Return last touched track, or None if no track has been touched. @@ -298,7 +307,8 @@ def get_projects(): i = 0 projects = [reapy.Project(index=i)] while projects[-1]._is_defined: - projects.append(reapy.Project(index=i + 1)) + i += 1 + projects.append(reapy.Project(index=i)) projects.pop() """ projects, = Program(code, "projects").run() @@ -585,6 +595,11 @@ def slider_to_dB(slider): return db +def test_api(): + """Display a message window if the API can successfully be called.""" + RPR.APITest() + + def update_arrange(): """ Redraw the arrange view. diff --git a/reapy/core/reaper/ui.py b/reapy/core/reaper/ui.py new file mode 100644 index 00000000..ea171d79 --- /dev/null +++ b/reapy/core/reaper/ui.py @@ -0,0 +1,48 @@ +"""User interface-related functions.""" + +import reapy +import reapy.reascript_api as RPR + + +def get_color_theme(): + """ + Return path to last color theme file. + + Returns + ------- + color_theme : str + Path to last color theme file. + """ + return RPR.GetLastColorThemeFile() + + +def get_leftmost_track_in_mixer(): + """Return leftmost track in mixer.""" + return reapy.Track(RPR.GetMixerScroll()) + + +def set_color_theme(path): + """ + Set REAPER color theme. + + Parameters + ---------- + path : str + Path to color theme file. + """ + RPR.OpenColorThemeFile(path) + + +def set_leftmost_track_in_mixer(track): + """Set leftmost track in mixer. + + The actual leftmost track in mixer might be different after + calling if there is not enough tracks to the right of the + specified track. + + Parameters + ---------- + track : Track + Track to set as leftmost track in mixer. + """ + RPR.SetMixerScroll(track.id) diff --git a/reapy/core/reapy_object.py b/reapy/core/reapy_object.py index a75cc00d..85108542 100644 --- a/reapy/core/reapy_object.py +++ b/reapy/core/reapy_object.py @@ -1,3 +1,6 @@ +from reapy.tools import Program + + class ReapyObject: """Base class for reapy objects.""" @@ -42,3 +45,17 @@ def _to_dict(self): "args": self._args, "kwargs": self._kwargs } + + +class ReapyObjectList(ReapyObject): + + """Abstract class for list of ReapyObjects.""" + + def __iter__(self): + code = """ + elements = [ro_list[i] for i in range(len(ro_list))] + """ + elements, = Program(code, "elements").run(ro_list=self) + for element in elements: + yield element + diff --git a/reapy/core/track/__init__.py b/reapy/core/track/__init__.py index f6492dbc..e1eed388 100644 --- a/reapy/core/track/__init__.py +++ b/reapy/core/track/__init__.py @@ -1,3 +1,3 @@ from .automation_item import AutomationItem from .send import Send -from .track import Track +from .track import Track, TrackList diff --git a/reapy/core/track/track.py b/reapy/core/track/track.py index d16d3e3d..13e0ed31 100644 --- a/reapy/core/track/track.py +++ b/reapy/core/track/track.py @@ -1,6 +1,6 @@ import reapy from reapy import reascript_api as RPR -from reapy.core import ReapyObject +from reapy.core import ReapyObject, ReapyObjectList from reapy.tools import Program from reapy.errors import UndefinedEnvelopeError @@ -428,3 +428,46 @@ def visible_fx(self): """ with reapy.inside_reaper(): return self.fxs[RPR.TrackFX_GetChainVisible(self.id)] + + +class TrackList(ReapyObjectList): + + """ + Container for a project's track list. + + Examples + -------- + >>> tracks = project.tracks + >>> len(tracks) + 4 + >>> tracks[0].name + 'Kick' + >>> for track in tracks: + ... print(track.name) + ... + 'Kick' + 'Snare' + 'Hi-hat' + 'Cymbal" + """ + + def __init__(self, parent): + """ + Create track list. + + Parameters + ---------- + parent : Project + Parent project. + """ + self.parent = parent + + def __getitem__(self, key): + return Track(key, self.parent) + + def __len__(self): + return self.parent.n_tracks + + @property + def _args(self): + return self.parent, diff --git a/reapy/core/window/__init__.py b/reapy/core/window/__init__.py index 038f3d9b..f9552f5b 100644 --- a/reapy/core/window/__init__.py +++ b/reapy/core/window/__init__.py @@ -1,2 +1,3 @@ -from .window import Window from .midi_editor import MIDIEditor +from .tooltip import ToolTip +from .window import Window diff --git a/reapy/core/window/tooltip.py b/reapy/core/window/tooltip.py new file mode 100644 index 00000000..045335e5 --- /dev/null +++ b/reapy/core/window/tooltip.py @@ -0,0 +1,106 @@ +import reapy.reascript_api as RPR +from .window import Window + + +class ToolTip(Window): + + """Tooltip window.""" + + def __init__(self, message=" ", x=0, y=0, topmost=True, show=True): + """Initialize tooltip. + + Parameters + ---------- + message : str, optional + ToolTip message (default=" "). Note that tooltips with + empty messages are always hidden. + x : int, optional + x position (default=0). + y : int, optional + y position (default=0). + topmost : bool, optional + Whether tooltip should be displayed on top of all other + windows (default=True). + show : bool, optional + Whether to show tooltip on initialization (default=True). + """ + self._message = message + self._x = x + self._y = y + self._topmost = topmost + if show: + self.show() + self.id = RPR.GetTooltipWindow + + def hide(self): + """Hide tooltip.""" + RPR.TrackCtl_SetToolTip("", self.x, self.y, self.topmost) + self._is_shown = False + + @property + def message(self): + """ + Tooltip message. + + Note that tooltips with empty messages are always hidden. + + :type: str + """ + return self._message + + @message.setter + def message(self, message): + self._message = message + if self._is_shown: + self.show() + + def refresh(self): + pass + + def show(self): + """Show tooltip.""" + RPR.TrackCtl_SetToolTip(self.message, self.x, self.y, self.topmost) + self._is_shown = True + + @property + def topmost(self): + """ + Whether tooltip is displayed on top of all other windows. + + :type: bool + """ + return self._topmost + + @topmost.setter + def topmost(self, topmost): + self._topmost = topmost + if self._is_shown: + self.show() + + @property + def x(self): + """ + x position. + + :type: int""" + return self._x + + @x.setter + def x(self, x): + self._x = x + if self._is_shown: + self.show() + + @property + def y(self): + """y position. + + :type: int + """ + return self._y + + @y.setter + def y(self, y): + self._y = y + if self._is_shown: + self.show() diff --git a/reapy/core/window/window.py b/reapy/core/window/window.py index e54fe392..f01ca40a 100644 --- a/reapy/core/window/window.py +++ b/reapy/core/window/window.py @@ -11,3 +11,7 @@ def __init__(self, id): @property def _args(self): return (self.id,) + + def refresh(self): + """Refresh window.""" + RPR.DockWindowRefreshForHWND(self.id) From 1b379a6364463cd75e9d009c2d4b14ad16ada214 Mon Sep 17 00:00:00 2001 From: RomeoDespres <39157756+RomeoDespres@users.noreply.github.com> Date: Sat, 23 Mar 2019 11:31:54 +0100 Subject: [PATCH 2/3] Update setup.py and README --- README.md | 6 +++--- setup.py | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 22624eb6..21034c25 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ * [ReaScript API](#reascript-api) * [`reapy` API](#reapy-api) * [Performance](#performance) - * [More](#more) + * [Documentation](#documentation) 3. [Contributing](#contributing) 4. [Author](#author) 5. [License](#license) @@ -96,9 +96,9 @@ When used from inside REAPER, `reapy` has almost identical performance than nati ``` -### More +### Documentation -Check the [documentation](https://python-reapy.readthedocs.io/ "reapy online documentation") and especially the [API guide](https://python-reapy.readthedocs.io/en/latest/api_guide.html) for more information. +Check the [documentation](https://python-reapy.readthedocs.io/ "reapy online documentation") and especially the [API guide](https://python-reapy.readthedocs.io/en/latest/api_guide.html) and [Translation Table](https://python-reapy.readthedocs.io/en/latest/api_table.html) for more information. ## Contributing diff --git a/setup.py b/setup.py index 4e862e4e..23dc6737 100755 --- a/setup.py +++ b/setup.py @@ -1,6 +1,7 @@ from setuptools import setup, find_packages from os import path + here = path.abspath(path.dirname(__file__)) with open(path.join(here, "README.md")) as f: @@ -8,7 +9,7 @@ setup( name="python-reapy", - version="0.1.0", + version="0.2.0", description="A pythonic wrapper for REAPER's ReaScript Python API", long_description=long_description, long_description_content_type="text/markdown", @@ -19,7 +20,7 @@ "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3" ], - keywords="REAPER DAW ReaScript API wrapper music", + keywords="REAPER DAW ReaScript API wrapper music audio", packages=find_packages(exclude=["docs"]), python_requires=">=3.0" ) From b82d725d0b6ebab21f8c1af9d555f5a1c84f470f Mon Sep 17 00:00:00 2001 From: RomeoDespres <39157756+RomeoDespres@users.noreply.github.com> Date: Sat, 23 Mar 2019 12:12:04 +0100 Subject: [PATCH 3/3] Update CHANGELOG.md --- CHANGELOG.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 191e50a3..be834767 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,6 @@ All notable changes to this project will be documented in this file. -## [Unreleased] - ### Added #### API Helper Functions @@ -12,7 +10,7 @@ All notable changes to this project will be documented in this file. #### Audio Management -- class [`AudioAccessor`] +- class [`AudioAccessor`](https://python-reapy.readthedocs.io/en/latest/reapy.core.html#reapy.core.AudioAccessor) - [`Take.add_audio_accessor`], [`Track.add_audio_accessor`] - [`Source.delete`] @@ -74,7 +72,7 @@ All notable changes to this project will be documented in this file. #### Project Management - [`open_project`] -- [`get_projects`] UNTESTED +- [`get_projects`] #### Track Management