├── Docs-SourceFiles ├── reaper-apidocs.USDocML ├── reaper-apidocs.xml └── reaper-config_var.USDocML ├── Docs ├── Envelope-StateChunk-Doku.txt ├── Filetype-Descriptions.html ├── Jumping_FX_Button_in_TCP-demo.zip ├── LiceCap_ini_doku.txt ├── MediaItemStateChunk-Doku.txt ├── ParmLearnDocs.txt ├── Reaper-ActionList.txt ├── Reaper-All_ConfigVars_as_toggled_by_Actions.txt ├── Reaper-CommandIDs-ReservedForScripts.txt ├── Reaper-ConfigVariables-Documentation.txt ├── Reaper-Envelope-StateChunk-Doku.txt ├── Reaper-MediaItemStateChunk-Doku.txt ├── Reaper-ProjectDefault-ConfigSettings.txt ├── Reaper-Render-Strings-docs_Jul2018.txt ├── Reaper-Renderformat-Codes-For-Projectfiles.txt ├── Reaper-StuffMidiMessage-Codes(engl_shortlist).txt ├── Reaper-Windows-ChildIDs.txt ├── Reaper_API_Video.html ├── Reaper_API_Web.html ├── Reaper_Api_Documentation.html ├── RenderPreset-Configfile-Reaper5.txt ├── RenderPreset-Configfile-Reaper6.txt ├── ShowVars_Toggle-5_90pre2_formatted.txt ├── StuffMidiMessage-docs.txt ├── gfx │ ├── Lua5.3.png │ ├── SWS2.8.8.png │ ├── SWS2.9.6.png │ ├── SWS2.9.7.png │ ├── reaper.png │ ├── reaper5.40.png │ ├── reaper5.50.png │ ├── reaper5.52.png │ ├── reaper5.62.png │ ├── reaper5.70.png │ ├── reaper5.77.png │ ├── reaper5.80.png │ ├── reaper5.90.png │ ├── reaper5.91.png │ ├── reaper5.92.png │ ├── reaper5.94.png │ ├── reaper5.941.png │ ├── ultraschall4.00.png │ └── us.png ├── readme.txt ├── render-codes-decoded-base64-strings-14-February-2019.txt └── render-codes-decoded-base64-strings.txt ├── Helpful_Ini_Files ├── Reaper-ActionList.ini ├── Reaper-ActionList_v5_79.ini ├── Reaper-ActionList_v5_80.ini ├── Reaper-ActionList_v5_95.ini ├── Reaper-ActionList_v5_96.ini ├── Reaper-Gfx.GetKey_Codes_and_their_associated_character.ini ├── Reaper-KEY-Codes_for_reaper-kb_ini.ini ├── Reaper-Menu-Only-Actions.ini ├── Reaper-Render-Codes-for-AudioCD.ini ├── Reaper-Render-Codes.ini ├── Reaper-factory-default-KEY-Codes_for_reaper-kb_ini.ini └── StuffMidiMessage-AllMessages_Englisch_Windows.ini ├── Misc ├── Developer_Reaper5965.ReaperLangPack └── Developer_Reaper6_02rc1.ReaperLangPack ├── README.md ├── Scripts └── ultraschall_PreviewAudioBeforeRecording.lua ├── Tools ├── AnalyseTools │ ├── CheckForNewConfigVars.lua │ ├── CheckReascriptCPP.lua │ ├── FindNewActions.lua │ ├── GetOldConfigVars.lua │ └── NewReaScriptConverter.lua ├── Developer_Reaper5965.ReaperLangPack ├── Env_State_Diffs_Monitor.lua ├── HWND-Displayer.lua ├── Item_State_Diffs_Monitor.lua ├── Project_State_Diffs_Monitor.lua ├── Track_State_Diffs_Monitor.lua ├── Ultraschall_StateInspector │ ├── ActionList_Reaper.ini │ ├── ActionList_Reaper.txt │ ├── ActionList_SWS.txt │ ├── Readme.txt │ ├── Ultraschall-Inspector.ini │ ├── Ultraschall_Inspector_Gfx_GetKey_Codes.ini │ ├── ultraschall_StateInspector.lua │ └── us.png ├── gfx_deltablit_displayer.lua ├── misc │ └── HWND-Displayer.gif ├── readme.txt ├── ultraschall_Display-Altered-Config-Vars.lua ├── ultraschall_Display-Altered-ConfigFile-Entries.lua ├── ultraschall_Find_Valid_ConfigVariables_In_String.lua └── ultraschall_findConfigVarsToggledByActions.lua └── ultraschall_api_index-beta_rename_when_installing_it_works.xml /Docs/Envelope-StateChunk-Doku.txt: -------------------------------------------------------------------------------- 1 | EnvelopeStateChunk Docs(work in progress) by Meo Mespotine(mespotine.de) for the ultraschall.fm-project 2 | Note: Includes also Pooled/Automation-Items themselves, even though they are only available in .rpp-projectfiles and .ReaperAutoItem-files 3 | 4 | number is equal to float 5 | 6 | 7 | Normal Envelopes: 8 | -------------------------------------------------------------------------------- /Docs/Jumping_FX_Button_in_TCP-demo.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mespotine/ultraschall-and-reaper-docs/c8b6843fd6325161d129d1b55c147f4194392bd4/Docs/Jumping_FX_Button_in_TCP-demo.zip -------------------------------------------------------------------------------- /Docs/LiceCap_ini_doku.txt: -------------------------------------------------------------------------------- 1 | Documented by Meo Mespotine (mespotine.de) for the ultraschall.fm-project 2 | 3 | For some time now, it is possible to use Cocko's own screen-recording tool "LiceCap" directly from Reaper(https://www.cockos.com/licecap/). 4 | Run the action: 41298 - "Run LICEcap (animated screen capture utility)", which will open a dialog window, where you can select the LiceCap-app from. 5 | The next time you run this action, LiceCap will be started right away. 6 | 7 | The path to the licecap-app is stored in the reaper.ini: [REAPER] -> licecap_path, like 8 | licecap_path=LICEcap\licecap.exe 9 | This path can be relative, so you can copy the LiceCap-folder into your Reaper-App-Folder, when using a portable installation. 10 | That way, you can take LiceCap anywhere, where you take your Reaper with you. 11 | 12 | LiceCap stores it's preferences-values into LiceCap.ini, that can be located in the same folder as the app itself. 13 | The following settings are stored into the LiceCap.ini. 14 | 15 | [licecap] 16 | lastfn=C:\Program Files (x86)\LICEcap\z.gif 17 | last used filename 18 | 19 | wnd_r=0 1 1133 703 20 | position of the capture-frame: x_left y_top x_right y_bottom in pixels 21 | negative values are allowed, so positioning of the LiceCap-window outside the top and left border of the viewport is possible 22 | default is: 0 0 835 571 23 | x_right and y_bottom must be bigger than x_left and y_top, or LiceCap uses it's default values 24 | x_right and y_bottom can't be bigger more than a few pixels behind the border 25 | 26 | maxfps=99 27 | max frames per second, minimum value is 1 28 | maximum value is 2147483647 29 | negative values produce weird fps-values within the LiceCap-App 30 | 31 | prefs=x - bitmask 32 | &1 - display in animation: title frame - checkbox 33 | &2 - Big font - checkbox 34 | &4 - display in animation: mouse button press - checkbox 35 | &8 - display in animation: elapsed time - checkbox 36 | &16 - Ctrl+Alt+P pauses recording - checkbox 37 | &32 - Use .GIF transparency for smaller files - checkbox 38 | &64 - Automatically stop after xx seconds - checkbox 39 | 40 | titlems=1200 41 | show titlecard-length in milliseconds 42 | negative values are allowed, though useless 43 | maximum is 1410065400, though 2147483600 seems to be settable 44 | 45 | gifloopcnt=98 46 | .GIF repeat count (0=infinite) 47 | negative values are allowed, though useless 48 | 0 is minimum value, 2147483647 is maximum value, higher than that makes it negative 49 | 50 | stopafter=1200 51 | automatically stop after xx seconds, in milliseconds 52 | negative values are allowed, though useless 53 | 2147483600 is maximum value 54 | 55 | title=Titlesequence 56 | text for the title-card, newlines will be ignored, after reload! -------------------------------------------------------------------------------- /Docs/ParmLearnDocs.txt: -------------------------------------------------------------------------------- 1 | Parameter-Learn/Modulation/Alias-Chunk - documentation 2 | compiled by Meo Mespotine 07.05.2019 3 | 4 | Thanks to Anton9 for helping me with that :) 5 | 6 | 7 | 8 | Assignment of MIDI and OSC-commands to Parameter-Learn: 9 | 10 | PARMLEARN integer parmidx:optional string parametername integer midi_note integer checkboxflags optional string osc_message 11 | 12 | For TrackFX: 13 | Stored in TrackStateChunks in the FX parameter list -> Learn" 29 | 30 | optional string parametername - this is shown directly after parmidx, separated by a : 31 | e.g. 1:wet 32 | usually only wet or bypass 33 | In most other parameters, this is omitted! 34 | 35 | integer midi_note - the midinote, that is assigned to this; 36 | 0, OSC is used 37 | 176, MIDI Chan 1 CC 0 38 | ... 39 | 432, MIDI Chan 1 CC 1 40 | ... 41 | 9360, MIDI Chan 1 Note 36 42 | 9616, MIDI Chan 1 Note 37 43 | 9872, MIDI Chan 1 Note 38 44 | ... 45 | 46 | CC Mode-dropdownlist: 47 | set the following flags to their specific values (0=0, 1=the value beginning &, like &65536 or &131072 or &262144) 48 | &65536 &131072 &262144 49 | 0 0 0, Absolute 50 | 1 0 0, Relative 1(127=-1, 1=+1) 51 | 0 1 0, Relative 2(63=-1, 65=+1) 52 | 1 1 0, Relative 3(65=-1, 1=+1) 53 | 0 0 1, Toggle (>0=toggle) 54 | 55 | 56 | integer checkboxflags - the checkboxes checked in the MIDI/OSC-learn dialog 57 | 0, no checkboxes 58 | 1, enable only when track or item is selected 59 | 2, Soft takeover (absolute mode only) 60 | 3, Soft takeover (absolute mode only)+enable only when track or item is selected 61 | 4, enable only when effect configuration is focused 62 | 8, MUST NOT BE SET, or this entry will be changed into LFOLEARN instead! 63 | 20, enable only when effect configuration is visible 64 | 65 | optional string string osc_message - the message of the osc-controller; only when midi_note is set to 0 66 | 67 | Examples: 68 | PARMLEARN 12 0 4 I am the OSC message 69 | PARMLEARN 14 19600 4 70 | PARMLEARN 16:wet 0 4 I am the OSC message 71 | 72 | 73 | 74 | FX-Parameter aliases: 75 | 76 | PARMALIAS integer parmidx string aliasname 77 | 78 | stores aliasnames for the Track-FX-parameters, that will be shown instead of the original ones in menus. 79 | Only Tracks can have parameter-aliases! 80 | 81 | 82 | parameters: 83 | integer parmidx - the idx of the parameter that has LEARN activated, 84 | in the order of the contextmenu "Param -> FX parameter list -> Learn" 85 | 86 | string aliasname - the aliasname of the fx-parameter, will be shown instead of the "real name" 87 | of the parameter in the context-menus of the Param-button 88 | 89 | 90 | FX-parameter-modulation: 91 | This stores all parameter-settings for modulation 92 | 93 | For TrackFX: 94 | Stored in TrackStateChunks in the 221 | 222 | 223 | 224 | 225 | LFOLearn: 226 | LFOLEARN integer parmidx:optional string parametername integer midi_note integer checkboxflags optional string osc_message 227 | 228 | For TrackFX: 229 | Stored in TrackStateChunks in the FX parameter list -> Learn" 242 | 243 | optional string parametername - this is shown directly after parmidx, separated by a : 244 | e.g. 1:wet 245 | usually only wet or bypass 246 | In most other parameters, this is omitted! 247 | 248 | integer midi_note - the midinote, that is assigned to this; 249 | 0, OSC is used 250 | 9360, MIDI Chan 1 Note 36 251 | 9616, MIDI Chan 1 Note 37 252 | 9872, MIDI Chan 1 Note 38 253 | ... 254 | 255 | integer checkboxflags - the checkboxes checked in the MIDI/OSC-learn dialog 256 | 0, no checkboxes 257 | 1, enable only when track or item is selected 258 | 2, Soft takeover (absolute mode only) 259 | 3, Soft takeover (absolute mode only)+enable only when track or item is selected 260 | 4, enable only when effect configuration is focused 261 | 8, MUST BE SET, or this entry will be changed into PARMLEARN instead! 262 | 20, enable only when effect configuration is visible 263 | 264 | optional string string osc_message - the message of the osc-controller; only when midi_note is set to 0 -------------------------------------------------------------------------------- /Docs/Reaper-Envelope-StateChunk-Doku.txt: -------------------------------------------------------------------------------- 1 | EnvelopeStateChunk Docs(work in progress) by Meo Mespotine(mespotine.de) for the ultraschall.fm-project 2 | Note: Includes also Pooled/Automation-Items themselves, even though they are only available in .rpp-projectfiles and .ReaperAutoItem-files 3 | 4 | number is equal to float 5 | 6 | 7 | Normal Envelopes: 8 | -------------------------------------------------------------------------------- /Docs/Reaper-ProjectDefault-ConfigSettings.txt: -------------------------------------------------------------------------------- 1 | Default Project Settings (incomplete): 2 | 3 | Nur Settings nehmen, die per Project geändert werden, sprich in mehreren Projekten zur gleichen Zeit unterschiedlich genutzt werden können. 4 | Alle anderen sind globale Settings! 5 | Dazu musst Du nochmal durch alle durchgehen, da ich eventuell einige globale reingenommen habe(hab erst jetzt den Unterschiede verstanden). 6 | Sorry... 7 | PS: In den Preferences scheint es noch Settings zu geben, die DefaultProject-Based zu sehen sind. Musste mal durchgehen, da die bei Apply Changes gesetzt werden und nicht durch den Save as Default Project Settings-Button der Project Settings. 8 | Ich war bei Preferences -> Track/Sends Defaults. Die reaper.ini-Configvariablen musste da nochmal durchgehen und checken, auf Globalität. 9 | 10 | Achja: Und dann nachtragen in die Configvar-Doku... 11 | 12 | [REAPER] 13 | audioprshift= 14 | defautomode= 15 | defpitchcfg= 16 | defsendflag= 17 | defstretchmode= 18 | deftrackrecflags= 19 | deftrackvol= 20 | defvzoom= 21 | feedbackmode= 22 | itemmixflag= 23 | itemtimelock= 24 | loopgranlen= 25 | mastermutesolo= 26 | miscopts= 27 | mixerflag=2 28 | mixeruiflag=11 29 | mixrowflags=48 30 | newtflag= 31 | opennotes= 32 | panlaw= 33 | panmode= 34 | playrate= 35 | playresamplemode= 36 | pooledenvattach= 37 | projalignbeatsrate= 38 | projbpm= 39 | projdefrecpath= 40 | projdefrecpath2= 41 | projfrbase= 42 | projfrdrop= 43 | projfridx=8 44 | projgriddiv=1.00000000 45 | projgriddivsnap=1.00000000 46 | projgridframe=0 47 | projgridmin=8 48 | projgridsnapmin=8 49 | projgridswing= 50 | projgroupover=0 51 | projgroupsel=0 52 | projintmix=0 53 | projmasternch=2 54 | projmastervuflags=2 55 | projmaxlen=600.00000000 56 | projmaxlenuse=0 57 | projmeaslen=4 58 | projmeasoffs=-1 59 | projmeasoffsruler= 60 | projmetrobeatlen=4 61 | projmetrocountin=2.00000000 62 | projmetroen=6 63 | projmetrof1=800 64 | projmetrof2=1600 65 | projmetrofn1= 66 | projmetrofn2= 67 | projmetrov1=0.25000000 68 | projmetrov2=0.12500000 69 | projpeaksgain=1.10000000 70 | projrecforopencopy=0 71 | projrecmode=1 72 | projrelpath=1 73 | projrelsnap=0 74 | projrenderaddtoproj=0 75 | projrenderdither=0 76 | projrenderlimit=0 77 | projrendernch=0 78 | projrenderqdelay=0 79 | projrenderrateinternal=1 80 | projrenderresample=7 81 | projrendersrate=2 82 | projrenderstems=0 83 | projripedit=0 84 | projsellock=1 85 | projshowgrid=3198 86 | projsmpteahead=1000 87 | projsmptefw_rec= 88 | projsmpteinput=0 89 | projsmptemaxfree=300 90 | projsmpteoffs=0.00000000 91 | projsmpterate=25.00000000 92 | projsmpterateuseproj=1 93 | projsmpteresync=100 94 | projsmpteresync_rec= 95 | projsmpteskip=40 96 | projsmptesync=0 97 | projsrate=48000 98 | projsrateuse=1 99 | projtakelane=1 100 | projtimemode=0 101 | projtimemode2=0 102 | projtimeoffs=0.00000000 103 | projtrackgroupdisabled=1 104 | projtsdenom=4 105 | projvidflags= 106 | projvidh= 107 | projvidw= 108 | psmaxv= 109 | psminv= 110 | reccfg= 111 | reccfg_sz= 112 | rendercfg= 113 | rendercfg_sz= 114 | rendertaillen= 115 | rendertails= 116 | rewireslave= 117 | rewireslavedelay= 118 | scoreminnotelen= 119 | scorequant= 120 | showmaintrack= 121 | volenvrange= 122 | vzoom2= 123 | zoom= 124 | 125 | -------------------------------------------------------------------------------- /Docs/Reaper-Renderformat-Codes-For-Projectfiles.txt: -------------------------------------------------------------------------------- 1 | compiled by Meo Mespotine(mespotine.de) for the ultraschall.fm-project 2 | 3 | Introduction: 4 | This is a collection of the render-cfg-codes, as stored into .rpp-project-files. 5 | Some formats have specific codes(like DDP), others follow a certain scheme. 6 | The latter is described in a matrix like the following example for FLAC: 7 | 8 | First, there's a string with all symbols, that always stay the same with all encoder-settings, with . for each character, 9 | that can be changed in the string. 10 | Y2FsZh.AAAA.AAAA 11 | These . are placeholders for characters or strings, that signal Reaper changes in the Audio-Format. 12 | 13 | The next lines tell you, which string/characters shall replace the individual dots. in the render-string. 14 | ------.--------- signals the Bitrate, like g for 24bit 15 | -----------.---- signals the encoding-speed, with F for default encoding-speed. 16 | 17 | So if you want to set renderstring to FLAC with 24bit and default encoding speed, the string 18 | Y2FsZh.AAAA.AAAA 19 | becomes 20 | Y2FsZhgAAAAFAAAA 21 | This way, you can construct yourself your own render-string. You will find all other settings for FLAC later in this document. 22 | To insert a render-string, look into your rpp-file for the following section: 23 | 24 | 27 | 28 | Just replace the string in the middle with the one you've constructed. This, in combination with the action 29 | 41824 - File: Render project, using the most recent render settings 30 | can be used, to create your own rendering-functions in Lua, Python or EEL. 31 | 32 | These strings can also be used for creation of render-preset-entries in the reaper-render.ini. 33 | To insert a render-string, look into your reaper-render.ini for the following entry 34 | 35 | 38 | 39 | and replace the string in the middle with your own created one. 40 | 41 | The documentation is still missing m4a(mac-only), OGG VORBIS, Audio-CD-image, Video(GIF) and Video(LCF). 42 | 43 | 44 | 45 | The Formats and their Descriptions: 46 | AIFF: 47 | ZmZpYQgAAA== - 8 bit PCM 48 | ZmZpYRAAAA== - 16 bit PCM 49 | ZmZpYRgAAA== - 24 bit PCM 50 | ZmZpYSAAAA== - 32 bit PCM 51 | 52 | 53 | WAV: 54 | Some of the settings concentrate on one placeholder in the render-string. These are just added values, means: when I write, 55 | set 2 letters higher, that means, you shall count the letters forward by the order of the alphabet: A->C is two letters 56 | forward from the A. 57 | In some cases, you would need to add higher than Z, in that case, the alphabet starts counting again with small letters like a,b,c,etc. 58 | So, when I say, count two letters forward, this could mean: Z -> b (Z, a, b). 59 | 60 | This is confusing at the beginning but take some time to get your head around it. 61 | 62 | ZXZhdwgBAQ== 63 | -----..----- Wav bit depth: wg(8 bit PCM), xA(16 bit PCM), xg(24 bit PCM), yA(32 bit FP), 0A(64 bit FP), wQ(4 bit IMA ADPCM), wI(2 bit cADPCM) 64 | -------...-- Large Files: BAA(Auto WAV/Wave64), BAQ(Auto WAV/RF64), DAA(Force WAV), BAg(Force Wave64), BAw(Force RF64) 65 | -------.---- Write BWF ('btext') chunk: Checkbox enabled: Set one letter lower, than was set in "Large Files": B->A, D->C 66 | -------.---- Include project filename in BWF data: Checkbox enabled: Set four letters higher, than was set in "Write BWF": C->G, A->E 67 | you can also set Include project filename with Write BWF disabled. In that case, set the letter one higher, though 68 | this setting will probably be ignored by Reaper, as this greyes out the Include project filename-checkbox in the 69 | render-dialog. 70 | 71 | -------.---- Include marker dropdownlist; only one of the entries from the dropdownlist is selectable 72 | Do not include markers or regions: keep the value. 73 | Markers + regions - set 8 letters higher: B->J, etc 74 | Markers + regions starting with # - set 24 letters higher (B->Z) 75 | 76 | Include marker dropdownlist(continuation); still only one of all entries from the dropdownlist is selectable, but 77 | these entries need two characters to be altered in the render-string. 78 | -------..--- Markers only - set the first letter one higher(A->B) and the second eight higher(B->J) 79 | Markers starting with # only - set the first letter one higher(A->B) and the second 24 higher(B->Z) 80 | Regions only - set the first letter two higher(A->C) and the second eight higher(B->J) 81 | Regions starting with # only - set the first letter two higher(A->C) and the second 24 higher(B->Z) 82 | 83 | -------.---- Embed project tempo (use with care): add 32 to the letter (B->h) 84 | 85 | 86 | DDP: 87 | IHBkZA= - DDP 88 | 89 | 90 | FLAC: 91 | Format-matrix: 92 | Y2FsZh.AAAA.AAAA 93 | ------.--------- Bitrate: g(24 Bit), c(23/24 Bit), Y(22/24 Bit), U(21/24 Bit), Q(20/24 Bit), M(19/24 Bit), I(18/24 Bit), E(17/24Bit), A(16 Bit) 94 | -----------.---- Encoding Speed: I(8 - slowest), H(7), G(6), F(5 - default), E(4), D(3), C(2), B(1), A(0 - fastest) 95 | 96 | These are all possible renderstrings for FLAC: 97 | 24Bit: 98 | Y2FsZhgAAAAIAAAA - 8 - Slowest 99 | Y2FsZhgAAAAHAAAA - 7 100 | Y2FsZhgAAAAGAAAA - 6 101 | Y2FsZhgAAAAFAAAA - 5 - Default 102 | Y2FsZhgAAAAEAAAA - 4 103 | Y2FsZhgAAAADAAAA - 3 104 | Y2FsZhgAAAACAAAA - 2 105 | Y2FsZhgAAAABAAAA - 1 106 | Y2FsZhgAAAAAAAAA - 0 - Fastest 107 | 108 | 23/24Bit: 109 | Y2FsZhcAAAAIAAAA - 8 - Slowest 110 | Y2FsZhcAAAAHAAAA - 7 111 | Y2FsZhcAAAAGAAAA - 6 112 | Y2FsZhcAAAAFAAAA - 5 - Default 113 | Y2FsZhcAAAAEAAAA - 4 114 | Y2FsZhcAAAADAAAA - 3 115 | Y2FsZhcAAAACAAAA - 2 116 | Y2FsZhcAAAABAAAA - 1 117 | Y2FsZhcAAAAAAAAA - 0 - Fastest 118 | 119 | 22/24Bit: 120 | Y2FsZhYAAAAIAAAA - 8 - Slowest 121 | Y2FsZhYAAAAHAAAA - 7 122 | Y2FsZhYAAAAGAAAA - 6 123 | Y2FsZhYAAAAFAAAA - 5 - Default 124 | Y2FsZhYAAAAEAAAA - 4 125 | Y2FsZhYAAAADAAAA - 3 126 | Y2FsZhYAAAACAAAA - 2 127 | Y2FsZhYAAAABAAAA - 1 128 | Y2FsZhYAAAAAAAAA - 0 - Fastest 129 | 130 | 21/24Bit: 131 | Y2FsZhUAAAAIAAAA - 8 - Slowest 132 | Y2FsZhUAAAAHAAAA - 7 133 | Y2FsZhUAAAAGAAAA - 6 134 | Y2FsZhUAAAAFAAAA - 5 - Default 135 | Y2FsZhUAAAAEAAAA - 4 136 | Y2FsZhUAAAADAAAA - 3 137 | Y2FsZhUAAAACAAAA - 2 138 | Y2FsZhUAAAABAAAA - 1 139 | Y2FsZhUAAAAAAAAA - 0 - Fastest 140 | 141 | 20/24Bit: 142 | Y2FsZhQAAAAIAAAA - 8 - Slowest 143 | Y2FsZhQAAAAHAAAA - 7 144 | Y2FsZhQAAAAGAAAA - 6 145 | Y2FsZhQAAAAFAAAA - 5 - Default 146 | Y2FsZhQAAAAEAAAA - 4 147 | Y2FsZhQAAAADAAAA - 3 148 | Y2FsZhQAAAACAAAA - 2 149 | Y2FsZhQAAAABAAAA - 1 150 | Y2FsZhQAAAAAAAAA - 0 - Fastest 151 | 152 | 19/24Bit: 153 | Y2FsZhMAAAAIAAAA - 8 - Slowest 154 | Y2FsZhMAAAAHAAAA - 7 155 | Y2FsZhMAAAAGAAAA - 5 156 | Y2FsZhMAAAAFAAAA - 5 - Default 157 | Y2FsZhMAAAAEAAAA - 4 158 | Y2FsZhMAAAADAAAA - 3 159 | Y2FsZhMAAAACAAAA - 2 160 | Y2FsZhMAAAABAAAA - 1 161 | Y2FsZhMAAAAAAAAA - 0 - Slowest 162 | 163 | 18/24Bit: 164 | Y2FsZhIAAAAIAAAA - 8 - Slowest 165 | Y2FsZhIAAAAHAAAA - 7 166 | Y2FsZhIAAAAGAAAA - 6 167 | Y2FsZhIAAAAFAAAA - 5 - Default 168 | Y2FsZhIAAAAEAAAA - 4 169 | Y2FsZhIAAAADAAAA - 3 170 | Y2FsZhIAAAACAAAA - 2 171 | Y2FsZhIAAAABAAAA - 1 172 | Y2FsZhIAAAAAAAAA - 0 - Fastest 173 | 174 | 175 | MP3: 176 | Each format (maximum bitrate, VBR, ABR and CBR) has it's own render-string. With the exception of Maximum bitrate/quality, you can set the 177 | encoding quality, as shown in render-matrix. This position is the same for VBR, ABR and CBR, even if they have different render-strings. 178 | 179 | Format-matrix 180 | ----------------..-------------------------- Encoding Quality CQ(fastest encode), Bw, BQ, Ag, AA(maximum slow); only available for VBR, ABR & CBR. 181 | 182 | 183 | Maximum bitrate/quality: 184 | bDNwbUABAAABAAAACgAAAP////8EAAAAQAEAAAAAAAA= 185 | 186 | VBR: 187 | bDNwbSAAAAABAAAA..AAAAAAAAAAAAAAQAEAAAAAAAA= - the encoding quality, refer the format-matrix above for the values to insert here 188 | 189 | The following strings have slowest encoding-quality set: 190 | bDNwbSAAAAABAAAAAAAAAAAAAAAAAAAAQAEAAAAAAAA= - 100(Best) Quality - maximum encode 191 | bDNwbSAAAAABAAAAAAAAAAAAAAABAAAAQAEAAAAAAAA= - 90 Quality - maximum encode 192 | bDNwbSAAAAABAAAAAAAAAAAAAAACAAAAQAEAAAAAAAA= - 80 Quality - maximum encode 193 | bDNwbSAAAAABAAAAAAAAAAAAAAADAAAAQAEAAAAAAAA= - 70 Quality - max encode 194 | bDNwbSAAAAABAAAAAAAAAAAAAAAEAAAAQAEAAAAAAAA= - 60 Quality - max encode 195 | bDNwbSAAAAABAAAAAAAAAAAAAAAFAAAAQAEAAAAAAAA= - 50 Quality - max encode 196 | bDNwbSAAAAABAAAAAAAAAAAAAAAGAAAAQAEAAAAAAAA= - 40 Quality - max encode 197 | bDNwbSAAAAABAAAAAAAAAAAAAAAHAAAAQAEAAAAAAAA= - 30 Quality - max encode 198 | bDNwbSAAAAABAAAAAAAAAAAAAAAIAAAAQAEAAAAAAAA= - 20 Quality - max encode 199 | bDNwbSAAAAABAAAAAAAAAAAAAAAJAAAAQAEAAAAAAAA= - 10(Worst) Quality - max encode 200 | 201 | ABR (Target Bitrate): 202 | bDNwbSAAAAABAAAA..AAAAQAAAAEAAAAQAEAAEABAAA= - the encoding quality, refer the format-matrix above for the values to insert here 203 | 204 | The following strings have slowest encoding-quality set: 205 | bDNwbSAAAAABAAAAAAAAAAQAAAAEAAAAQAEAAEABAAA= - 320 kbps - max encode 206 | bDNwbSAAAAABAAAAAAAAAAQAAAAEAAAAQAEAAAABAAA= - 256 kbps - max encode 207 | bDNwbSAAAAABAAAAAAAAAAQAAAAEAAAAQAEAAOAAAAA= - 224 kbps - max encode 208 | bDNwbSAAAAABAAAAAAAAAAQAAAAEAAAAQAEAAMAAAAA= - 192 kbps - max encode 209 | bDNwbSAAAAABAAAAAAAAAAQAAAAEAAAAQAEAAKAAAAA= - 160 kbps - max encode 210 | bDNwbSAAAAABAAAAAAAAAAQAAAAEAAAAQAEAAIAAAAA= - 128 kbps - max encode 211 | bDNwbSAAAAABAAAAAAAAAAQAAAAEAAAAQAEAAHAAAAA= - 112 kbps - max encode 212 | bDNwbSAAAAABAAAAAAAAAAQAAAAEAAAAQAEAAGAAAAA= - 96 kbps - max encode 213 | bDNwbSAAAAABAAAAAAAAAAQAAAAEAAAAQAEAAFAAAAA= - 80 kbps - max encode 214 | bDNwbSAAAAABAAAAAAAAAAQAAAAEAAAAQAEAAEAAAAA= - 64 kbps - max encode 215 | bDNwbSAAAAABAAAAAAAAAAQAAAAEAAAAQAEAADgAAAA= - 56 kbps - max encode 216 | bDNwbSAAAAABAAAAAAAAAAQAAAAEAAAAQAEAADAAAAA= - 48 kbps - max encode 217 | bDNwbSAAAAABAAAAAAAAAAQAAAAEAAAAQAEAACgAAAA= - 40 kbps - max encode 218 | bDNwbSAAAAABAAAAAAAAAAQAAAAEAAAAQAEAACAAAAA= - 32 kbps - max encode 219 | bDNwbSAAAAABAAAAAAAAAAQAAAAEAAAAQAEAABgAAAA= - 24 kbps - max encode 220 | bDNwbSAAAAABAAAAAAAAAAQAAAAEAAAAQAEAABAAAAA= - 16 kbps - max encode 221 | bDNwbSAAAAABAAAAAAAAAAQAAAAEAAAAQAEAAAgAAAA= - 8 kbps - max encode 222 | 223 | CBR (Constant Bitrate): 224 | bDNwbUABAAABAAAA..AAAP////8EAAAAQAEAAAAAAAA= - the encoding quality, refer the format-matrix above for the values to insert here 225 | 226 | The following strings have slowest encoding-quality set: 227 | bDNwbUABAAABAAAAAAAAAP////8EAAAAQAEAAAAAAAA= - 320 kbps - max encode 228 | bDNwbQABAAABAAAAAAAAAP////8EAAAAAAEAAAAAAAA= - 256 kbps - max encode 229 | bDNwbeAAAAABAAAAAAAAAP////8EAAAA4AAAAAAAAAA= - 224 kbps - max encode 230 | bDNwbcAAAAABAAAAAAAAAP////8EAAAAwAAAAAAAAAA= - 192 kbps - max encode 231 | bDNwbaAAAAABAAAAAAAAAP////8EAAAAoAAAAAAAAAA= - 160 kbps - max encode 232 | bDNwbYAAAAABAAAAAAAAAP////8EAAAAgAAAAAAAAAA= - 128 kbps - max encode 233 | bDNwbXAAAAABAAAAAAAAAP////8EAAAAcAAAAAAAAAA= - 112 kbps - max encode 234 | bDNwbWAAAAABAAAAAAAAAP////8EAAAAYAAAAAAAAAA= - 96 kbps - max encode 235 | bDNwbVAAAAABAAAAAAAAAP////8EAAAAUAAAAAAAAAA= - 80 kbps - max encode 236 | bDNwbUAAAAABAAAAAAAAAP////8EAAAAQAAAAAAAAAA= - 64 kbps - max encode 237 | bDNwbTgAAAABAAAAAAAAAP////8EAAAAOAAAAAAAAAA= - 56 kbps - max encode 238 | bDNwbTAAAAABAAAAAAAAAP////8EAAAAMAAAAAAAAAA= - 48 kbps - max encode 239 | bDNwbSgAAAABAAAAAAAAAP////8EAAAAKAAAAAAAAAA= - 40 kbps - max encode 240 | bDNwbSAAAAABAAAAAAAAAP////8EAAAAIAAAAAAAAAA= - 32 kbps - max encode 241 | bDNwbRgAAAABAAAAAAAAAP////8EAAAAGAAAAAAAAAA= - 24 kbps - max encode 242 | bDNwbRAAAAABAAAAAAAAAP////8EAAAAEAAAAAAAAAA= - 16 kbps - max encode 243 | bDNwbQgAAAABAAAAAAAAAP////8EAAAACAAAAAAAAAA= - 8 kbps - max encode 244 | 245 | 246 | Opus: 247 | Format-matrix: 248 | U2dnTwAA AAAA== 249 | ------------..------ complexity: Cg(10), CQ, CA, Bw, Bg, BQ, BA, Aw, Ag, AQ, AA(0) 250 | -----------.-------- Bitrate-mode, A(VBR), B(CVBR), C(HARD-CBR) 251 | --------...--------- Bitrate 252 | 253 | Bitrates: 254 | --------...--------- 255 | gEM - vbr 256 kbps 256 | YEM - 224 kbps 257 | QEM - 192 kbps 258 | IEM - 160 kbps 259 | AEM - 128 kbps 260 | 4EI - 112 kbps 261 | wEI - 96 kbps 262 | oEI - 80 kbps 263 | gEI - 64 kbps 264 | YEI - 56 kbps 265 | QEI - 48 kbps 266 | IEI - 40 kbps 267 | AEI - 32 kbps 268 | wEE - 24 kbps 269 | gEE - 16 kbps 270 | AEE - 8 kbps 271 | 272 | 273 | VBR: 274 | --------...-------- Bitrate 275 | U2dnTwAAgEMACgAAAA== - vbr 256 kbps complexity 10 276 | U2dnTwAAYEMACgAAAA== - 224 kbps compl 10 277 | U2dnTwAAQEMACgAAAA== - 192 kbps compl 10 278 | U2dnTwAAIEMACgAAAA== - 160 kbps compl 10 279 | U2dnTwAAAEMACgAAAA== - 128 kbps compl 10 280 | U2dnTwAA4EIACgAAAA== - 112 kbps compl 10 281 | U2dnTwAAwEIACgAAAA== - 96 kbps compl 10 282 | U2dnTwAAoEIACgAAAA== - 80 kbps - compl 10 283 | U2dnTwAAgEIACgAAAA== - 64 kbps - compl 10 284 | U2dnTwAAYEIACgAAAA== - 56 kbps - compl 10 285 | U2dnTwAAQEIACgAAAA== - 48 kbps - compl 10 286 | U2dnTwAAIEIACgAAAA== - 40 kbps - compl 10 287 | U2dnTwAAAEIACgAAAA== - 32 kbps - compl 10 288 | U2dnTwAAwEEACgAAAA== - 24 kbps - compl 10 289 | U2dnTwAAgEEACgAAAA== - 16 kbps - compl 10 290 | U2dnTwAAAEEACgAAAA== - 8 kbps - compl 10 291 | 292 | CVBR: 293 | --------...-------- Bitrate 294 | U2dnTwAAgEMBCgAAAA== - 256 kbps complexity 10 295 | U2dnTwAAYEMBCgAAAA== - 224 kbps compl 10 296 | U2dnTwAAQEMBCgAAAA== - 192 kbps compl 10 297 | U2dnTwAAIEMBCgAAAA== - 160 kbps compl 10 298 | U2dnTwAAAEMBCgAAAA== - 128 kbps compl 10 299 | U2dnTwAA4EIBCgAAAA== - 112 kbps compl 10 300 | U2dnTwAAwEIBCgAAAA== - 96 kbps compl 10 301 | U2dnTwAAoEIBCgAAAA== - 80 kbps - compl 10 302 | U2dnTwAAgEIBCgAAAA== - 64 kbps - compl 10 303 | U2dnTwAAYEIBCgAAAA== - 56 kbps - compl 10 304 | U2dnTwAAQEIBCgAAAA== - 48 kbps - compl 10 305 | U2dnTwAAIEIBCgAAAA== - 40 kbps - compl 10 306 | U2dnTwAAAEIBCgAAAA== - 32 kbps - compl 10 307 | U2dnTwAAwEEBCgAAAA== - 24 kbps - compl 10 308 | U2dnTwAAgEEBCgAAAA== - 16 kbps - compl 10 309 | U2dnTwAAAEEBCgAAAA== - 8 kbps - compl 10 310 | 311 | HARD-CBR: 312 | --------...-------- Bitrate 313 | U2dnTwAAgEMCCgAAAA== - 256 kbps complexity 10 314 | U2dnTwAAYEMCCgAAAA== - 224 kbps compl 10 315 | U2dnTwAAQEMCCgAAAA== - 192 kbps compl 10 316 | U2dnTwAAIEMCCgAAAA== - 160 kbps compl 10 317 | U2dnTwAAAEMCCgAAAA== - 128 kbps compl 10 318 | U2dnTwAA4EICCgAAAA== - 112 kbps compl 10 319 | U2dnTwAAwEICCgAAAA== - 96 kbps compl 10 320 | U2dnTwAAoEICCgAAAA== - 80 kbps - compl 10 321 | U2dnTwAAgEICCgAAAA== - 64 kbps - compl 10 322 | U2dnTwAAYEICCgAAAA== - 56 kbps - compl 10 323 | U2dnTwAAQEICCgAAAA== - 48 kbps - compl 10 324 | U2dnTwAAIEICCgAAAA== - 40 kbps - compl 10 325 | U2dnTwAAAEICCgAAAA== - 32 kbps - compl 10 326 | U2dnTwAAwEECCgAAAA== - 24 kbps - compl 10 327 | U2dnTwAAgEECCgAAAA== - 16 kbps - compl 10 328 | U2dnTwAAAEECCgAAAA== - 8 kbps - compl 10 329 | 330 | 331 | VIDEO: 332 | Format-matrix: 333 | UE1GRg.AAAA.AAAA...AAA.AAA....AA...AA...AA......AQAAA..AAAA= the render-string for video; fill the gaps with the accompanying 334 | setting-strings/characters 335 | ------.----------------------------------------------------- Video Container Y(WebM), Q(MKV), M(MP4,QT,MOV), A(AVI) 336 | -----------.------------------------------------------------ Video Format AVI: C(DV),D(MJPEG),E(FFV1 Losless),F(Huffyuv Losless) 337 | QT/MOV/MP4: C(MJPEG) 338 | MKV: C(FFV1 Losless), D(Huffyuv losless), E(MJPEG) 339 | WebM: A(VP8) 340 | ----------------...----------------------------------------- Video Bit Rate 341 | ----------------------.------------------------------------- Audio-Format M(16 Bit PCM), Q(24 Bit PCM), U(32 Bit FP), 342 | QT/MOV/MP4: I(16 Bit PCM), M(24 Bit PCM), Q(32 Bit FP) 343 | MKV: I(16 Bit PCM), M(24 Bit PCM), Q(32 Bit FP) 344 | WebM: A(Vorbis) 345 | --------------------------....------------------------------ Audio Bitrate (only used with WebM, has no effect with other containers.) 346 | When using other containers, just use any of the bitrate-codes existing. 347 | --------------------------------XXX------------------------- Width 348 | -------------------------------------YYY-------------------- Height 349 | ------------------------------------------FPS...------------ FPS (not encoded as 29.97 but rather as 97.29 !) 350 | -----------------------------------------------------..----- MJPEG quality (only when MPJPEG is selected, has no effect with other encoding methods) 351 | If you don't use MJPEG, use any of the MJPEG-quality-codes. 352 | 353 | MJPEG-Quality: 354 | GQ - 100% 355 | Fo - 90% 356 | FA - 80% 357 | EY - 70% 358 | Dw - 60% 359 | DI - 50% 360 | Cg - 40% 361 | B4 - 30% 362 | BQ - 20% 363 | BM - 19% 364 | BI - 18% 365 | BE - 17% 366 | BA - 16% 367 | A8 - 15% 368 | A4 - 14% 369 | A0 - 13% 370 | Aw - 12% 371 | As - 11% 372 | Ao - 10% 373 | Ak - 9% 374 | Ag - 8% 375 | Ac - 7% 376 | AY - 6& 377 | AU - 5% 378 | AQ - 4% 379 | AM - 3% 380 | AI - 2% 381 | AE - 1% 382 | AA - 0% 383 | 384 | Resolution(Width x Height): 385 | Some common resolutions, though Reaper supports many others, from 1 x 1 to 10000 x 10000 and higher. These represent two strings, the first 386 | for the width and the second for the height. The x in the middle is not(!) part of the renderstring! 387 | FullHD - gAc x DgE 388 | HD - AAU x NAC 389 | XGA - AAQ x AAD 390 | 391 | Videobitrate: 392 | Some common video-bitrates, though others are possible to set. 393 | 256 - AAE 394 | 384 - gAE 395 | 512 - AAI 396 | 768 - AAM 397 | 1024 - AAQ 398 | 1200 - sAQ 399 | 1600 - QAY 400 | 2400 - YAk 401 | 5000 - iBM 402 | 10000 - ECc 403 | 16000 - gD4 404 | 24000 - wF0 405 | 406 | AudioBitrate (WebM only): 407 | Some common audio-bitrates, though others are possible to set. 408 | 256 kbps - AAAQ 409 | 224 kbps - DgAA 410 | 192 kbps - DAAA 411 | 160 kbps - CgAA 412 | 128 kbps - CAAA 413 | 112 kbps - BwAA 414 | 96 kbps - BgAA 415 | 80 kbps - BQAA 416 | 64 kbps - BAAA 417 | 56 kbps - A4AA 418 | 48 kbps - AwAA 419 | 40 kbps - AoAA 420 | 32 kbps - AgAA 421 | 24 kbps - AYAA 422 | 16 kbps - AQAA 423 | 8 kbps - AIAA 424 | 425 | FPS: 426 | Some common frames-per-second-codes, though others are possible to set as well. 427 | 1200.00 - AAAJZE 428 | 580.00 - AAABFE 429 | 240.00 - AAAHBD 430 | 120.00 - AAAPBC 431 | 60.00 - AAAHBC 432 | 48.00 - AAAEBC 433 | 30.00 - AAAPBB 434 | 29.97 - CPwu9B 435 | 25.00 - AAAMhB 436 | 24.00 - AAAMBB 437 | 23.98 - DZzr9B 438 | 20.00 - AAAKBB 439 | 18.00 - AAAJBB 440 | 15.00 - AAAHBB 441 | 12.00 - AAAEBB 442 | 08.00 - AAAABB 443 | 444 | Some example video-render-strings: 445 | WebM 446 | Video:2048 kbps Audio:128kbps 447 | UE1GRgYAAAAAAAAAAAgAAAAAAACAAAAAgAcAADgEAAAAAPBBAQAAAF8AAAA= - FullHD - 30fps 448 | UE1GRgYAAAAAAAAAAAgAAAAAAACAAAAAAAUAANACAAAAAPBBAQAAAF8AAAA= - HD - 30fps 449 | UE1GRgYAAAAAAAAAAAgAAAAAAACAAAAAAAQAAAADAAAAAPBBAQAAAF8AAAA= - XGA - 30fps 450 | 451 | MKV-Video 452 | Video:MJPEG 95% - Audio:24Bit PCM 453 | UE1GRgQAAAAEAAAADycAAAMAAADnAwAAgAcAADgEAAAAAPBBAQAAAF8AAAA= - FullHD - 30fps 454 | UE1GRgQAAAAEAAAADycAAAMAAADnAwAAAAUAANACAAAAAPBBAQAAAF8AAAA= - HD - 30fps 455 | UE1GRgQAAAAEAAAADycAAAMAAADnAwAAAAQAAAADAAAAAPBBAQAAAF8AAAA= - XGA - 30 fps 456 | 457 | QT/MOV/MP4-Video 458 | Video:MJPEG 95% - Audio:24Bit PCM 459 | UE1GRgMAAAACAAAADycAAAMAAADnAwAAgAcAADgEAAAAAPBBAQAAAF8AAAA= - FullHD - 30fps 460 | UE1GRgMAAAACAAAADycAAAMAAADnAwAAAAUAANACAAAAAPBBAQAAAF8AAAA= - HD - 30fps 461 | UE1GRgMAAAACAAAADycAAAMAAADnAwAAAAQAAAADAAAAAPBBAQAAAF8AAAA= - XGA - 30fps 462 | 463 | AVI 464 | Video:DV - Audio:24Bit PCM 465 | UE1GRgAAAAACAAAADycAAAQAAADnAwAAgAcAADgEAAAAAPBBAQAAAF8AAAA= - FullHD - 30fps 466 | UE1GRgAAAAACAAAADycAAAQAAADnAwAAAAUAANACAAAAAPBBAQAAAF8AAAA= - HD - 30fps 467 | UE1GRgAAAAACAAAADycAAAQAAADnAwAAAAQAAAADAAAAAPBBAQAAAF8AAAA= - XGA - 30fps 468 | -------------------------------------------------------------------------------- /Docs/Reaper_API_Video.html: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | Reaper Internals - API Video 10 | 11 | 12 | 13 | 14 |
15 |

Reaper Api - Video Processor Plugin(Reascripts)

16 | hacked out, written and compiled by Meo Mespotine(mespotine.de) for the Ultraschall.FM-Project.

17 | 18 |

Index

19 | Introduction
20 | Coding Introduction
21 | special variables
22 |
23 | project_time: project time in seconds
24 | project_tempo: current tempo in BPM
25 | project_ts_num: current time signature numerator
26 | project_ts_denom: current time signature denominator
27 | project_time_qn: current project position in QN
28 | time: item time in seconds (if in item)
29 | framerate: project FPS (30.0, 29.97, etc)
30 | project_w: project preferred video width
31 | project_h: project preferred video height
32 | project_wh_valid: set nonzero if project_w/project_h reflect actual project setting (otherwise could be media-defined)
33 | colorspace: current rendering colorspace, e.g. 'RGBA', 'YV12', or 'YUY2'. you can override this with extreme caution.
34 | param_wet: if in FX form, wet/dry mix of effect.
35 | param1..param16: parameters, you can name these by adding lines: //@param [:varname] 'name' [defval minval maxval centval step].
36 | gfx_r: current drawing color (red 0..1)
37 | gfx_g: current drawing color (green 0..1)
38 | gfx_b: current drawing color (blue 0..1)
39 | gfx_a: current drawing alpha (0..1)
40 | gfx_mode: 0=normal, 1= additive, 3=mul (works different in YUV vs RGB)
41 | gfx_dest: destination image handle, or -1 for main framebuffer
42 |
43 | 44 | functions 45 |
46 | input_count() returns number of inputs available (total), range [0..n)
47 | input_track_count() returns the number of available inputs on discrete tracks
48 | input_track(x) returns input for bottommost item or FX on discrete-track x
49 | input_track_exact_count() returns the number of tracks above the current track that could possibly contain video items.
50 | input_track_exact(x) returns input for bottommost item or FX on track relative to current track.
51 | input_next_item(x) returns the next input after x which is on a different item or track
52 | input_next_track(x) returns the next input after x which is on a different track
53 | input_ismaster() returns 1.0 if current FX is on master chain, 2.0 if on monitoring FX chain
54 | input_info(input, w, h[,srctime, wet, parm1, ...]) returns 1 if input is available, sets w/h to dimensions.
55 | gfx_img_alloc([w,h,clear]) returns an image index for drawing .
56 | gfx_img_resize(handle,w,h[,clear]) sets an image size.
57 | gfx_img_hold(handle) (cheaply) retains a read-only copy of an image in handle.
58 | gfx_img_getptr(handle) gets a unique identifier for an image, valid for while the image is retained.
59 | gfx_img_free(handle) frees an earlier allocated image index.
60 | gfx_img_info(handle,w,h) gets dimensions of image.
61 | gfx_set(r,g,b[,a=1,mode=0,dest]) - updates r/g/b/a/mode always.
62 | gfx_blit(input[,preserve_aspect=0,x,y,w,h,srcx,srcy,srcw,srch]) copies input to framebuffer.
63 | gfx_fillrect(x,y,w,h) fills a rectangle
64 | gfx_procrect(x,y,w,h,channel_tab) processes a rectangle with 768-entry channel table [256 items of 0..1 per channel]
65 | gfx_gradrect(x,y,w,h, r,g,b,a [,drdx,dgdx,dbdx,dadx, drdy,dgdy,dbdy,dady]);
66 | gfx_rotoblit(srcidx, angle [,x, y, w, h, srcx, srcy, w, h, cliptosrcrect = 0, centxoffs=0, centyoffs=0])
67 | gfx_deltablit(srcidx, x,y,w,h srcx,srcy, dsdx, dtdx, dsdy, dtdy, dsdxdy, dtdxdy[, dadx, dady, dadxdy])
68 | gfx_xformblit(srcidx, x,y,w,h, wdiv, hdiv, tab[, wantalpha=0]) - tab is wdiv*hdiv*2 table of src points.
69 | gfx_keyedblit(input[,x,y,w,h,srcx,srcy,kv1,kv2,kv3,kv4]) chroma-key blits, using the source color as key.
70 | gfx_destkeyedblit(input[,x,y,w,h,srcx,srcy,kv1,kv2,kv3,kv4]) chroma-key blits, using destination color as key. ignores gfx_a and gfx_mode.
71 | gfx_setfont(pxsize[,#fontname, flags) - sets a font.
72 | gfx_str_measure(#string[,w,h]) - measures the size of #string, returns width
73 | gfx_str_draw(#string[,x,y,fxc_r,fxc_g,fxc_b]) - draw string
74 | rgb2yuv(r,g,b) -- utility, converts r,g,b to YUV, does not clamp [0..1]
75 | yuv2rgb(r,g,b) -- utility, converts YUV to r,g,b, not clamping [0..1]
76 | 77 |
78 |
79 |
80 |

Introduction

81 | Since Reaper 5, Reaper has proper video-editing support. In addition to that, Reaper has a plugin, called "Video Processor Plugin", that is focused on video-effect handling.

82 | Though it is still in it's very early stages, it supports already a handful of useful effects that can be selected via the presets-selection.
83 | It is also programmable. It opens up a small IDE-window, as part of the "Video-Processor-Plugin"-UI, in which you can put Eel-code(no Lua or Python!), that processes the video.

84 | Unlike with other scripts, the scripts for the video processor plugin do not support the standard-reaper-API-commands, but have an own set of variables and functions. The list of functions can be reached by clicking into the IDE-window of the "video processor plugin" and hitting the F1-key.

85 | Some general notes on the video-processor-plugin:
86 | It has a very limited set of programmable UI-elements, means, only a knob (refer the param-variable for more details) at the time.
87 | The plugin has also sometimes the behaviour of "added effects". That means: If you have several tracks whith video items and you put a video processor plugin on every track as track-FX, they do not only influence the video-items in this track. In fact, they also influence the video-items on the other tracks as well. If you have 10 tracks and every track has a video-effect as track-FX that turns the brightness down by 10%, the resulting image will be a black one. All effects added up each other (10 times -10% brightness).
88 | This effect can be circumvented by putting the video-processor-plugin as item-FX, NOT as track-FX.

89 | 90 | 91 |

Coding Introduction

92 | To write code, load the Video Processor Plugin into item-FX of the video or track-FX of the track containing your video. It opens a editor window, in which you can write the code. Hit F1 for commands and variables valid for use in the video processor plugin.
93 | Next to it, on the left side of the editor-field, your parameter-knobs will appear(if you've defined some).
94 | Code for the Video-Processor-Plugin must be written in EEL, not in Lua or Python.

95 | Example code, with a knob for turning the video on and off:

96 |


 97 |                 // A small demo-script that turns video on&off
 98 |                 //@amp;param1:VideoOnOff 'Video Off(0) On(1)' 1 0 1 0.5 1
 99 | 
100 |                 frame=input_track(0); // variable frame set with the videoframe from the first 
101 |                                       // videoitem in the project at a given position
102 |           
103 |                 gfx_fillrect(0,0,project_w,project_h); // deletes last frame, by putting a black rectangle on top of it
104 |                                                        // to prevent from having the last frame(s) be shown indefinately
105 | 
106 |                 //Now, put the picture to the framebuffer -> outputting the video
107 |                 gfx_blit(frame,  // the current video-frame
108 |                             1,   // don't preserve aspect-ratio
109 |                             0,0, // put upper right corner of the video at position 0,0
110 |                             project_w*VideoOnOff,project_h*VideoOnOff // size of the video width, height, 
111 |                                                                       //   multiplied by the VideoOnOff-Parameter
112 |                                                                       //   1=video squeezed to 100% height & width 
113 |                                                                       //   0=video squeezed to 0% height & width
114 |                             );
115 | 
116 | 
117 |

Special Variables

118 |
project_time

119 | project time in seconds 120 |


project_tempo

121 | current tempo in BPM 122 |


project_ts_num

123 | current time signature numerator 124 |


project_ts_denom

125 | current time signature denominator 126 |


project_time_qn

127 | current project position in QN

128 |


time

129 | item time in seconds (if in item) 130 |


framerate

131 | project FPS (30.0, 29.97, etc) 132 |


project_w

133 | project preferred video width 134 |


project_h

135 | project preferred video height 136 |


project_wh_valid

137 | set nonzero if project_w/project_h reflect actual project setting (otherwise could be media-defined) 138 |


colorspace

139 | current rendering colorspace, e.g. 'RGBA', 'YV12', or 'YUY2'. you can override this with extreme caution. 140 |


param_wet

141 | if in FX form, wet/dry mix of effect. 142 |


param1..param16

143 | parameters, you can name these by adding lines //@param [:varname] 'name' [defval minval maxval centval step]. 144 |


gfx_r

145 | current drawing color (red 0..1) 146 |


gfx_g

147 | current drawing color (green 0..1) 148 |


gfx_b

149 | current drawing color (blue 0..1) 150 |


gfx_a

151 | current drawing alpha (0..1) 152 |


gfx_mode

153 | 0=normal, 1= additive, 3=mul (works different in YUV vs RGB)
154 | add 0x100 for blit() to enable filtering (if possible)
155 | add 0x10000 to use source alpha (only valid when using RGBA colorspace)
156 | add 0x40000 to use extra clamping (for out of range alpha/gradient values)
157 | add 0x80000 to treat gfx_r/gfx_g/gfx_b as YUV values (in non-RGB colorspace)
158 |


gfx_dest

159 | destination image handle, or -1 for main framebuffer


160 | 161 |

Functions

162 |
input_count()

163 | returns number of inputs available (total), range [0..n) 164 |


input_track_count()

165 | returns the number of available inputs on discrete tracks 166 |


input_track(x)

167 | returns input for bottommost item or FX on discrete-track x (0 is first track with video item above current, etc) 168 |


input_track_exact_count()

169 | returns the number of tracks above the current track that could possibly contain video items. 170 |


input_track_exact(x)

171 | returns input for bottommost item or FX on track relative to current track. Returns -1000 if track does not contain any video items at the current time, or -10000 if no further tracks contain video. 172 |


input_next_item(x)

173 | returns the next input after x which is on a different item or track 174 |


input_next_track(x)

175 | returns the next input after x which is on a different track 176 |


input_ismaster()

177 | returns 1.0 if current FX is on master chain, 2.0 if on monitoring FX chain 178 |


input_info(input, w, h[,srctime, wet, parm1, ...])

179 | returns 1 if input is available, sets w/h to dimensions. If srctime specified, it will be set with the source-local time of the underlying media. if input is a video processor in effect form, automated parameters can be queried via wet/parm1/etc. 180 |


gfx_img_alloc([w,h,clear])

181 | returns an image index for drawing (can create up to 32 images). contents of image undefined unless clear set. 182 |


gfx_img_resize(handle,w,h[,clear])

183 | sets an image size (handle can be -1 for main framebuffer). contents of image undefined after resize, unless clear set. clear=-1 will only clear if resize occurred. 184 |


gfx_img_hold(handle)

185 | (cheaply) retains a read-only copy of an image in handle. This copy should be released using gfx_img_free() when finished. Up to 32 images can be held. 186 |


gfx_img_getptr(handle)

187 | gets a unique identifier for an image, valid for while the image is retained. can be used (along with gfx_img_hold) to detect when frames change in a low frame rate video 188 |


gfx_img_free(handle)

189 | frees an earlier allocated image index. 190 |


gfx_img_info(handle,w,h)

191 | gets dimensions of image, returns 1 if valid (resize if inexplicably invalidated) 192 |


gfx_set(r,g,b[,a=1,mode=0,dest])

193 | updates r/g/b/a/mode always, dest only if specified 194 |


gfx_blit(input[,preserve_aspect=0,x,y,w,h,srcx,srcy,srcw,srch])

195 | copies input to framebuffer. preserve_aspect=-1 for no fill in pad areas 196 |


gfx_fillrect(x,y,w,h)

197 | fills a rectangle 198 |


gfx_procrect(x,y,w,h,channel_tab)

199 | processes a rectangle with 768-entry channel table [256 items of 0..1 per channel] 200 |


gfx_gradrect(x,y,w,h, r,g,b,a 201 | [,drdx,dgdx,dbdx,dadx, 202 | drdy,dgdy,dbdy,dady]);

203 |


gfx_rotoblit(srcidx, angle [,x, y, w, h, srcx, srcy, w, h, cliptosrcrect = 0, centxoffs=0, centyoffs=0])

204 |


gfx_deltablit(srcidx, x,y,w,h srcx,srcy, dsdx, dtdx, dsdy, dtdy, dsdxdy, dtdxdy[, dadx, dady, dadxdy])

205 |


gfx_xformblit(srcidx, x,y,w,h, wdiv, hdiv, tab[, wantalpha=0])

206 | tab is wdiv*hdiv*2 table of src points. if wantalpha=1, tab is wdiv*hdiv*3 table of src points including alpha. 207 |


gfx_keyedblit(input[,x,y,w,h,srcx,srcy,kv1,kv2,kv3,kv4])

208 | chroma-key blits, using the source color as key. kv1-kv4 meaning depends on colorspace:
209 | YV12/YUY2: kv1 is U target (-0.5 default), kv2 is V target (-0.5 default), kv3 is closeness-factor (0.4 default), kv4 is the gain (2.0 default)
210 | RGBA: kv1 is green-factor (1.0 default), kv2 is blue-factor (-1.0 default), kv3 is offset (-1.0 default), kv4 enables spill removal (1.0 default)
211 |


gfx_destkeyedblit(input[,x,y,w,h,srcx,srcy,kv1,kv2,kv3,kv4])

212 | chroma-key blits, using destination color as key. ignores gfx_a and gfx_mode. 213 |


gfx_setfont(pxsize[,#fontname, flags)

214 | sets a font, flags can be 'B' for bold, 'I' for italics, 'BI' for bold italics, etc 215 |


gfx_str_measure(#string[,w,h])

216 | measures the size of #string, returns width 217 |


gfx_str_draw(#string[,x,y,fxc_r,fxc_g,fxc_b])

218 | draw string 219 |


rgb2yuv(r,g,b)

220 | utility, converts r,g,b to YUV, does not clamp [0..1] 221 |


yuv2rgb(r,g,b)

222 | utility, converts YUV to r,g,b, not clamping [0..1] 223 | 224 | 225 | 226 | 227 | 228 |

229 |
230 | 231 | 232 | -------------------------------------------------------------------------------- /Docs/RenderPreset-Configfile-Reaper5.txt: -------------------------------------------------------------------------------- 1 | Render-Presets-docs as of Reaper 5.99 2 | 3 | compiled by Meo Mespotine, 20th of December 2019 4 | licensed under creative-commons cc-by-license 5 | 6 | The render-presets are stored into reaper-render.ini in the resources-folder of Reaper. 7 | Depending on what you chose for storing a preset, when hitting the Presets-button in the Render to File-dialog, the following entries 8 | are added into that file. 9 | 10 | When selecting "Options and format" or "All settings": 11 | 14 | 15 | When selecting "Bounds and Outputpattern filename" or "All settings": 16 | RENDERPRESET_OUTPUT string presetname integer bounds_dropdownlist number start_position number endposition integer source_dropdownlist_and_checkboxes integer unknown string outputfilename_renderpattern integer tail_checkbox 17 | 18 | As mentioned, Preset, who who are stored with by the menu "All settings" have both of these entried with the same presetname, all others only one of them. 19 | 20 | Parameters: 21 | source_dropdownlist_and_checkboxes - keeps: Source dropdownlist in RENDERPRESET_OUTPUT 22 | 0, Master mix 23 | 1, Master mix + stems 24 | 3, Stems (selected tracks) 25 | &4, Multichannel tracks to multichannel files(this must be added/subtracted, if checking/unchecking this checkbox) 26 | 8, Region render matrix 27 | &16, Tracks with only mono media to mono files(this must be added/subtracted, if checking/unchecking this checkbox) 28 | 32, Selected media items 29 | 64, Selected media items via master 30 | 128, Selected tracks via master 31 | 32 | 33 | various_checkboxes - keeps various checkboxes in 16 | 17 | When selecting "Bounds and Outputpattern filename" or "All settings": 18 | RENDERPRESET_OUTPUT string presetname integer bounds_dropdownlist number start_position number endposition integer source_dropdownlist_and_checkboxes integer unknown string outputfilename_renderpattern integer tail_checkbox 19 | 20 | As mentioned, Preset, who who are stored with by the menu "All settings" have both of these entries with the same presetname, all others only one of them. 21 | 22 | Parameters: 23 | various_checkboxes - keeps various checkboxes in Keyboard/Multitouch-page: 47 | 48 | 72=MultiZoom 49 | 73=Ctrl+MultiZoom 50 | 74=Alt+MultiZoom 51 | 200=MultiZoom 52 | 201=Ctrl+MultiZoom 53 | 202=Alt+MultiZoom 54 | 203=Ctrl+Alt+MultiZoom 55 | 204=Shift+MultiZoom 56 | 205=Ctrl+Shift+MultiZoom 57 | 206=Alt+Shift+MultiZoom 58 | 207=Ctrl+Alt+Shift+MultiZoom 59 | When MultiRotate is enabled in the Preferences->Keyboard/Multitouch-page: 60 | 61 | 24=MultiRotate 62 | 25=Ctrl+MultiRotate 63 | 152=MultiRotate 64 | 153=Ctrl+MultiRotate 65 | 154=Alt+MultiRotate 66 | 155=Ctrl+Alt+MultiRotate 67 | 156=Shift+MultiRotate 68 | 157=Ctrl+Shift+MultiRotate 69 | 158=Alt+Shift+MultiRotate 70 | 159=Ctrl+Alt+Shift+MultiRotate 71 | When MultiSwipe is enabled in the Preferences->Keyboard/Multitouch-page Multitouch-Swipe-Horizontal: 72 | 73 | 40=MultiHorz 74 | 168=MultiHorz 75 | 169=Ctrl+MultiHorz 76 | 170=Alt+MultiHorz 77 | 171=Ctrl+Alt+MultiHorz 78 | 172=Shift+MultiHorz 79 | 173=Ctrl+Shift+MultiHorz 80 | 174=Alt+Shift+MultiHorz 81 | 175=Ctrl+Alt+Shift+MultiHorz 82 | Multitouch-Swipe-Vertical: 83 | 84 | 56=MultiVert 85 | 184=MultiVert 86 | 185=Ctrl+MultiVert 87 | 186=Alt+MultiVert 88 | 187=Ctrl+Alt+MultiVert 89 | 188=Shift+MultiVert 90 | 189=Ctrl+Shift+MultiVert 91 | 190=Alt+Shift+MultiVert 92 | 191=Ctrl+Alt+Shift+MultiVert 93 | Horizontal Mousewheel: 94 | 95 | 88=HorizWheel 96 | 90=Alt+HorizWheel 97 | 216=HorizWheel 98 | 217=Ctrl+HorizWheel 99 | 218=Alt+HorizWheel 100 | 219=Ctrl+Alt+HorizWheel 101 | 220=Shift+HorizWheel 102 | 221=Ctrl+Shift+HorizWheel 103 | 222=Alt+Shift+HorizWheel 104 | 223=Ctrl+Alt+Shift+HorizWheel 105 | "normal" Mousewheel: 106 | 107 | 120=Mousewheel 108 | 121=Ctrl+Mousewheel 109 | 122=Alt+Mousewheel 110 | 123=Ctrl+Alt+Mousewheel 111 | 125=Ctrl+Shift+Mousewheel 112 | 248=Mousewheel 113 | 249=Ctrl+Mousewheel 114 | 250=Alt+Mousewheel 115 | 251=Ctrl+Alt+Mousewheel 116 | 252=Shift+Mousewheel 117 | 253=Ctrl+Shift+Mousewheel 118 | 254=Alt+Shift+Mousewheel 119 | 255=Ctrl+Alt+Shift+Mousewheel 120 | 121 | Accepted MIDI-modifiers: 122 | MIDI Chan X Notes - modifiers 144(channel 1) to 159(channel 16) 123 | MIDI Chan X CC - modifiers 176(channel 1) to 191(channel 16) 124 | MIDI Chan X PC - modifiers 192(channel 1) to 207(channel 16) 125 | MIDI Chan X Pitch - modifiers 224(channel 1) to 239(channel 16) 126 | 127 | There are more areas, who can store MIDI-messages, but they seem to be unused currently. They are seen by Reaper as hex-codes from 00 to ff. 128 | MIDI unused - modifiers 128 to 143, 160 to 175, 208 to 223, 240 to 254 129 | 130 | 131 | * key_midinote - this is the place for the midi-note or the key-value. 132 | The MIDI-note is between 0 and 127; higher notes repeat the notes, means: 128=0, 129=1, etc 133 | The key-code is between 0 and 255; depending on the modifier, they mean different things(including keyboard modifiers or not including keyboard modifiers, see modifiers-description above) 134 | 135 | * velocity - this is the velocity of the MIDI-message you want to send. 136 | 0, note off - use this to send MIDI-messages to Reaper itself, without triggering Effects/Instruments on tracks with MIDI-Input! 137 | 1-255, the velocity to send 138 | 139 | With keyboard-shortcuts(mode=1, in the Add/Find Shortcuts-dialog of the Actions-dialog), even values mean no keypress, odd values mean keypress. 140 | Exception: modifier 255 and notevalue 232++ is various MediaKbd-keys, selected by the velocity-value 141 | This is a little bit tricky, as this stores the modifiers in the key_midinote and the MediaKbd-key in the velocity-value, unlike all other keyvalues. 142 | 143 | MediaKeyboard-Keys-modifier, as stored in the : 144 | For additional MediaKbd-modifier-combinations, add the following values to the key_midinote-Value: 145 | +1=Ctrl+ 146 | +2=Alt+ 147 | +3=Ctrl+Alt+ 148 | +4=Shift+ 149 | +5=Ctrl+Shift+ 150 | +6=Alt+Shift+ 151 | +7=Ctrl+Alt+Shift+ 152 | example: "255, 233, 142" leads to "Special_Modifier, Ctrl +, MediaKbdBrowseHome" 153 | 154 | The velovity-values are valid 155 | 0 MediaKbd?? 156 | 2 MediaKbdBrowse- 157 | 4 MediaKbdBrowse+ 158 | 6 MediaKbdBrowseRefr 159 | 8 MediaKbdBrowseStop 160 | 10 MediaKbdBrowseSrch 161 | 12 MediaKbdBrowseFav 162 | 14 MediaKbdBrowseHome 163 | 16 MediaKbdMute 164 | 18 MediaKbdVol- 165 | 20 MediaKbdVol+ 166 | 22 MediaKbdTrack+ 167 | 24 MediaKbdTrack- 168 | 26 MediaKbdStop 169 | 28 MediaKbdPlayPause 170 | 30 MediaKbdMail 171 | 32 MediaKbdMedia 172 | 34 MediaKbdApp1 173 | 36 MediaKbdApp2 174 | 38 MediaKbdBass- 175 | 40 MediaKbdBass++ 176 | 42 MediaKbdBass+ 177 | 44 MediaKbdTreble- 178 | 46 MediaKbdTreble+ 179 | 48 MediaKbdMicMute 180 | 50 MediaKbdMic- 181 | 52 MediaKbdMic+ 182 | 54 MediaKbdHelp 183 | 56 MediaKbdFind 184 | 58 MediaKbdNew 185 | 60 MediaKbdOpen 186 | 62 MediaKbdClose 187 | 64 MediaKbdSave 188 | 66 MediaKbdPrint 189 | 68 MediaKbdUndo 190 | 70 MediaKbdRedo 191 | 72 MediaKbdCopy 192 | 74 MediaKbdCut 193 | 76 MediaKbdPaste 194 | 78 MediaKbdReply 195 | 80 MediaKbdForward 196 | 82 MediaKbdSend 197 | 84 MediaKbdSpellChk 198 | 86 MediaKbdCmdCtl 199 | 88 MediaKbdMicOnOff 200 | 90 MediaKbdCorrect 201 | 92 MediaKbdPlay 202 | 94 MediaKbdPause 203 | 96 MediaKbdRecord 204 | 98 MediaKbdFF 205 | 100 MediaKbdRew 206 | 102 MediaKbdChan+ 207 | 104 MediaKbdChan- 208 | 209 | ## The Function 210 | 211 | The function itself has 4 parameters, with one for the destination of the MIDI message, and three for the MIDI message itself: 212 | 213 | reaper.StuffMIDIMessage(integer destination, integer key_midi_modifier, integer key_midi_note, integer velocity) 214 | 215 | 216 | The destination is for the Key/MIDI-message destination, means, where it's sent to. 217 | This is also the parameter to set, if you want to send MIDI-Messages/Keyboard-Shortcuts(latter only in Add Shortcut-dialog) to Reaper itself(mode==1)! 218 | 219 | 0 for Virtual Keyboard - use this to send MIDI-messages to tracks, who have VKB or MIDI as input-device, the key_midi_modifier decides, which channel 220 | 1 for control (actions map etc) - use this to send Keyboard Shortcuts/MIDI-Messages to the Add/Find Shortcuts-dialog in the actions-list, as well as MIDI-Shortcuts to Reaper itself. 221 | 2 for VKB-on-current-channel - use this to send MIDI-messages to the MIDI-channel, currently selected in the VirtualKeyBoard, key_midi_modifier will be ignored 222 | 3-15 - seem to be unused... 223 | 224 | to address other MIDI-hardware: 225 | 16 for external MIDI device 0 226 | 17 for external MIDI device 1, etc; see GetNumMIDIOutputs, GetMIDIOutputName. 227 | 228 | -------------------------------------------------------------------------------- /Docs/gfx/Lua5.3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mespotine/ultraschall-and-reaper-docs/c8b6843fd6325161d129d1b55c147f4194392bd4/Docs/gfx/Lua5.3.png -------------------------------------------------------------------------------- /Docs/gfx/SWS2.8.8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mespotine/ultraschall-and-reaper-docs/c8b6843fd6325161d129d1b55c147f4194392bd4/Docs/gfx/SWS2.8.8.png -------------------------------------------------------------------------------- /Docs/gfx/SWS2.9.6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mespotine/ultraschall-and-reaper-docs/c8b6843fd6325161d129d1b55c147f4194392bd4/Docs/gfx/SWS2.9.6.png -------------------------------------------------------------------------------- /Docs/gfx/SWS2.9.7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mespotine/ultraschall-and-reaper-docs/c8b6843fd6325161d129d1b55c147f4194392bd4/Docs/gfx/SWS2.9.7.png -------------------------------------------------------------------------------- /Docs/gfx/reaper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mespotine/ultraschall-and-reaper-docs/c8b6843fd6325161d129d1b55c147f4194392bd4/Docs/gfx/reaper.png -------------------------------------------------------------------------------- /Docs/gfx/reaper5.40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mespotine/ultraschall-and-reaper-docs/c8b6843fd6325161d129d1b55c147f4194392bd4/Docs/gfx/reaper5.40.png -------------------------------------------------------------------------------- /Docs/gfx/reaper5.50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mespotine/ultraschall-and-reaper-docs/c8b6843fd6325161d129d1b55c147f4194392bd4/Docs/gfx/reaper5.50.png -------------------------------------------------------------------------------- /Docs/gfx/reaper5.52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mespotine/ultraschall-and-reaper-docs/c8b6843fd6325161d129d1b55c147f4194392bd4/Docs/gfx/reaper5.52.png -------------------------------------------------------------------------------- /Docs/gfx/reaper5.62.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mespotine/ultraschall-and-reaper-docs/c8b6843fd6325161d129d1b55c147f4194392bd4/Docs/gfx/reaper5.62.png -------------------------------------------------------------------------------- /Docs/gfx/reaper5.70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mespotine/ultraschall-and-reaper-docs/c8b6843fd6325161d129d1b55c147f4194392bd4/Docs/gfx/reaper5.70.png -------------------------------------------------------------------------------- /Docs/gfx/reaper5.77.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mespotine/ultraschall-and-reaper-docs/c8b6843fd6325161d129d1b55c147f4194392bd4/Docs/gfx/reaper5.77.png -------------------------------------------------------------------------------- /Docs/gfx/reaper5.80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mespotine/ultraschall-and-reaper-docs/c8b6843fd6325161d129d1b55c147f4194392bd4/Docs/gfx/reaper5.80.png -------------------------------------------------------------------------------- /Docs/gfx/reaper5.90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mespotine/ultraschall-and-reaper-docs/c8b6843fd6325161d129d1b55c147f4194392bd4/Docs/gfx/reaper5.90.png -------------------------------------------------------------------------------- /Docs/gfx/reaper5.91.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mespotine/ultraschall-and-reaper-docs/c8b6843fd6325161d129d1b55c147f4194392bd4/Docs/gfx/reaper5.91.png -------------------------------------------------------------------------------- /Docs/gfx/reaper5.92.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mespotine/ultraschall-and-reaper-docs/c8b6843fd6325161d129d1b55c147f4194392bd4/Docs/gfx/reaper5.92.png -------------------------------------------------------------------------------- /Docs/gfx/reaper5.94.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mespotine/ultraschall-and-reaper-docs/c8b6843fd6325161d129d1b55c147f4194392bd4/Docs/gfx/reaper5.94.png -------------------------------------------------------------------------------- /Docs/gfx/reaper5.941.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mespotine/ultraschall-and-reaper-docs/c8b6843fd6325161d129d1b55c147f4194392bd4/Docs/gfx/reaper5.941.png -------------------------------------------------------------------------------- /Docs/gfx/ultraschall4.00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mespotine/ultraschall-and-reaper-docs/c8b6843fd6325161d129d1b55c147f4194392bd4/Docs/gfx/ultraschall4.00.png -------------------------------------------------------------------------------- /Docs/gfx/us.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mespotine/ultraschall-and-reaper-docs/c8b6843fd6325161d129d1b55c147f4194392bd4/Docs/gfx/us.png -------------------------------------------------------------------------------- /Docs/readme.txt: -------------------------------------------------------------------------------- 1 | compiled by Meo Mespotine(mespotine.de) for the ultraschall.fm-project 2 | 3 | Documentation for Reaper-Internals 5.962 and Ultraschall Api 4.00-beta 2.7 4 | 5 | Written and compiled by Meo Mespotine (mespotine.de) for the Ultraschall.FM-project. 6 | licensed under creative-commons by-sa-nc-license 7 | 8 | Some docs are enhanced versions of the original docs and the Reaper-logo is by the Cockos Inc. 9 | The SWS-logo is by SWS-extension.org 10 | 11 | You can download the full Ultraschall-API-framework at api.mespotine.de -------------------------------------------------------------------------------- /Helpful_Ini_Files/Reaper-Gfx.GetKey_Codes_and_their_associated_character.ini: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mespotine/ultraschall-and-reaper-docs/c8b6843fd6325161d129d1b55c147f4194392bd4/Helpful_Ini_Files/Reaper-Gfx.GetKey_Codes_and_their_associated_character.ini -------------------------------------------------------------------------------- /Helpful_Ini_Files/Reaper-Menu-Only-Actions.ini: -------------------------------------------------------------------------------- 1 | [Main] 2 | 2=Hide Transport [Transport context] 3 | 2998=Show recent actions [Main actions] 4 | 40054=Delete point [Envelope point context] 5 | 40055=Create new point [Envelope context] 6 | 40079=Close [Mixer context] 7 | 40154=Set point value... [Envelope point context] 8 | 40191=Linear [Envelope point context] 9 | 40192=Square [Envelope point context] 10 | 40264=no markers [Transport context] 11 | 40423=Slow start/end [Envelope point context] 12 | 40426=Fast start [Envelope point context] 13 | 40427=Fast end [Envelope point context] 14 | 40550=Bypass FX [FX extended mixer context] 15 | 40551=Offline FX [FX extended mixer context] 16 | 40552=Delete FX [FX extended mixer context] 17 | 40553=Show FX chain [FX extended mixer context] 18 | 40554=Float FX configuration [FX extended mixer context] 19 | 40555=Bypass chain [FX extended mixer context] 20 | 40556=Add FX... [FX extended mixer context] 21 | 40558=Show track routing window [Sends extended mixer context] 22 | 40559=Mute send [Sends extended mixer context] 23 | 40560=Remove send [Sends extended mixer context] 24 | 40561=Show send parameters [Sends extended mixer context] 25 | 40562=Rename FX instance [FX extended mixer context] 26 | 40564=Go to send destination track [Sends extended mixer context] 27 | 40673=Playrate fader range: 0.25-4.0 (default) [Transport context] 28 | 40674=Playrate fader range: 0.5-2.0 [Transport context] 29 | 40675=Playrate fader range: 0.75-1.5 [Transport context] 30 | 40676=Playrate fader range: 0.9-1.1 [Transport context] 31 | 40682=Bezier [Envelope point context] 32 | 40700=Pitch envelope: range/snap... [Envelope point context] 33 | 40854=Select envelope (env name) [Envelope point context] 34 | 41068=Quick add FX [FX extended mixer context] 35 | 41073=Add FX chain [FX extended mixer context] 36 | 41915=Replace FX... [FX extended mixer context] 37 | 41917=Quick replace FX [FX extended mixer context] 38 | 41933=Volume envelope: amplitude scaling [Envelope point context] 39 | 41934=Volume envelope: fader scaling [Envelope point context] 40 | 42094= [Envelope point context] 41 | 42219=Automation items [Automation item context] 42 | 44000=(recent project list) [Main file] 43 | 45100=(comp list) [Media item context] 44 | 45500=Default Classic [Main options] 45 | 46001=(track template list) [Track control panel context] 46 | 48000=(project template list) [Main file] 47 | 48400=Default [Track control panel context] 48 | 49 | [MIDI Editor] 50 | 1215=CC selection follows note selection [MIDI piano roll toolbar] 51 | 2998=Show recent actions [MIDI main menu context] 52 | 40408=Automatically save modified file on close [MIDI main menu context] 53 | 40638=[velocity list] [MIDI piano roll context] 54 | 40749=MIDI editor mouse modifiers... [MIDI main options] 55 | 40894=Media item [MIDI main menu context] 56 | 40895=Track [MIDI main menu context] 57 | 40896=Project [MIDI main menu context] 58 | 40897=Open the clicked MIDI item only [MIDI main menu context] 59 | 40898=Open all selected MIDI items [MIDI main menu context] 60 | 40899=Open all MIDI items on the same track as the clicked item [MIDI main menu context] 61 | 40900=Open all MIDI in the project [MIDI main menu context] 62 | 40916= [MIDI main menu context] 63 | 41989=(note notation menu) [MIDI piano roll context] 64 | 65 | [MIDI Inline Editor] 66 | 40457=Humanize notes... 67 | -------------------------------------------------------------------------------- /Helpful_Ini_Files/Reaper-factory-default-KEY-Codes_for_reaper-kb_ini.ini: -------------------------------------------------------------------------------- 1 | [Main] 2 | 0_33=40723 3 | 0_34=40151 4 | 0_39=40150 5 | 0_43=1012 6 | 0_44=40039 7 | 0_45=1011 8 | 0_46=40040 9 | 0_60=40037 10 | 0_61=1012 11 | 0_62=40038 12 | 0_63=40605 13 | 0_64=40727 14 | 0_91=40172 15 | 0_93=40173 16 | 0_95=41622 17 | 0_96=40110 18 | 0_123=40222 19 | 0_125=40223 20 | 0_126=40113 21 | 1_9=40375 22 | 1_13=40073 23 | 1_27=40020 24 | 1_32=40044 25 | 1_48=40160 26 | 1_49=40161 27 | 1_50=40162 28 | 1_51=40163 29 | 1_52=40164 30 | 1_53=40165 31 | 1_54=40166 32 | 1_55=40167 33 | 1_56=40168 34 | 1_57=40169 35 | 1_67=_SWSCONSOLE 36 | 1_68=40760 37 | 1_69=40847 38 | 1_70=41084 39 | 1_71=40032 40 | 1_76=1135 41 | 1_77=40157 42 | 1_78=41228 43 | 1_80=40407 44 | 1_82=1068 45 | 1_83=40012 46 | 1_84=40125 47 | 1_85=40033 48 | 1_86=40406 49 | 1_87=40042 50 | 1_88=40916 51 | 1_89=41342 52 | 1_90=40791 53 | 1_97=40123 54 | 1_98=40118 55 | 1_99=40124 56 | 1_100=40120 57 | 1_102=40119 58 | 1_103=40121 59 | 1_104=40117 60 | 1_105=40122 61 | 1_107=1012 62 | 1_109=1011 63 | 1_113=41589 64 | 1_114=40345 65 | 1_115=40444 66 | 1_116=40445 67 | 1_117=40446 68 | 1_118=40454 69 | 1_119=40455 70 | 1_120=40456 71 | 1_122=40346 72 | 1_32801=40111 73 | 1_32802=40112 74 | 1_32803=40043 75 | 1_32804=40042 76 | 1_32805=40104 77 | 1_32806=1012 78 | 1_32807=40105 79 | 1_32808=1011 80 | 1_32813=40018 81 | 1_32814=40697 82 | 5_9=40376 83 | 5_48=40204 84 | 5_51=40800 85 | 5_52=40799 86 | 5_53=40798 87 | 5_54=40797 88 | 5_55=40207 89 | 5_56=40206 90 | 5_57=40205 91 | 5_67=40256 92 | 5_69=40638 93 | 5_70=40271 94 | 5_71=40772 95 | 5_76=40277 96 | 5_77=40171 97 | 5_78=40254 98 | 5_82=40174 99 | 5_83=40061 100 | 5_84=40126 101 | 5_86=41748 102 | 5_87=41842 103 | 5_88=40930 104 | 5_90=40790 105 | 5_112=40308 106 | 5_115=40464 107 | 5_116=40465 108 | 5_117=40466 109 | 5_118=40474 110 | 5_119=40475 111 | 5_120=40476 112 | 5_32805=40102 113 | 5_32806=40155 114 | 5_32807=40103 115 | 5_32808=40156 116 | 9_9=40836 117 | 9_32=40073 118 | 9_48=40656 119 | 9_49=40657 120 | 9_50=40658 121 | 9_51=40659 122 | 9_52=40660 123 | 9_53=40661 124 | 9_54=40662 125 | 9_55=40663 126 | 9_56=40664 127 | 9_57=40665 128 | 9_65=40035 129 | 9_66=41157 130 | 9_67=40057 131 | 9_68=41295 132 | 9_69=40422 133 | 9_71=40034 134 | 9_74=40069 135 | 9_76=40435 136 | 9_77=40078 137 | 9_78=40023 138 | 9_79=40025 139 | 9_80=40016 140 | 9_81=40004 141 | 9_82=1013 142 | 9_83=40026 143 | 9_84=40001 144 | 9_86=40058 145 | 9_88=40059 146 | 9_90=40029 147 | 9_100=40225 148 | 9_102=40226 149 | 9_107=40031 150 | 9_112=40007 151 | 9_113=40011 152 | 9_115=40860 153 | 9_188=40320 154 | 9_190=40321 155 | 9_219=40318 156 | 9_221=40319 157 | 9_32801=40031 158 | 9_32802=40295 159 | 9_32805=40084 160 | 9_32806=40115 161 | 9_32807=40085 162 | 9_32808=40116 163 | 9_32814=40307 164 | 13_9=41624 165 | 13_67=41383 166 | 13_68=41296 167 | 13_70=41076 168 | 13_71=41588 169 | 13_77=40906 170 | 13_78=40108 171 | 13_83=40186 172 | 13_84=40130 173 | 13_86=50125 174 | 13_88=41384 175 | 13_90=40030 176 | 13_32805=40646 177 | 13_32806=40111 178 | 13_32807=40647 179 | 13_32808=40112 180 | 17_13=40021 181 | 17_32=40317 182 | 17_48=41770 183 | 17_49=41761 184 | 17_50=41762 185 | 17_51=41763 186 | 17_52=41764 187 | 17_53=41765 188 | 17_54=41766 189 | 17_55=41767 190 | 17_56=41768 191 | 17_57=41769 192 | 17_66=40377 193 | 17_67=40378 194 | 17_68=40279 195 | 17_71=40145 196 | 17_76=40071 197 | 17_77=40183 198 | 17_80=1155 199 | 17_82=40251 200 | 17_83=1157 201 | 17_84=41046 202 | 17_88=40041 203 | 17_90=40792 204 | 17_100=40227 205 | 17_102=40228 206 | 17_32805=40140 207 | 17_32806=40138 208 | 17_32807=40141 209 | 17_32808=40139 210 | 21_67=40338 211 | 21_71=1156 212 | 21_83=40196 213 | 21_84=40131 214 | 25_66=40017 215 | 25_69=40109 216 | 25_70=41074 217 | 25_71=40768 218 | 25_76=40014 219 | 25_77=40075 220 | 25_78=40859 221 | 25_80=40240 222 | 25_82=40015 223 | 25_83=40022 224 | 25_84=40259 225 | 25_86=40268 226 | 25_88=50124 227 | 25_90=40072 228 | 25_188=40322 229 | 25_190=40323 230 | 25_32801=40382 231 | 25_32802=40381 232 | 25_32806=40286 233 | 25_32808=40285 234 | 29_82=40326 235 | 29_83=41895 236 | 29_84=41208 237 | 29_32806=40288 238 | 29_32808=40287 239 | 255_152=992 240 | 255_153=974 241 | 255_168=997 242 | 255_184=995 243 | 255_200=998 244 | 255_201=998 245 | 255_216=988 246 | 255_218=990 247 | 255_248=990 248 | 255_249=991 249 | 255_250=988 250 | 255_251=989 251 | 255_253=972 252 | 255_2280=14 253 | 255_2536=40744 254 | 255_2792=40743 255 | 255_3048=40285 256 | 255_3304=40286 257 | 255_3560=1016 258 | 255_3816=40073 259 | 255_4072=40292 260 | 255_6376=40280 261 | 255_6632=40116 262 | 255_6888=40115 263 | 255_11496=40294 264 | 255_12008=1007 265 | 255_12264=1008 266 | 255_12520=1013 267 | 255_12776=40043 268 | 255_13032=40042 269 | 255_13288=40125 270 | 255_13544=40126 271 | 272 | [Media_Explorer] 273 | 1_8=1004 274 | 1_13=1013 275 | 1_32=40024 276 | 9_32=40025 277 | 0_63=40017 278 | 9_65=40041 279 | 1_116=40018 280 | 1_32804=40031 281 | 1_32805=1009 282 | 1_32806=40029 283 | 1_32807=1008 284 | 1_32808=40030 285 | 286 | [MIDI_Editor] 287 | 1_27=40477 288 | 1_32=40016 289 | 9_32=40017 290 | 0_34=40151 291 | 0_39=40150 292 | 0_45=1011 293 | 1_32808=1011 294 | 1_109=1011 295 | 5_48=40227 296 | 17_48=40045 297 | 5_49=40218 298 | 17_49=40042 299 | 5_50=40219 300 | 17_50=40043 301 | 25_50=40478 302 | 5_51=40220 303 | 17_51=40056 304 | 5_52=40221 305 | 17_52=40954 306 | 5_53=40222 307 | 17_53=40449 308 | 5_54=40223 309 | 17_54=40448 310 | 5_55=40224 311 | 17_55=40450 312 | 5_56=40225 313 | 5_57=40226 314 | 17_57=40040 315 | 0_61=1012 316 | 0_43=1012 317 | 1_107=1012 318 | 1_32806=1012 319 | 0_63=40420 320 | 9_65=40006 321 | 9_67=40010 322 | 13_67=40733 323 | 9_68=40882 324 | 13_68=40886 325 | 1_70=40762 326 | 17_71=1017 327 | 9_73=40457 328 | 5_73=40051 329 | 1_73=40051 330 | 9_101=40051 331 | 9_73=40501 332 | 1_74=40456 333 | 17_77=40055 334 | 17_78=40500 335 | 21_78=40636 336 | 1_81=40009 337 | 1_82=1139 338 | 17_82=1013 339 | 1_83=40046 340 | 5_83=40052 341 | 9_83=1005 342 | 17_83=1014 343 | 1_84=40759 344 | 9_86=40011 345 | 13_86=40429 346 | 9_88=40012 347 | 13_88=40734 348 | 9_90=40013 349 | 13_90=40014 350 | 1_98=40178 351 | 9_32808=40178 352 | 9_98=40050 353 | 5_32808=40050 354 | 17_98=40180 355 | 25_98=41027 356 | 29_32808=41027 357 | 17_100=40181 358 | 13_32805=40181 359 | 25_100=40185 360 | 5_32805=40185 361 | 1_102=40184 362 | 9_32807=40184 363 | 25_102=40186 364 | 5_32807=40186 365 | 17_104=40179 366 | 25_104=41026 367 | 29_32806=41026 368 | 9_113=40004 369 | 1_114=40435 370 | 0_126=40217 371 | 1_32803=40037 372 | 1_32804=40036 373 | 1_87=40036 374 | 1_32805=40047 375 | 9_100=40047 376 | 9_32805=40183 377 | 1_100=40183 378 | 17_32805=40140 379 | 5_32806=40049 380 | 9_104=40049 381 | 9_32806=40177 382 | 1_104=40177 383 | 13_32806=40111 384 | 1_32801=40111 385 | 17_32806=40138 386 | 21_32806=40187 387 | 1_32807=40048 388 | 9_102=40048 389 | 13_32807=40182 390 | 17_102=40182 391 | 17_32807=40141 392 | 13_32808=40112 393 | 1_32802=40112 394 | 17_32808=40139 395 | 21_32808=40188 396 | 1_32813=40001 397 | 1_32814=40667 398 | 255_216=40433 399 | 255_250=40433 400 | 255_218=40431 401 | 255_248=40431 402 | 255_220=998 403 | 255_249=40430 404 | 255_251=40432 405 | 255_252=999 406 | 407 | [MIDI_Event_List_Editor] 408 | 1_27=40477 409 | 1_32=40016 410 | 9_32=40017 411 | 17_49=40042 412 | 17_50=40043 413 | 17_51=40056 414 | 17_52=40954 415 | 0_63=40420 416 | 9_65=40006 417 | 9_67=40010 418 | 1_72=40457 419 | 1_73=40051 420 | 9_101=40051 421 | 9_73=40501 422 | 17_77=40055 423 | 1_81=40009 424 | 1_82=1139 425 | 17_82=1013 426 | 9_83=1005 427 | 9_86=40011 428 | 13_86=40429 429 | 9_88=40012 430 | 9_90=40013 431 | 13_90=40014 432 | 1_98=40178 433 | 9_32808=40178 434 | 17_98=40180 435 | 1_104=40177 436 | 9_32806=40177 437 | 17_104=40179 438 | 9_113=40004 439 | 1_114=40435 440 | 1_32803=40037 441 | 1_32814=40667 442 | 255_220=998 443 | 255_252=999 444 | 445 | [MIDI_Inline_Editor] 446 | 17_48=40045 447 | 25_50=40478 448 | 17_53=40449 449 | 17_54=40448 450 | 17_55=40450 451 | 17_57=40040 452 | 9_65=40006 453 | 9_67=40010 454 | 1_69=2 455 | 1_73=40051 456 | 5_73=40051 457 | 9_101=40051 458 | 1_74=40456 459 | 17_77=40055 460 | 1_81=40009 461 | 1_83=40046 462 | 5_83=40052 463 | 9_86=40011 464 | 13_86=40429 465 | 9_88=40012 466 | 17_98=40180 467 | 25_98=41027 468 | 29_32808=41027 469 | 1_102=40184 470 | 9_32807=40184 471 | 17_102=40182 472 | 13_32807=40182 473 | 1_104=40177 474 | 9_32806=40177 475 | 17_104=40179 476 | 9_113=40004 477 | 1_32801=40111 478 | 13_32806=40111 479 | 1 32802=40112 480 | 13_32808=40112 481 | 9_32805=40183 482 | 1_100=40183 483 | 13_32805=40181 484 | 17_100=40181 485 | 5_32806=40049 486 | 9_104=40049 487 | 17_32806=40138 488 | 21_32806=40187 489 | 29_32806=41026 490 | 25_104=41026 491 | 5_32808=40050 492 | 9_98=40050 493 | 9_32808=40178 494 | 1_98=40178 495 | 17_32808=40139 496 | 21_32808=40188 497 | 1_32813=40001 498 | 1_32814=40667 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # This is outdated, latest docs and devtools are available with Ultraschall-API from now on. 2 | [Ultraschall-API repository](https://github.com/Ultraschall/ultraschall-lua-api-for-reaper) 3 | Look in there for the folders Docs/ and Misc/ to find all docs available. 4 | 5 | By installing Ultraschall-API, the developer-tools can be found in 6 | ResourceFolder/UserPlugins/ultraschall_api/Scripts/Tools/DeveloperScripts/ 7 | 8 | # ultraschall-and-reaper-docs(outdated) 9 | Documentation and helpful files and utilities for usage and understanding Reaper's internals 10 | -------------------------------------------------------------------------------- /Scripts/ultraschall_PreviewAudioBeforeRecording.lua: -------------------------------------------------------------------------------- 1 | --[[ 2 | ################################################################################ 3 | # 4 | # Copyright (c) 2014-2018 Ultraschall (http://ultraschall.fm) 5 | # 6 | # Permission is hereby granted, free of charge, to any person obtaining a copy 7 | # of this software and associated documentation files (the "Software"), to deal 8 | # in the Software without restriction, including without limitation the rights 9 | # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | # copies of the Software, and to permit persons to whom the Software is 11 | # furnished to do so, subject to the following conditions: 12 | # 13 | # The above copyright notice and this permission notice shall be included in 14 | # all copies or substantial portions of the Software. 15 | # 16 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | # THE SOFTWARE. 23 | # 24 | ################################################################################ 25 | ]] 26 | 27 | -- Ultraschall Toolbox 28 | -- Preview Audio Before Recording beta 1 (9th of September 2018) - by Meo Mespotine mespotine.de 29 | -- 30 | -- 1. Set Editcursor to position, where you want to start recording 31 | -- 2. Start script; a window with an OK-button will pop up 32 | -- 3. Set Editcursor to the position, from where you want to "preview-playback". You can 33 | -- playback until you find the right position 34 | -- 4. When you've found the right position, click "OK" in the opened window 35 | -- 5. You will hear a playback of your audio until you reach your desired recording-position, where 36 | -- recording will start 37 | -- 38 | -- Good for audioplays, where you want to give the speaker/voice-actor a preview of their last performance or 39 | -- their last sentence they acted, more easily than with usual pre-roll, as you can set the exact spot to restart. 40 | -- Maybe helpful for other things as well? 41 | -- 42 | -- Help us making good scripts, donate to our team at: ultraschall.fm/danke 43 | -- 44 | -- Cheers 45 | 46 | 47 | 48 | retval, measures, cml, fullbeats, cdenom = reaper.TimeMap2_timeToBeats(0, 10) 49 | 50 | Preroll_Settings=reaper.SNM_GetIntConfigVar("preroll", -99) 51 | Preroll_Settings_new=6 52 | reaper.SNM_SetIntConfigVar("preroll", Preroll_Settings_new) 53 | 54 | OldTime=reaper.SNM_GetDoubleConfigVar("prerollmeas", -99) 55 | 56 | ultraschall={} 57 | 58 | function ultraschall.TimeToMeasures(project, time) 59 | -- quick function that converts a time into current projects time-measures 60 | -- only useful, when there are no tempo-changes in the project 61 | -- 62 | -- parameters: 63 | -- project - ReaProject to use the timesignature-settings from 64 | -- time - in seconds, the time to convert into a time-measurment, which can be 65 | -- used in config-variable "prerollmeas" 66 | -- 67 | -- retval: 68 | -- measuer - the measures, that parameter time needs to be reflected 69 | 70 | local Measures=reaper.TimeMap2_beatsToTime(0, 0, 1) 71 | local QN=reaper.TimeMap2_timeToQN(0, 1) 72 | local Measures_Fin=Measures/cdenom 73 | local Measures_Fin2=Measures_Fin*time 74 | return Measures_Fin2 75 | end 76 | 77 | if reaper.GetPlayState()~=0 then 78 | Recposition=reaper.GetPlayPosition() 79 | else 80 | Recposition=reaper.GetCursorPosition() 81 | end 82 | 83 | if reaper.GetPlayState()&4==4 then reaper.CSurf_OnStop() end 84 | 85 | function drawgfx() 86 | -- draws OK-Button and the text 87 | gfx.set(0.8,0.8,0.8,0.8) 88 | gfx.rect(230,30,60,60,1) 89 | gfx.set(1) 90 | gfx.x=16 gfx.y=28 91 | gfx.setfont(1,"Arial", 18.5, 66) 92 | gfx.drawstr("Place Editcursor to \nStart of Preview-Playposition \nand click OK") 93 | gfx.x=241 gfx.y=46 94 | gfx.setfont(1,"Arial", 30, 66) 95 | gfx.drawstr("OK") 96 | end 97 | 98 | function main() 99 | -- let's do the magic 100 | 101 | -- if the window-size is changed, redraw window-content 102 | if height~=gfx.h or width~=gfx.w then 103 | height=gfx.h 104 | width=gfx.w 105 | drawgfx() 106 | end 107 | 108 | -- let's check for user-input 109 | local A=gfx.getchar() 110 | 111 | -- if window is closed or user hits ESC-key, quit the script 112 | if A==-1 or A==27 then tudelu=false gfx.quit() reaper.SNM_SetIntConfigVar("preroll", Preroll_Settings) end 113 | 114 | -- if user hits the OK,Button: 115 | if gfx.mouse_cap&1==1 and gfx.mouse_x>=230 and gfx.mouse_x<=290 and gfx.mouse_y>=30 and gfx.mouse_y<=90 then 116 | local Playposition=reaper.GetCursorPosition() -- get current editcursor-position, from where the previewing will start 117 | gfx.quit() -- close gfx-window 118 | if Playposition==Recposition then 119 | -- if previewposition equals recposition, just start recording, clean up and exit 120 | reaper.SNM_SetDoubleConfigVar("prerollmeas", 0) 121 | reaper.CSurf_OnRecord() 122 | reaper.SNM_SetIntConfigVar("preroll", Preroll_Settings) 123 | reaper.SNM_SetDoubleConfigVar("prerollmeas", OldTime) 124 | return 125 | elseif RecpositionPlayposition then reaper.MB(L.." "..Playposition,"",0) end 141 | reaper.SNM_SetIntConfigVar("preroll", Preroll_Settings) 142 | reaper.SNM_SetDoubleConfigVar("prerollmeas", OldTime) 143 | tudelu=false 144 | end 145 | end 146 | gfx.update() 147 | if tudelu~=false then reaper.defer(main) end 148 | end 149 | 150 | -- main program 151 | gfx.init("Place Edit-Cursor", 320,120,0,100,300) -- open window 152 | 153 | -- let's get initial window height and width(for checking later, if we need to redraw the window contents due window-size-changes) 154 | height=gfx.h 155 | width=gfx.w 156 | 157 | -- draw gfx 158 | drawgfx() 159 | 160 | -- start the magic 161 | main() 162 | 163 | -------------------------------------------------------------------------------- /Tools/AnalyseTools/CheckForNewConfigVars.lua: -------------------------------------------------------------------------------- 1 | dofile(reaper.GetResourcePath().."/UserPlugins/ultraschall_api.lua") 2 | local A2=ultraschall.ReadFullFile("c:\\Reaper-Internal-Docs\\Reaper-ConfigVariables-Documentation.txt") 3 | local orgvars={} 4 | local Acount=1 5 | 6 | local ultraschall=ultraschall 7 | 8 | while A2~=nil do 9 | line,offs=A2:match("(.-)\n()") 10 | if offs==nil then break end 11 | B=line:sub(1,1) 12 | if B~="" and B~=" " and B~="#" then orgvars[Acount]=line Acount=Acount+1 end 13 | A2=A2:sub(offs,-1) 14 | end 15 | 16 | local Clipboard_string = ultraschall.GetStringFromClipboard_SWS() 17 | 18 | Clipboard_string=Clipboard_string.."\n " 19 | 20 | ints={} 21 | local integers="" 22 | local doubles="" 23 | count=1 24 | ALABAMA=0 25 | 26 | function main() 27 | for i=1,2500 do 28 | local var, offs=Clipboard_string:match("(.-)\r\n()") 29 | if var~=nil then var=var:lower() end 30 | ALABAMA=ALABAMA+1 31 | 32 | local A=reaper.SNM_GetIntConfigVar(var, -100) 33 | local B=reaper.SNM_GetIntConfigVar(var, -101) 34 | if A==B then 35 | for i=1, Acount do 36 | -- if ints:match(var.."\n")==nil then 37 | -- end 38 | if orgvars[i]==var then found=true end 39 | end 40 | if found==false then ints[count]=var count=count+1 reaper.ShowConsoleMsg(var.."\n") end 41 | found=false 42 | end 43 | 44 | if offs==nil then 45 | table.sort(ints) 46 | for i=1, count-1 do 47 | integers=integers..ints[i].."\n" 48 | end 49 | reaper.CF_SetClipboard("INTS:\n"..integers.."\n\nDOUBLES:\n"..doubles) 50 | return 51 | end 52 | Clipboard_string=Clipboard_string:sub(offs,-1) 53 | end 54 | reaper.defer(main) 55 | end 56 | 57 | main() 58 | -------------------------------------------------------------------------------- /Tools/AnalyseTools/CheckReascriptCPP.lua: -------------------------------------------------------------------------------- 1 | dofile(reaper.GetResourcePath().."/UserPlugins/ultraschall_api.lua") 2 | 3 | --ultraschall.ApiTest() 4 | 5 | Infilename="c:\\Ultraschall_3_2_alpha2_Hackversion\\UserPlugins\\ultraschall_api\\misc\\reaper-apihelp14.txt" 6 | 7 | --reaper.MB(Infilename:sub(30,-1), tostring(reaper.file_exists(Infilename)),0) 8 | A=ultraschall.ReadValueFromFile("c:\\REAPER5_95_final\\reaper_plugin_functions.h","if defined%(REAPERAPI%_WANT%_",false) 9 | B=ultraschall.ReadValueFromFile(Infilename,".-",false) 10 | 11 | c,C = ultraschall.SplitStringAtLineFeedToArray(A) 12 | --reaper.MB(A:sub(1,1000),"",0) 13 | 14 | d, D = ultraschall.SplitStringAtLineFeedToArray(B) 15 | 16 | slugs=0 17 | plugin=0 18 | 19 | for i=1, d do 20 | slugs=slugs+1 21 | D[i]=D[i]:match("(.-)") 22 | end 23 | 24 | for i=1, c do 25 | plugin=plugin+1 26 | C[i]=C[i]:match("%(REAPERAPI_WANT_(.-)%)") 27 | if C[i]==nil then C[i]="" end 28 | end 29 | 30 | for i=plugin, 1, -1 do 31 | for a=slugs, 1, -1 do 32 | if C[i]==D[a] then found=true end 33 | end 34 | if found~=true then reaper.ShowConsoleMsg(C[i].."\n") end 35 | found=false 36 | end 37 | 38 | 39 | -------------------------------------------------------------------------------- /Tools/AnalyseTools/FindNewActions.lua: -------------------------------------------------------------------------------- 1 | ultraschall={} 2 | function ultraschall.ReadFullFile(filename_with_path, binary) 3 | -- Returns the whole file filename_with_path or nil in case of error 4 | 5 | -- check parameters 6 | if filename_with_path == nil then ultraschall.AddErrorMessage("ReadFullFile", "filename_with_path", "must be a string", -1) return nil end 7 | if reaper.file_exists(filename_with_path)==false then ultraschall.AddErrorMessage("ReadFullFile", "filename_with_path", "file does not exist", -2) return nil end 8 | 9 | -- prepare variables 10 | if binary==true then binary="b" else binary="" end 11 | local linenumber=0 12 | 13 | -- read file 14 | local file=io.open(filename_with_path,"r"..binary) 15 | local filecontent=file:read("a") 16 | 17 | -- count lines in file, when non binary 18 | if binary~=true then 19 | for w in string.gmatch(filecontent, "\n") do 20 | linenumber=linenumber+1 21 | end 22 | else 23 | linenumber=-1 24 | end 25 | file:close() 26 | -- return read file, length and linenumbers 27 | return filecontent, filecontent:len(), linenumber 28 | end 29 | 30 | IniFile=reaper.GetExePath().."/Reaper-ActionList_v5_80.ini" -- the path to the ini-file 31 | ActionsList=reaper.GetExePath().."/ActionList.txt" -- the path to the actionlist 32 | 33 | A=ultraschall.ReadFullFile(ActionsList) 34 | A=A.."\n" 35 | SectTemp="" 36 | while A~=nil do 37 | Line, Offs=A:match("(.-)\n()") 38 | -- reaper.MB(Line, "",0) 39 | Sect=Line:match("(.-)%s") 40 | if Sect==nil then break end 41 | if SectTemp~=Sect then reaper.ShowConsoleMsg(Sect.."\n") SectTemp=Sect end 42 | Action=Line:match("%s(.-)%s") 43 | Text=Line:match("%s.-%s(.*)") 44 | 45 | -- The following line crashes Lua for this script, until Reaper is restarted: 46 | if tonumber(Action)~=nil then 47 | retval, String = reaper.BR_Win32_GetPrivateProfileString(Sect, tonumber(Action), "UltraschallNups", IniFile) 48 | end 49 | 50 | if String=="UltraschallNups" then 51 | reaper.ShowConsoleMsg(Sect.." "..Action.." "..Text.."\n") 52 | reaper.BR_Win32_WritePrivateProfileString(Sect, tonumber(Action), Text, IniFile) 53 | end 54 | 55 | 56 | if Offs==nil then break end 57 | A=A:sub(Offs,-1) 58 | end 59 | reaper.MB("Done","",0) 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /Tools/AnalyseTools/GetOldConfigVars.lua: -------------------------------------------------------------------------------- 1 | dofile(reaper.GetResourcePath().."/UserPlugins/ultraschall_api.lua") 2 | A2=ultraschall.ReadFullFile("c:\\Reaper-Internal-Docs\\Reaper-ConfigVariables-Documentation.txt") 3 | orgvars={} 4 | count=1 5 | vars="" 6 | 7 | while A2~=nil do 8 | line,offs=A2:match("(.-)\n()") 9 | if offs==nil then break end 10 | B=line:sub(1,1) 11 | if B~="" and B~=" " and B~="#" then orgvars[count]=line count=count+1 end 12 | A2=A2:sub(offs,-1) 13 | end 14 | 15 | 16 | for i=1, count-1 do 17 | vars=vars..orgvars[i].."\\n" 18 | end 19 | 20 | reaper.CF_SetClipboard(vars) 21 | -------------------------------------------------------------------------------- /Tools/Env_State_Diffs_Monitor.lua: -------------------------------------------------------------------------------- 1 | --[[ 2 | Display Envelope changes in Envelope-State-Chunks. 3 | 4 | This displays diffs in an EnvelopeStateChunk, for easier tracking, what changed in an EnvelopeStateChunk. 5 | 6 | This will display the changed lines(including line-number within the statechunk) 7 | + the two lines before it (if existing and not being changed lines themselves) 8 | 9 | Changed lines begin with: 10 | line xx >> 11 | 12 | 13 | Before monitoring starts, a dialog will ask you, whether to monitor only the, at that time of the dialog, currently selected envelope(choose yes), 14 | or if you want to monitor other selected envelopes during scriptrun as well(choose No). 15 | 16 | After that, it will ask you, whether to put the changed lines into the clipboard. 17 | 18 | When changing a selected envelope, it will show all lines of the envelope-state-chunk. 19 | So if you just want to see the change in a selected envelope, select it first, then apply the change. 20 | 21 | Meo Mespotine mespotine.de - 1st of november 2018 22 | --]] 23 | 24 | function SplitStringAtLineFeedToArray(unsplitstring) 25 | local array={} 26 | local i=1 27 | if unsplitstring==nil then return -1 end 28 | local astring=unsplitstring 29 | local pos 30 | astring=string.gsub (unsplitstring, "\r\n", "\n") 31 | astring=string.gsub (astring, "\n\r", "\n") 32 | astring=string.gsub (astring, "\r", "\n") 33 | astring=astring.."\n" 34 | while astring:match("%c") do 35 | array[i],pos=astring:match("(.-)\n()") 36 | -- reaper.MB(array[i], tostring(pos),0) 37 | if sub~=nil then break end 38 | astring=astring:sub(pos,-1) 39 | i=i+1 40 | end 41 | if astring~="" and astring~=nil then array[i]=astring 42 | else i=i-1 43 | end 44 | return i,array 45 | end 46 | 47 | 48 | function main() 49 | if tonumber(selected)==7 then Envelope=reaper.GetSelectedEnvelope(0) 50 | end 51 | if Envelope~=nil then 52 | retval, sc = reaper.GetEnvelopeStateChunk(Envelope, "", false) 53 | retval, buf = reaper.GetEnvelopeName(Envelope, "") 54 | if oldsc~=sc then 55 | count1, split_string1 = SplitStringAtLineFeedToArray(oldsc) 56 | count2, split_string2 = SplitStringAtLineFeedToArray(sc) 57 | if split_string1==nil then split_string1={} end 58 | reaper.ClearConsole() 59 | reaper.ShowConsoleMsg("Monitoring StateChunk-changes of Envelope: "..buf.."\n\n") 60 | a=-10 61 | temp="" 62 | for i=1, count2 do 63 | if split_string1[i]~=split_string2[i] and Envelope==oldEnvelope then 64 | if a~=-10 and (a0 then reaper.ShowConsoleMsg("Change:\n\t"..split_string2[i-2].."\n") end 66 | if a0 then reaper.ShowConsoleMsg("\t"..split_string2[i-1].."\n") end 67 | if A==6 then temp=temp.."line "..i.." >> "..split_string2[i].."\n" end 68 | reaper.ShowConsoleMsg("line "..i.." >> "..split_string2[i].."\n") 69 | a=i 70 | elseif Envelope~=oldEnvelope then 71 | reaper.ShowConsoleMsg(split_string2[i].."\n") 72 | if A==6 then temp=temp..split_string2[i].."\n" end 73 | end 74 | end 75 | if A==6 and temp~="" then reaper.CF_SetClipboard(temp.."\n") end 76 | end 77 | oldsc=sc 78 | oldEnvelope=Envelope 79 | end 80 | reaper.defer(main) 81 | end 82 | 83 | text=[[Display Envelope changes in Envelope-State-Chunks. 84 | 85 | This displays diffs in an EnvelopeStateChunk, for easier tracking, what changed in an EnvelopeStateChunk. 86 | 87 | This will display the changed lines(including line-number within the statechunk) 88 | + the two lines before it (if existing and not being changed lines themselves) 89 | 90 | Changed lines begin with: 91 | line xx >> 92 | 93 | 94 | Before monitoring starts, a dialog will ask you, whether to monitor only the, at that time of the dialog, currently selected envelope(choose yes), 95 | or if you want to monitor other selected envelopes during scriptrun as well(choose No). 96 | 97 | After that, it will ask you, whether to put the changed lines into the clipboard. 98 | 99 | When changing a selected envelope, it will show all lines of the envelope-state-chunk. 100 | So if you just want to see the change in a selected envelope, select it first, then apply the change. 101 | 102 | Meo Mespotine mespotine.de - 1st of november 2018"]] 103 | 104 | reaper.MB(text, "Item-StateChunk Diff-monitor-tool 1.0", 0) 105 | 106 | selected=reaper.MB("Use Currently Selected Envelope Only? \n\nSelect No to monitor another selected Envelope during scriptrun.", "", 4) 107 | if selected==6 then Item=reaper.GetSelectedEnvelope(0) if Item==nil then reaper.MB("No MediaItem selected. Quitting now.", "Ooops...", 0) return end end 108 | 109 | A=reaper.MB("Put Difs to Clipboard?", "", 4) 110 | 111 | main() 112 | -------------------------------------------------------------------------------- /Tools/HWND-Displayer.lua: -------------------------------------------------------------------------------- 1 | --[[ 2 | ################################################################################ 3 | # 4 | # Copyright (c) 2014-2019 Ultraschall (http://ultraschall.fm) 5 | # 6 | # Permission is hereby granted, free of charge, to any person obtaining a copy 7 | # of this software and associated documentation files (the "Software"), to deal 8 | # in the Software without restriction, including without limitation the rights 9 | # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | # copies of the Software, and to permit persons to whom the Software is 11 | # furnished to do so, subject to the following conditions: 12 | # 13 | # The above copyright notice and this permission notice shall be included in 14 | # all copies or substantial portions of the Software. 15 | # 16 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | # THE SOFTWARE. 23 | # 24 | ################################################################################ 25 | ]] 26 | 27 | -- written by Meo Mespotine mespotine.de 2nd of June 2019 28 | -- for the ultraschall.fm-project 29 | -- MIT-licensed 30 | 31 | -- opens an overlay-window, which displays and draws the position of child-HWNDs of the currently focused window 32 | -- use up/down to browse through them 33 | -- left makes the overlay-window small; right makes it fullscreen 34 | -- f - switches to the currently focused window 35 | -- a - autofocuses on the currently focused window 36 | -- p - pinpoints the window underneath the mousecursor 37 | -- h - toggles help 38 | -- PgUp/PgDn - browse through childHWNDs in steps of 10 39 | -- Home/End - first or last childHWND 40 | -- Backspace - go to parent hwnd 41 | -- Enter - switch to current childHWND as mainHWND, whose childHWNDs you want to browse through 42 | -- Ctrl+C - copies hwnd-information into clipboard 43 | -- +/- adjust the alpha-channel of the transparency of the overlay-window 44 | -- Esc - escapes this app 45 | -- good for analysing the HWND-structure of Reaper 46 | 47 | dofile(reaper.GetResourcePath().."/UserPlugins/ultraschall_api.lua") 48 | 49 | if ultraschall==nil then reaper.MB("Needs Ultraschall-API installed! Go to ultraschall.fm/api to get it.", "Ultraschall-API missing", 0) return end 50 | 51 | pause=false 52 | autofocus=false 53 | pinpoint=false 54 | help=true 55 | scleft, sctop, scright, scbottom = reaper.my_getViewport(0,0,0,0,0,0,0,0,true) 56 | Parent="" 57 | HWND={} 58 | HWND_indexer={} 59 | hwnd=reaper.JS_Window_GetFocus() 60 | if reaper.JS_Window_GetParent(hwnd)~=nil then hwnd=reaper.JS_Window_GetParent(hwnd) end 61 | Focus=hwnd 62 | OldFocus=hwnd 63 | HWND_indexer[reaper.JS_Window_AddressFromHandle(hwnd)]=1 64 | 65 | retval, OwnHWND=ultraschall.GFX_Init("Tudelu", scright-10, scbottom-30,0,0,0) 66 | gfx.setfont(1, "Arial", 20, 0) 67 | 68 | Maxcount=0 69 | alpha=0.7 70 | Counter=1 71 | reaper.JS_Window_SetOpacity(OwnHWND, "ALPHA", alpha) 72 | Oretval, Oleft, Otop, Oright, Obottom = reaper.JS_Window_GetRect(OwnHWND) 73 | Oretval2, Oleft2, Otop2, Oright2, Obottom2 = reaper.JS_Window_GetClientRect(OwnHWND) 74 | --Offset=Obottom2-Obottom 75 | Offset=Otop2-Otop 76 | Offsetx=Oleft2-Oleft-2 77 | if Offset<0 then Offset=Offset*-1 end 78 | 79 | 80 | 81 | function updatelist(hwnd2) 82 | -- if reaper.JS_Window_GetParent(hwnd)==nil then return end 83 | if hwnd==nil or reaper.JS_Window_ListAllChild(hwnd2)==nil then return end 84 | --[[ if HWND[Counter]~=nil then 85 | HWND_indexer[reaper.JS_Window_AddressFromHandle(HWND[Counter])]=Counter 86 | P3=reaper.JS_Window_AddressFromHandle(HWND[Counter]) 87 | end 88 | --]] 89 | HWND={} 90 | HWND["Parent"]=reaper.JS_Window_GetParent(hwnd2) 91 | HWND[0]=hwnd2 92 | Counter=0 93 | Maxcount=0 94 | if reaper.JS_Window_ListAllChild(hwnd2)<1 then return end 95 | Cretval, Clist = reaper.JS_Window_ListAllChild(hwnd2) 96 | Clist=Clist.."," 97 | local counter=0 98 | for k in string.gmatch(Clist, "(.-),") do 99 | counter=counter+1 100 | HWND[counter]=reaper.JS_Window_HandleFromAddress(k) 101 | end 102 | --[[ 103 | temphwnd2=reaper.JS_Window_AddressFromHandle(hwnd2) 104 | if HWND_indexer[HWND[0] ]~=nil then 105 | P0=HWND_indexer[temphwnd2] 106 | P1=temphwnd2 107 | Counter=P0 108 | else 109 | P0=-1 110 | P1=-1 111 | Counter=1 112 | end 113 | --]] 114 | 115 | -- Counter=1 116 | Maxcount=counter 117 | end 118 | 119 | updatelist(hwnd) 120 | --gfx.quit() 121 | 122 | function main() 123 | if ultraschall.IsValidHWND(hwnd)==false then hwnd=reaper.GetMainHwnd() end 124 | Focus=reaper.JS_Window_GetFocus() 125 | if Focus==OwnHWND or Focus==nil then 126 | Focus=OldFocus 127 | end 128 | if OldFocus~=Focus then 129 | if autofocus==true then 130 | hwnd=Focus 131 | updatelist(Focus) 132 | end 133 | end 134 | OldFocus=Focus 135 | if pinpoint==true then 136 | newhwnd=reaper.JS_Window_FromPoint(reaper.GetMousePosition()) 137 | if newhwnd~=nil then 138 | hwnd=newhwnd 139 | updatelist(hwnd) 140 | end 141 | end 142 | 143 | 144 | Key=gfx.getchar() 145 | if Key==8 then hwnd2=reaper.JS_Window_GetParent(hwnd) if hwnd2~=nil then hwnd=hwnd2 updatelist(hwnd) end end 146 | --if Key~=0 then print3(Key) end 147 | if Maxcount>0 and Key==1685026670.0 then Counter=Counter+1 if Counter>Maxcount then Counter=Maxcount end end 148 | if Maxcount>0 and Key==30064.0 then Counter=Counter-1 if Counter<0 then Counter=0 end end 149 | if Key==13 then hwnd=HWND[Counter] updatelist(HWND[Counter]) end 150 | if Key==102.0 and ultraschall.IsValidHWND(reaper.JS_Window_GetParent(Focus))==true then hwnd=reaper.JS_Window_GetParent(Focus) updatelist(reaper.JS_Window_GetParent(Focus)) end 151 | if Counter==0 then Parent="(Parent)" else Parent="" end 152 | if Key==43.0 then alpha=alpha+0.02 if alpha>1 then alpha=1 end reaper.JS_Window_SetOpacity(OwnHWND, "ALPHA", alpha) end 153 | if Key==45.0 then alpha=alpha-0.02 if alpha<0 then alpha=0 end reaper.JS_Window_SetOpacity(OwnHWND, "ALPHA", alpha) end 154 | if Key==27.0 then quitit=true gfx.quit() end 155 | if Key==1818584692.0 then reaper.JS_Window_Resize(OwnHWND, 300, 500) end 156 | if Key==1919379572.0 then reaper.JS_Window_SetPosition(OwnHWND, 0,0,scright, scbottom) end 157 | if Key==6647396.0 then Counter=Maxcount end 158 | if Key==1752132965.0 then Counter=0 end 159 | if Key==1885824110.0 then Counter=Counter+10 if Counter>Maxcount then Counter=Maxcount end end 160 | if Key==1885828464.0 then Counter=Counter-10 if Counter<0 then Counter=0 end end 161 | if Key==104.0 then if help~=true then help=true else help=false end end 162 | if Key==97.0 then if autofocus~=true then autofocus=true pinpoint=false else autofocus=false end end 163 | if Key==112.0 then if pinpoint~=true then pinpoint=true autofocus=false else pinpoint=false end end 164 | 165 | 166 | 167 | -- if Maxcount>0 then 168 | P=tostring(HWND[Counter]) 169 | ID=reaper.JS_Window_GetLongPtr(HWND[Counter], "ID") 170 | if ID~=nil then ID=math.floor(reaper.JS_Window_AddressFromHandle(ID)) else ID="" end 171 | ChildClass=reaper.JS_Window_GetClassName(HWND[Counter], "") 172 | if ChildClass==nil then ChildClass="" end 173 | retval, left, top, right, bottom = reaper.JS_Window_GetRect(HWND[Counter]) 174 | left, top = gfx.screentoclient(left, top+Offset) 175 | right, bottom = gfx.screentoclient(right, bottom+Offset) 176 | gfx.set(0,0,0,0.8) 177 | gfx.rect(1+left-Offsetx,1+top-Offset,right-left,bottom-top,0) 178 | gfx.set(1,1,1,0.8) 179 | gfx.rect(left-Offsetx,top-Offset,right-left,bottom-top,0) 180 | gfx.set(1,1,0,0.8) 181 | gfx.line(left-Offsetx,top-Offset,right-Offsetx,bottom-Offset,0) 182 | gfx.set(1,1,1,0.8) 183 | gfx.x=1 184 | gfx.y=1 185 | 186 | Title0=reaper.JS_Window_GetTitle(hwnd) 187 | Title=reaper.JS_Window_GetTitle(HWND[Counter]) 188 | 189 | ParentID=reaper.JS_Window_GetLongPtr(hwnd, "ID") 190 | if ParentID~=nil then ParentID=math.floor(reaper.JS_Window_AddressFromHandle(ParentID)) else ParentID="" end 191 | if Title0:len()>100 then Title0=Title0:sub(1,256).." ... " end 192 | if Title:len()>100 then Title=Title:sub(1,256).." ... " end 193 | 194 | gfx.drawstr(Title0.." - ParentID: "..ParentID.. 195 | " \nCounter: "..Counter.."/"..Maxcount.." - ".. 196 | Title..Parent.. 197 | " \nChildClass:"..ChildClass.. 198 | " \nID:"..ID.. 199 | " \nHas Children:".. 200 | reaper.JS_Window_ListAllChild(HWND[Counter])) 201 | if Key==3.0 then print3(Title0.. 202 | " \nCounter: "..Counter.."/"..Maxcount.." - ".. 203 | Title..Parent.. 204 | " \nChildClass:"..ChildClass.. 205 | " \nID:"..ID.. 206 | " \nHas Children:".. 207 | reaper.JS_Window_ListAllChild(HWND[Counter])) end 208 | if help~=false then 209 | gfx.x=1 210 | gfx.y=150 211 | gfx.drawstr([[How to use it: 212 | h - toggle this help 213 | 214 | Up/Down - change Child-HWND 215 | Enter - browse childHWNDs of currently selected childHWND 216 | BackSpace - change to parentHWND 217 | 218 | F - browse childHWNDs of keyboard-focused window 219 | 220 | +/- - change opacity of this overlay window 221 | left/right - minimize/maximize this overlay window 222 | 223 | PgUp/PgDn - change up/down 10 Child-HWNDs 224 | Home/End - first/last ChildHwnd 225 | 226 | Ctrl+C - copies hwnd-information to clipboard 227 | 228 | a(]]..tostring(autofocus)..[[) - toggles autofocus, which automatically uses the currently focused window 229 | p(]]..tostring(pinpoint)..[[) - shows the window underneath the mouse-cursor 230 | 231 | Esc - quit hwnd-inspector 232 | ]]) 233 | end 234 | 235 | --[[ print_update(reaper.JS_Window_GetTitle(hwnd).. 236 | " \nCounter: "..Counter.."/"..Maxcount.." - ".. 237 | reaper.JS_Window_GetTitle(HWND[Counter])..Parent.. 238 | " \nChildClass:"..ChildClass.. 239 | " \nID:"..ID.. 240 | " \nHas Children:".. 241 | reaper.JS_Window_ListAllChild(HWND[Counter])) 242 | --]] 243 | 244 | --end 245 | gfx.update() 246 | if quitit~=true and Key~=-1 then reaper.defer(main) end 247 | end 248 | 249 | main() 250 | --]] 251 | 252 | --gfx.quit() 253 | -------------------------------------------------------------------------------- /Tools/Item_State_Diffs_Monitor.lua: -------------------------------------------------------------------------------- 1 | --[[ 2 | Display Mediaitem changes in MediaItem-State-Chunks. 3 | 4 | This displays diffs in a MediaItemStateChunk, for easier tracking, what changed in a MediaItemStateChunk. 5 | 6 | MediaItemStateChunks contain ItemEnvelopes as well. 7 | 8 | This will display the changed lines(including line-number within the statechunk) 9 | + the two lines before it (if existing and not being changed lines themselves) 10 | 11 | Changed lines begin with: 12 | line xx >> 13 | 14 | 15 | Before monitoring starts, a dialog will ask you, whether to monitor only the, at that time of the dialog, currently selected MediaItem(choose yes), 16 | or if you want to monitor other selected MediaItems during scriptrun as well(choose No). 17 | 18 | After that, it will ask you, whether to put the changed lines into the clipboard. 19 | 20 | When changing a selected MediaItem, it will show all lines of the item-state-chunk. 21 | So if you just want to see the change in a selected MediaItem, select it first, then apply the change. 22 | 23 | Meo Mespotine mespotine.de - 30th of october 2018" 24 | --]] 25 | 26 | function SplitStringAtLineFeedToArray(unsplitstring) 27 | local array={} 28 | local i=1 29 | if unsplitstring==nil then return -1 end 30 | local astring=unsplitstring 31 | local pos 32 | astring=string.gsub (unsplitstring, "\r\n", "\n") 33 | astring=string.gsub (astring, "\n\r", "\n") 34 | astring=string.gsub (astring, "\r", "\n") 35 | astring=astring.."\n" 36 | while astring:match("%c") do 37 | array[i],pos=astring:match("(.-)\n()") 38 | -- reaper.MB(array[i], tostring(pos),0) 39 | if sub~=nil then break end 40 | astring=astring:sub(pos,-1) 41 | i=i+1 42 | end 43 | if astring~="" and astring~=nil then array[i]=astring 44 | else i=i-1 45 | end 46 | return i,array 47 | end 48 | 49 | 50 | function main() 51 | if tonumber(selected)==7 then Item=reaper.GetSelectedMediaItem(0,0) 52 | end 53 | if Item~=nil then 54 | retval, sc = reaper.GetItemStateChunk(Item, "", false) 55 | if oldsc~=sc then 56 | count1, split_string1 = SplitStringAtLineFeedToArray(oldsc) 57 | count2, split_string2 = SplitStringAtLineFeedToArray(sc) 58 | if split_string1==nil then split_string1={} end 59 | reaper.ClearConsole() 60 | reaper.ShowConsoleMsg("Monitoring StateChunk-changes of MediaItem\n\n") 61 | a=-10 62 | temp="" 63 | for i=1, count2 do 64 | if split_string1[i]~=split_string2[i] and Item==oldItem then 65 | if a~=-10 and (a0 then reaper.ShowConsoleMsg("Change:\n\t"..split_string2[i-2].."\n") end 67 | if a0 then reaper.ShowConsoleMsg("\t"..split_string2[i-1].."\n") end 68 | if A==6 then temp=temp.."line "..i.." >> "..split_string2[i].."\n" end 69 | reaper.ShowConsoleMsg("line "..i.." >> "..split_string2[i].."\n") 70 | a=i 71 | elseif Item~=oldItem then 72 | reaper.ShowConsoleMsg(split_string2[i].."\n") 73 | if A==6 then temp=temp..split_string2[i].."\n" end 74 | end 75 | end 76 | if A==6 and temp~="" then reaper.CF_SetClipboard(temp.."\n") end 77 | end 78 | oldsc=sc 79 | oldItem=Item 80 | end 81 | reaper.defer(main) 82 | end 83 | 84 | text=[[Display Mediaitem changes in MediaItem-State-Chunks. 85 | 86 | This displays diffs in a MediaItemStateChunk, for easier tracking, what changed in a MediaItemStateChunk. 87 | 88 | MediaItemStateChunks contain ItemEnvelopes as well. 89 | 90 | This will display the changed lines(including line-number within the statechunk) 91 | + the two lines before it (if existing and not being changed lines themselves) 92 | 93 | Changed lines begin with: 94 | line xx >> 95 | 96 | 97 | Before monitoring starts, a dialog will ask you, whether to monitor only the, at that time of the dialog, currently selected MediaItem(choose yes), 98 | or if you want to monitor other selected MediaItems during scriptrun as well(choose No). 99 | 100 | After that, it will ask you, whether to put the changed lines into the clipboard. 101 | 102 | When changing a selected MediaItem, it will show all lines of the item-state-chunk. 103 | So if you just want to see the change in a selected MediaItem, select it first, then apply the change. 104 | 105 | Meo Mespotine mespotine.de - 30th of october 2018"]] 106 | 107 | reaper.MB(text, "Item-StateChunk Diff-monitor-tool 1.0", 0) 108 | 109 | selected=reaper.MB("Use Currently Selected Mediaitem Only? \n\nSelect No to monitor another selectes MediaItem during scriptrun.", "", 4) 110 | if selected==6 then Item=reaper.GetSelectedMediaItem(0,0) if Item==nil then reaper.MB("No MediaItem selected. Quitting now.", "Ooops...", 0) return end end 111 | 112 | A=reaper.MB("Put Difs to Clipboard?", "", 4) 113 | 114 | main() 115 | -------------------------------------------------------------------------------- /Tools/Project_State_Diffs_Monitor.lua: -------------------------------------------------------------------------------- 1 | --[[ 2 | 3 | Display Project-changes in the rpp-file. 4 | 5 | This displays diffs in a RPP-projectfile, for easier tracking, what changed in the ProjectStateChunk. 6 | 7 | This constantly saves the current project, so be aware of that! 8 | 9 | Projectfiles include Projectbay, Extension-stuff, TrackStateChunks who include MediaItemStateChunk of MediaItems in that given track, as well as TrackEnvelopes and ItemEnvelopes and many other settings in the project. 10 | 11 | This will display the changed lines(including line-number within the statechunk) 12 | + the two lines before it (if existing and not being changed lines themselves) 13 | 14 | Changed lines begin with: 15 | line xx >> 16 | 17 | It will ask you, whether to put the changed lines into the clipboard. 18 | 19 | Meo Mespotine mespotine.de - 31st of october 2018 20 | --]] 21 | 22 | function SplitStringAtLineFeedToArray(unsplitstring) 23 | local array={} 24 | local i=1 25 | if unsplitstring==nil then return -1 end 26 | local astring=unsplitstring 27 | local pos 28 | astring=string.gsub (unsplitstring, "\r\n", "\n") 29 | astring=string.gsub (astring, "\n\r", "\n") 30 | astring=string.gsub (astring, "\r", "\n") 31 | astring=astring.."\n" 32 | while astring:match("%c") do 33 | array[i],pos=astring:match("(.-)\n()") 34 | -- reaper.MB(array[i], tostring(pos),0) 35 | if sub~=nil then break end 36 | astring=astring:sub(pos,-1) 37 | i=i+1 38 | end 39 | if astring~="" and astring~=nil then array[i]=astring 40 | else i=i-1 41 | end 42 | return i,array 43 | end 44 | 45 | function ReadFullFile(filename_with_path, binary) 46 | -- Returns the whole file filename_with_path or nil in case of error 47 | -- check parameters 48 | if filename_with_path == nil then return nil end 49 | if reaper.file_exists(filename_with_path)==false then return nil end 50 | 51 | -- prepare variables 52 | if binary==true then binary="b" else binary="" end 53 | local linenumber=0 54 | 55 | -- read file 56 | local file=io.open(filename_with_path,"r"..binary) 57 | local filecontent=file:read("a") 58 | 59 | -- count lines in file, when non binary 60 | if binary~=true then 61 | for w in string.gmatch(filecontent, "\n") do 62 | linenumber=linenumber+1 63 | end 64 | else 65 | linenumber=-1 66 | end 67 | file:close() 68 | -- return read file, length and linenumbers 69 | return filecontent, filecontent:len(), linenumber 70 | end 71 | 72 | timer=reaper.time_precise()+3 73 | oldprojsc="\nlol" 74 | 75 | function main() 76 | reaper.Main_SaveProject(0,false) 77 | Project, Filename=reaper.EnumProjects(-1,"") 78 | projsc=ReadFullFile(Filename) 79 | if oldprojsc:match("(\n.*)")~=projsc:match("(\n.*)") then 80 | count1, split_string1 = SplitStringAtLineFeedToArray(oldprojsc) 81 | count2, split_string2 = SplitStringAtLineFeedToArray(projsc) 82 | if split_string1==nil then split_string1={} end 83 | reaper.ClearConsole() 84 | reaper.ShowConsoleMsg("Monitoring StateChunk-changes in proj: "..Filename.."\n\n") 85 | a=-10 86 | temp="" 87 | for i=1, count2 do 88 | if split_string1[i]~=split_string2[i] and proj==oldproj then 89 | if a~=-10 and (a0 then reaper.ShowConsoleMsg("Change:\n\t"..split_string2[i-2].."\n") end 91 | if a0 then reaper.ShowConsoleMsg("\t"..split_string2[i-1].."\n") end 92 | if A==6 then temp=temp.."line "..i.." >> "..split_string2[i].."\n" end 93 | reaper.ShowConsoleMsg("line "..i.." >> "..split_string2[i].."\n") 94 | a=i 95 | elseif proj~=oldproj then 96 | if A==6 then temp=temp..split_string2[i].."\n" end 97 | reaper.ShowConsoleMsg(split_string2[i].."\n") 98 | end 99 | end 100 | if A==6 and temp~="" then reaper.CF_SetClipboard("Monitoring StateChunk-changes in proj: "..Filename.."\n\n"..temp.."\n") end 101 | end 102 | oldprojsc=projsc 103 | oldproj=proj 104 | reaper.defer(main) 105 | end 106 | 107 | text=[[Display Project-changes in the rpp-file. 108 | 109 | This displays diffs in a RPP-projectfile, for easier tracking, what changed in the ProjectStateChunk. 110 | 111 | This constantly saves the current project, so be aware of that! 112 | 113 | Projectfiles include Projectbay, Extension-stuff, TrackStateChunks who include MediaItemStateChunk of MediaItems in that given track, as well as TrackEnvelopes and ItemEnvelopes and many other settings in the project. 114 | 115 | This will display the changed lines(including line-number within the statechunk) 116 | + the two lines before it (if existing and not being changed lines themselves) 117 | 118 | Changed lines begin with: 119 | line xx >> 120 | 121 | It will ask you, whether to put the changed lines into the clipboard. 122 | 123 | Meo Mespotine mespotine.de - 31st of october 2018"]] 124 | 125 | reaper.MB(text, "Project-StateChunk Diff-monitor-tool 1.0", 0) 126 | 127 | a=-10 128 | A=reaper.MB("Put Difs to Clipboard?", "", 4) 129 | 130 | main() 131 | -------------------------------------------------------------------------------- /Tools/Track_State_Diffs_Monitor.lua: -------------------------------------------------------------------------------- 1 | --[[ 2 | Display Track changes in Track-State-Chunks. 3 | 4 | This displays diffs in a TrackStateChunk, for easier tracking, what changed in a TrackStateChunk. 5 | 6 | TrackStateChunks include MediaItemStateChunk of MediaItems in that given track, as well as TrackEnvelopes and ItemEnvelopes. 7 | 8 | This will display the changed lines(including line-number within the statechunk) 9 | + the two lines before it (if existing and not being changed lines themselves) 10 | 11 | Changed lines begin with: 12 | line xx >> 13 | 14 | 15 | Before monitoring it, a dialog will appear that asks you for the track to monitor. 16 | Select the track to monitor by either giving the dialog the tracknumber(1-based) 17 | or by giving it 0 or just hitting ok to monitor the first selected track. 18 | 19 | After that, it will ask you, whether to put the changed lines into the clipboard. 20 | 21 | When changing a selected track, it will show all lines of the track-state-chunk. 22 | So if you just want to see the change in a selected track, select it first, then apply the change. 23 | 24 | Meo Mespotine mespotine.de - 30th of october 2018 25 | --]] 26 | 27 | function SplitStringAtLineFeedToArray(unsplitstring) 28 | local array={} 29 | local i=1 30 | if unsplitstring==nil then return -1 end 31 | local astring=unsplitstring 32 | local pos 33 | astring=string.gsub (unsplitstring, "\r\n", "\n") 34 | astring=string.gsub (astring, "\n\r", "\n") 35 | astring=string.gsub (astring, "\r", "\n") 36 | astring=astring.."\n" 37 | while astring:match("%c") do 38 | array[i],pos=astring:match("(.-)\n()") 39 | -- reaper.MB(array[i], tostring(pos),0) 40 | if sub~=nil then break end 41 | astring=astring:sub(pos,-1) 42 | i=i+1 43 | end 44 | if astring~="" and astring~=nil then array[i]=astring 45 | else i=i-1 46 | end 47 | return i,array 48 | end 49 | 50 | 51 | function main() 52 | if tonumber(selected)>0 then tracknumber=selected Track=reaper.GetTrack(0,tonumber(selected)-1) 53 | else 54 | Track=reaper.GetSelectedTrack(0,0) 55 | if Track~=nil then tracknumber=reaper.GetMediaTrackInfo_Value(Track, "IP_TRACKNUMBER") end 56 | end 57 | if Track~=nil then 58 | retval, tracksc = reaper.GetTrackStateChunk(Track, "", false) 59 | if oldtracksc~=tracksc then 60 | count1, split_string1 = SplitStringAtLineFeedToArray(oldtracksc) 61 | count2, split_string2 = SplitStringAtLineFeedToArray(tracksc) 62 | if split_string1==nil then split_string1={} end 63 | reaper.ClearConsole() 64 | reaper.ShowConsoleMsg("Monitoring StateChunk-changes in Track: "..math.floor(tracknumber).."\n\n") 65 | a=-10 66 | temp="" 67 | for i=1, count2 do 68 | if split_string1[i]~=split_string2[i] and Track==oldTrack then 69 | if a~=-10 and (a0 then reaper.ShowConsoleMsg("Change:\n\t"..split_string2[i-2].."\n") end 71 | if a0 then reaper.ShowConsoleMsg("\t"..split_string2[i-1].."\n") end 72 | if A==6 then temp=temp.."line "..i.." >> "..split_string2[i].."\n" end 73 | reaper.ShowConsoleMsg("line "..i.." >> "..split_string2[i].."\n") 74 | a=i 75 | elseif Track~=oldTrack then 76 | if A==6 then temp=temp..split_string2[i].."\n" end 77 | reaper.ShowConsoleMsg(split_string2[i].."\n") 78 | end 79 | end 80 | if A==6 and temp~="" then reaper.CF_SetClipboard("Monitoring StateChunk-changes in Track: "..math.floor(tracknumber).."\n\n"..temp.."\n") end 81 | end 82 | oldtracksc=tracksc 83 | oldTrack=Track 84 | end 85 | reaper.defer(main) 86 | end 87 | 88 | text=[[Display Track changes in Track-State-Chunks. 89 | 90 | This displays diffs in a TrackStateChunk, for easier tracking, what changed in a TrackStateChunk. 91 | 92 | TrackStateChunks include MediaItemStateChunk of MediaItems in that given track, as well as TrackEnvelopes and ItemEnvelopes. 93 | 94 | This will display the changed lines(including line-number within the statechunk) 95 | + the two lines before it (if existing and not being changed lines themselves) 96 | 97 | Changed lines begin with: 98 | line xx >> 99 | 100 | 101 | Before monitoring it, a dialog will appear that asks you for the track to monitor. 102 | Select the track to monitor by either giving the dialog the tracknumber(1-based) 103 | or by giving it 0 or just hitting ok to monitor the first selected track. 104 | 105 | After that, it will ask you, whether to put the changed lines into the clipboard. 106 | 107 | When changing a selected track, it will show all lines of the track-state-chunk. 108 | So if you just want to see the change in a selected track, select it first, then apply the change. 109 | 110 | Meo Mespotine mespotine.de - 30th of october 2018"]] 111 | 112 | reaper.MB(text, "Track-StateChunk Diff-monitor-tool 1.0", 0) 113 | 114 | retval, selected = reaper.GetUserInputs("Which track? Use 0 to use selected track.", 1, "Tracknumber:", "") 115 | if tonumber(selected)==nil then selected=0 end 116 | a=-10 117 | 118 | A=reaper.MB("Put Difs to Clipboard?", "", 4) 119 | 120 | main() 121 | -------------------------------------------------------------------------------- /Tools/Ultraschall_StateInspector/Readme.txt: -------------------------------------------------------------------------------- 1 | Ultraschall State Inspector v2.0 - 24.01.2018 2 | 3 | 4 | #Introduction 5 | 6 | Developing features in Reaper is fun. 7 | But debugging in Reaper is not. Mostly due the fact, that you can't 8 | conveniently see, what is happening in the background. 9 | Are states working as expected? Are Reaper's features do what they're told? 10 | For such situations, we made the Ultraschall-Inspector. 11 | 12 | 13 | #What is it? 14 | 15 | The Ultraschall Inspector helps you monitoring states in Reaper, like 16 | toggle-command-states, external states, external project states, 17 | key-value-stores from .ini-files, as well as a lot of Reaper's own states, 18 | like projectlength, transport and mouse-states. 19 | That way you can see, whether states behave as expected due to your script. 20 | 21 | In addition, you can change states(where applicable) within the Inspector, 22 | can add actions/scripts that can be run from within the Inspector as well. 23 | You also have helper stuff like color-value-conversion or for conversion of 24 | the char-values, as returned by the function gfx.getchar() to the accompanying 25 | character/keyboard-key. 26 | 27 | 28 | #How to install it? 29 | 30 | It's easy. Extract the contents of the folder someplace, preferably the Scripts-folder 31 | of Reaper's Ressources-folder. 32 | Next, you add the script "ultraschall_StateInspector.lua": 33 | 1) Menu: Actions -> Show Actions List 34 | 2) Button Load 35 | 3) select "ultraschall_StateInspector.lua" 36 | 4) start the script from within Reaper 37 | 38 | 39 | #How to use it? 40 | 41 | The Inspector is useable with mouse. At the top, you have the menu with several options 42 | you can choose(more on that later on). 43 | You can add a state by, e.g. Menu: Add-States->Add Toggle Command. Type in the Action-CommandID 44 | of the command, whose toggle state you want to monitor, hit OK and the state appears. 45 | 46 | In the middle of the Inspector-Window, you have the list of the states you've added. 47 | First, the entrynumber within the list, then the state-name(colored by type) and then 48 | it's value. 49 | You can browse through the list using the arrow-keys, as well as PgUp/PgDn/Home and End. 50 | You can also make the window smaller or bigger, the list will fit accordingly. 51 | If a state is too long to fit the screen, then you can use left and right-arrow-keys to 52 | move the list into these directions. 53 | 54 | If you have several states and want to highlight some of them for better visibility, just 55 | left click on them. 56 | 57 | If you want to change a state, rightclick on them, a dialog, in which you can enter the new 58 | value will appear. 59 | Exception: Toggle-States and Actions open a context-menu, in which you can choose to toggle 60 | the toggle-state, as well as running the action/script. 61 | 62 | If you have a list, you want to save, you can do it in two ways. 63 | 1) Quick-Load-Slots: In the Inspector, you can have 9 saveslots. Hit S and type in 64 | the slotnumber and a name for the list. L displays a list of 65 | all existing slots. 66 | Now you can easily switch between these slots by using the keys 67 | 1-9 68 | 2) SaveFiles : You can save and load the list into a file as well, using ctrl+s/cmd+l. 69 | To load a list from a file, hit ctrl+l/cmd+l. 70 | 71 | All these options are also available through the menu at the top of the window, so feel free 72 | to browse through it. 73 | 74 | 75 | #The Menu 76 | 77 | File - clear/load/save-collection or close the Inspector 78 | Add States - here you can find a lot of states, you can add, eg: 79 | - Actions/Scripts 80 | - Toggle Command States 81 | - external states(persistant and non persistant ones) 82 | - ultraschall-external states (only relevant, if you've installed ultraschall.fm) 83 | - any external state, key values-stores from ini-files, like reaper.ini 84 | - project external states - states, that are part of the project itself 85 | - Reaper States - a collection of states from Reaper itself, ordered by 86 | category 87 | Edit List - here you change/modify the list 88 | the entry "Toggle Keyboard Control" turns off keyboard-shortcuts within the Inspector 89 | which might be helpful, if you chose e.g. 90 | Add States -> Add Reaper State -> Miscellaneous -> Get Current Character 91 | 92 | View - switches between several views. Currently only the state-list as well as the project-notes, 93 | if they're existing. 94 | 95 | Developer Tools - some helpful tools, that might help your everyday coding work. I'm open for more 96 | ideas, that you'd love to have in that menu 97 | 98 | Help - what it says ;) 99 | 100 | 101 | #About Ultraschall 102 | 103 | The Ultraschall-project is focused on modifying Reaper into a production-platform, with a focus on 104 | podcasting as well as producing shows for radios. 105 | 106 | In January 2018, the Ultraschall version 3.1 has been released. 107 | More info at ultraschall.fm or at https://twitter.com/ultraschall_fm 108 | 109 | For questions regarding the Ultraschall-Inspector, contact Meo directly: 110 | mespotine@mespotine.de and https://twitter.com/MespotineShows 111 | 112 | 113 | #License 114 | 115 | ################################################################################ 116 | # 117 | # Copyright (c) 2014-2018 Ultraschall (http://ultraschall.fm) 118 | # 119 | # Permission is hereby granted, free of charge, to any person obtaining a copy 120 | # of this software and associated documentation files (the "Software"), to deal 121 | # in the Software without restriction, including without limitation the rights 122 | # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 123 | # copies of the Software, and to permit persons to whom the Software is 124 | # furnished to do so, subject to the following conditions: 125 | # 126 | # The above copyright notice and this permission notice shall be included in 127 | # all copies or substantial portions of the Software. 128 | # 129 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 130 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 131 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 132 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 133 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 134 | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 135 | # THE SOFTWARE. 136 | # 137 | ################################################################################ -------------------------------------------------------------------------------- /Tools/Ultraschall_StateInspector/Ultraschall_Inspector_Gfx_GetKey_Codes.ini: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mespotine/ultraschall-and-reaper-docs/c8b6843fd6325161d129d1b55c147f4194392bd4/Tools/Ultraschall_StateInspector/Ultraschall_Inspector_Gfx_GetKey_Codes.ini -------------------------------------------------------------------------------- /Tools/Ultraschall_StateInspector/us.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mespotine/ultraschall-and-reaper-docs/c8b6843fd6325161d129d1b55c147f4194392bd4/Tools/Ultraschall_StateInspector/us.png -------------------------------------------------------------------------------- /Tools/gfx_deltablit_displayer.lua: -------------------------------------------------------------------------------- 1 | -- Meo Mespotine - 24.6.2019 2 | -- 3 | -- This tool is meant to give you an idea, how gfx.deltablit/gfx_deltablit works. 4 | -- 5 | -- At the bottom, you have a description, what the selected parameter is supposed to do. 6 | 7 | gfx.setfont(1, "arial", 15) 8 | Table={0,0,0,0,0,0,241,140,1,0,0,1,0,0,0,0} 9 | Defaults={0,0,0,0,0,0,241,140,1,0,0,1,0,0,0,0} 10 | Table[0]="\n" 11 | Entries={"srcs","srct","srcw","srch","destx","desty","destw","desth","dsdx","dtdx","dsdy","dtdy","dsdxdy","dtdxdy","usecliprect"} 12 | Entries[0]="" 13 | 14 | Helptexts={"positiondeltaX - the delta of the x-position of the image within the blitted area in pixels", 15 | "positiondeltaY - the delta of the y-position of the image within the blitted area in pixels", 16 | "unknown", 17 | "unknown", 18 | "positiondeltaX - the delta of the x-position of the blitted area in pixels", 19 | "positiondeltaY - the delta of the y-position of the blitted area in pixels", 20 | "blitsizeX - the x-size of the blitted area in pixels; the deltaimage might be cropped, \nif it exceeds this size", 21 | "blitsizeY - the y-size of the blitted area in pixels; the deltaimage might be cropped, \nif it exceeds this size", 22 | "stretchfactorX, the lower, the more stretched is the image(minimum 0; 1 for full size)", 23 | "deltaY: the delta of the right side of the image, related to the left side of the image;\n positive, right is moved up; negative, right is moved down; this delta is linear", 24 | "deltaX: the delta of the bottom side of the image, related to the top side of the image;\n positive, bottom is moved left; negative, bottom is moved right; this delta is linear", 25 | "stretchfactorY, the lower, the more stretched is the image(minimum 0; 1 for full size)", 26 | "deltacurvedY: the delta of the right side of the image, related to the left side of the image;\npositive, right is moved up; negative, right is moved down; this delta \"curves\" the \ndelta via a bezier", 27 | "deltacurvedX: the delta of the bottom side of the image, related to the top side of the image;\npositive, bottom is moved left; negative, bottom is moved right; this delta \"curves\" the \ndelta via a bezier", 28 | "can be set to 0 or 1" 29 | } 30 | Index=1 31 | scale=1 32 | 33 | function DisplayHelp() 34 | reaper.MB( 35 | [[Deltablit-Viewer by Meo Mespotine - 24. June 2019 36 | 37 | This tool is meant to give you an idea, how gfx.deltablit/gfx_deltablit works. 38 | At the bottom, you have a description, what the selected parameter is supposed to do. 39 | 40 | Note: Some parameters should only be changed by smaller stepsizes! 41 | 42 | F1 - this help 43 | 44 | up/down - Navigate through the parameters 45 | left/right - alter parameter, stepsize of 1 46 | Ctrl+left/Ctrl+right - alter parameter, stepsize of 0.001 47 | Shift+left/Shift+right - alter parameter, stepsize of 10 48 | Shift+Ctrl+left/Shift+Ctrl+right - alter parameter, stepsize of 100 49 | 50 | Backspace - reset parameter to default-value 51 | 52 | L - load new image 53 | 54 | Esc - quit this tool]], "Help: GFX-Deltablit-Viewer", 0) 55 | end 56 | 57 | function LoadImage() 58 | filename="" 59 | selected, filename = reaper.GetUserFileNameForRead(reaper.GetExtState("ultraschall", "devscript_gfx_deltablit_displayer"), "select picture", "") 60 | if selected==false then return -1 end 61 | selected=gfx.loadimg(1, filename) 62 | if selected==-1 then return -1 end 63 | Table[7], Table[8] = gfx.getimgdim(1) 64 | Defaults[7], Defaults[8] = gfx.getimgdim(1) 65 | reaper.SetExtState("ultraschall", "devscript_gfx_deltablit_displayer", filename, true) 66 | return selected 67 | end 68 | 69 | function main() 70 | gfx.x=20 71 | gfx.y=20 72 | A=gfx.getchar() 73 | --if A~=0 then reaper.CF_SetClipboard(A) end 74 | if A==30064.0 then Index=Index-1 if Index<1 then Index=1 end end 75 | if A==1685026670.0 then Index=Index+1 if Index>15 then Index=15 end end 76 | if A==1919379572.0 and gfx.mouse_cap==0 then Table[Index]=Table[Index]+1 end 77 | if A==1818584692.0 and gfx.mouse_cap==0 then Table[Index]=Table[Index]-1 end 78 | if A==1919379572.0 and gfx.mouse_cap==12 then Table[Index]=Table[Index]+100 end 79 | if A==1818584692.0 and gfx.mouse_cap==12 then Table[Index]=Table[Index]-100 end 80 | if A==1919379572.0 and gfx.mouse_cap==8 then Table[Index]=Table[Index]+10 end 81 | if A==1818584692.0 and gfx.mouse_cap==8 then Table[Index]=Table[Index]-10 end 82 | if A==1919379572.0 and gfx.mouse_cap==4 then Table[Index]=Table[Index]+.001 end 83 | if A==1818584692.0 and gfx.mouse_cap==4 then Table[Index]=Table[Index]-.001 end 84 | if A==8.0 then Table[Index]=Defaults[Index] end 85 | if A==27 then gfx.quit() end 86 | if A==108.0 then 87 | A1=LoadImage() 88 | if A1==-1 then 89 | reaper.MB("Could not load image: Either no image or wrong extension", "Ooops", 0) 90 | end 91 | end 92 | if A==26161.0 then DisplayHelp() end 93 | 94 | --O=gfx.gradrect(table.unpack(Table)) 95 | O=gfx.deltablit(1, table.unpack(Table)) 96 | gfx.x=400 97 | gfx.y=10 98 | tempstring="\n" 99 | for i=0, 15 do 100 | if Index==i+1 then 101 | tempstring=tempstring..Entries[i].."\n" 102 | else 103 | tempstring=tempstring..Entries[i].."\n" 104 | end 105 | end 106 | 107 | gfx.x=gfx.w-180 108 | gfx.y=12 109 | gfx.set(0) 110 | gfx.drawstr(tempstring) 111 | gfx.x=gfx.w-181 112 | gfx.y=10 113 | gfx.set(1) 114 | gfx.drawstr(tempstring) 115 | tempstring="" 116 | for i=0, 15 do 117 | if Index==i+1 then 118 | tempstring=tempstring..Table[i].."\n>\t" 119 | else 120 | tempstring=tempstring..Table[i].."\n " 121 | end 122 | end 123 | gfx.x=gfx.w-99 124 | gfx.y=12 125 | gfx.set(0) 126 | gfx.drawstr(tempstring) 127 | gfx.x=gfx.w-100 128 | gfx.y=11 129 | gfx.set(1) 130 | gfx.drawstr(tempstring) 131 | 132 | gfx.update() 133 | gfx.set(0) 134 | gfx.x=20 135 | gfx.y=gfx.h-80 136 | gfx.drawstr("Press F1 for help. \n\nParameter description: \n"..Helptexts[Index]) 137 | gfx.set(1) 138 | gfx.x=19 139 | gfx.y=gfx.h-81 140 | gfx.drawstr("Press F1 for help. \n\nParameter description: \n"..Helptexts[Index]) 141 | 142 | 143 | if A~=-1 then 144 | reaper.defer(main) 145 | end 146 | end 147 | 148 | 149 | A1=LoadImage() 150 | if A1==-1 then 151 | reaper.MB("Could not load image: Either no image or wrong extension", "Ooops", 0) 152 | else 153 | gfx.init("gfx.deltablit/gfx_deltablit-Viewer") 154 | main() 155 | DisplayHelp() 156 | end 157 | 158 | -------------------------------------------------------------------------------- /Tools/misc/HWND-Displayer.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mespotine/ultraschall-and-reaper-docs/c8b6843fd6325161d129d1b55c147f4194392bd4/Tools/misc/HWND-Displayer.gif -------------------------------------------------------------------------------- /Tools/readme.txt: -------------------------------------------------------------------------------- 1 | Developer-Tools for Reaper 2 | 3 | Written by Meo Mespotine (mespotine.de) for the Ultraschall.FM-project. 4 | licensed under creative-commons by-sa-nc-license 5 | 6 | -------------------------------------------------------------------------------- /Tools/ultraschall_Display-Altered-Config-Vars.lua: -------------------------------------------------------------------------------- 1 | -- written by Meo Mespotine mespotine.de 12th of September 2018 2 | -- for the ultraschall.fm-project 3 | 4 | -- requires Reaper 5.95 and SWS 2.9.7 5 | 6 | -- This script shows altered integer and double-float-settings for all config-variables available in Reaper, that can be used by 7 | -- the SWS-functions SNM_GetIntConfigVar(), SNM_SetIntConfigVar(), SNM_GetDoubleConfigVar() and SNM_SetDoubleConfigVar() 8 | -- where you pass the variable-name as parameter "varname". 9 | -- This script also shows bitwise-representation of the variable's-value, so you can work easily with bitfields. 10 | 11 | -- To use this script, just copy the variable-names from the following commentsection, which contains the available 12 | -- variables for Reaper 5.80 and start the script or click NO in the MessageBox after starting the script. 13 | 14 | -- Change settings in the preferences/project-settings/render-dialog-window to see, which variable 15 | -- contains which value for which setting. There are also some other Reaper-settings, that can be accessed 16 | -- that way. Just experiment and see, what you can change. The names of the variables are a hint to, what can be 17 | -- accessed. 18 | 19 | -- Feel free to document the variable-settings(some seem to be identically named, as settings in reaper.ini) ;) 20 | -- Keep in mind, some of the variables are bitmask-variables and contain the values for several 21 | -- checkboxes(e.g. in the preferences-dialog). 22 | 23 | -- IMPORTANT! This script has an issue with float-variables, when the float is set as an integer, it's changes will not be shown. 24 | -- For instance, when setting projmaxlen (maximum project-length) in Project Settings, it will not update, if you 25 | -- set the value to 1.000, but it will update it, when you set it to 1.001(triggering the float-section of the value). 26 | -- So when reverse-engineering floats, keep in mind to set the float-part of the value, or it will not show up! 27 | 28 | ultraschall={} 29 | function ultraschall.GetStringFromClipboard_SWS() 30 | -- gets a big string from clipboard, using the 31 | -- CF_GetClipboardBig-function from SWS 32 | -- and deals with all aspects necessary, that 33 | -- surround using it. 34 | local buf = reaper.CF_GetClipboard(buf) 35 | local WDL_FastString=reaper.SNM_CreateFastString("HudelDudel") 36 | local clipboardstring=reaper.CF_GetClipboardBig(WDL_FastString) 37 | reaper.SNM_DeleteFastString(WDL_FastString) 38 | return clipboardstring 39 | end 40 | 41 | L=reaper.MB("Read variable-names from clipboard?\n(Select No to use Reaper 5.95-variables(inclusive pre-release-only-ones).","Query",3) 42 | if L==6 then 43 | A=ultraschall.GetStringFromClipboard_SWS() 44 | elseif L==2 then return 45 | else 46 | A="__numcpu\nacidimport\nactionmenu\nadjreclat\nadjrecmanlat\nadjrecmanlatin\nafxcfg\nallstereopairs\naltpeaks\naltpeaksopathlist\naltpeakspath\nalwaysallowkb\naot\napplyfxtail\naudioasync\naudiocloseinactive\naudioclosestop\naudioprshift\naudiothreadpr\nautoclosetrackwnds\nautomute\n" 47 | A=A.."automuteflags\nautomuteval\nautonbworkerthreads\nautoreturntime\nautoreturntime_action\nautosaveint\nautosavemode\nautoxfade\nbigwndframes\ncopyimpmedia\ncpuallowed\ncsurfrate\nctrlcopyitem\ncueitems\ncustommenu\ndefautomode\ndefenvs\ndeffadelen\ndeffadeshape\ndefhwvol\ndefpitchcfg\n" 48 | A=A.."defrenderpath\ndefsavepath\ndefsendflag\ndefsendvol\ndefsplitxfadelen\ndeftrackrecflags\ndeftrackrecinput\ndeftrackvol\ndefvzoom\ndefxfadeshape\ndisabledxscan\ndisk_peakmmap2\ndisk_rdblksex\ndisk_rdmodeex\ndisk_rdsizeex\ndisk_wrblks\ndisk_wrblks2\ndisk_wrmode\ndisk_wrsize\ndiskcheck\n" 49 | A=A.."diskcheckmb\nedit_fontsize\nenv_autoadd\nenv_deffoc\nenv_ol_minh\nenv_options\nenv_reduce\nenvattach\nenvclicksegmode\nenvlanes\nenvtranstime\nenvtrimadjmode\nenvwritepasschg\nerrnowarn\nfadeeditflags\nfadeeditlink\nfadeeditpostsel\nfadeeditpresel\nfeedbackmode\nfullscreenrectb\nfullscreenrectl\n" 50 | A=A.."fullscreenrectr\nfullscreenrectt\nfxdenorm\nfxfloat_focus\nfxresize\ng_config_project\ng_markerlist_updcnt\ngriddot\ngridinbg\ngridinbg2\ngroupdispmode\nguidelines2\nhandzoom\nhelp\nhwfadex\nhwoutfx_bypass\nide_colors\ninsertmtrack\nisfullscreen\nitemclickmovecurs\nitemdblclk\nitemeditpr\n" 51 | A=A.."itemfade_minheight\nitemfade_minwidth\nitemfadehandle_maxwidth\nitemfxtail\nitemicons\nitemicons_minheight\nitemlabel_minheight\nitemlowerhalf_minheight\nitemmixflag\nitemprops\nitemprops_timemode\nitemsnap\nitemtexthide\nitemtimelock\nitemvolmode\nkbd_usealt\nlabelitems2\nlastthemefn5\nloadlastproj\n" 52 | A=A.."locklooptotime\nloop\nloopclickmode\nloopgran\nloopgranlen\nloopnewitems\nloopselpr\nloopstopfx\nmanuallat\nmanuallatin\nmastermutesolo\nmaxitemlanes\nmaxrecent\nmaxrecentfx\nmaxrecsize\nmaxrecsize_use\nmaxsnaptrack\nmaxspeakgain\nmetronome_defout\nmetronome_flags\nmiscopts\nmidiccdensity\nmididefcolormap\n" 53 | A=A.."midieditor\nmidiins\nmidiins_cs\nmidioctoffs\nmidiouts\nmidiouts_clock\nmidiouts_clock_nospp\nmidiouts_llmode\nmidioutthread\nmidisendflags\nmiditicksperbeat\nmidivu\nmixerflag\nmixeruiflag\nmixrowflags\nmousemovemod\nmousewheelmode\nmultiprojopt\nmultitouch\nmultitouch_ignore_ms\nmultitouch_ignorewheel_ms\n" 54 | A=A.."multitouch_rotate_gear\nmultitouch_swipe_gear\nmultitouch_zoom_gear\nmutefadems10\nmvu_rmsgain\nmvu_rmsmode\nmvu_rmsoffs2\nmvu_rmsred\nmvu_rmssize\nnativedrawtext\nnewfnopt\nnewprojdo\nnewtflag\nnometers\nnorunmute\nofflineinact\nopencopyprompt\nopennotes\noptimizesilence\npandispmode\npanlaw\npanmode\n" 55 | A=A.."peakcachegenmode\npeakcachegenrs\npeakrecbm\npeaksedges\npitchenvrange\nplaycursormode\nplayrate\nplayresamplemode\npmfol\npooledenvattach\npooledenvs\nprebufperb\npreroll\nprerollmeas\nprojalignbeatsrate\nprojbpm\nprojfrbase\nprojfrdrop\nprojgriddiv\nprojgriddivsnap\nprojgridframe\nprojgridmin\nprojgridsnapmin\n" 56 | A=A.."projgridswing\nprojgroupover\nprojgroupsel\nprojintmix\nprojmasternch\nprojmastervuflags\nprojmaxlen\nprojmaxlenuse\nprojmeaslen\nprojmeasoffs\nprojmeasoffsruler\nprojmetrobeatlen\nprojmetrocountin\nprojmetroen\nprojmetrof1\nprojmetrof2\nprojmetrov1\nprojmetrov2\nprojmidieditor\nprojpeaksgain\nprojrecforopencopy\n" 57 | A=A.."projrecmode\nprojrelpath\nprojrenderaddtoproj\nprojrenderdither\nprojrenderlimit\nprojrendernch\nprojrenderqdelay\nprojrenderrateinternal\nprojrenderresample\nprojrendersrate\nprojrenderstems\nprojripedit\nprojsellock\nprojshowgrid\nprojsmpteahead\nprojsmptefw_rec\nprojsmpteinput\nprojsmptemaxfree\nprojsmpteoffs\n" 58 | A=A.."projsmpterate\nprojsmpterateuseproj\nprojsmpteresync\nprojsmpteresync_rec\nprojsmpteskip\nprojsmptesync\nprojsrate\nprojsrateuse\nprojtakelane\nprojtimemode\nprojtimemode2\nprojtimeoffs\nprojtrackgroupdisabled\nprojtsdenom\nprojvidflags\nprojvidh\nprojvidw\npromptendrec\npsmaxv\npsminv\nquantflag\nquantolms\n" 59 | A=A.."quantolms2\nquantsize2\nrbn\nreamote_maxblock\nreamote_maxlat_render\nreamote_maxpkt\nreamote_smplfmt\nreascript\nreascripttimeout\nrecaddatloop\nreccfg\nrecfile_wildcards\nrecopts\nrecupdatems\nrelativeedges\nrelsnap\nrenderaheadlen\nrenderaheadlen2\nrenderbsnew\nrendercfg\nrenderclosewhendone\nrenderqdelay\n" 60 | A=A.."rendertail\nrendertaillen\nrendertails\nresetvuplay\nrestrictcpu\nrewireslave\nrewireslavedelay\nreximport\nrfprojfirst\nrightclickemulate\nripplelockmode\nrulerlayout\nrunafterstop\nrunallonstop\nsampleedges\nsaveopts\nsaveundostatesproj\nscnameedit\nscnotes\nscoreminnotelen\nscorequant\nscreenset_as_views\n" 61 | A=A.."screenset_as_win\nscreenset_autosave\nscrubloopend\nscrubloopstart\nscrubmode\nscrubrelgain\nseekmodes\nselitem_tintalpha\nselitemtop\nshowctinmix\nshowlastundo\nshowmaintrack\nshowpeaks\nshowpeaksbuild\nshowrecitems\nslidermaxv\nsliderminv\nslidershex\nsmoothseek\nsmoothseekmeas\nsnapextrad\nsnapextraden\n" 62 | A=A.."solodimdb10\nsolodimen\nsoloip\nspecpeak_alpha\nspecpeak_bv\nspecpeak_ftp\nspecpeak_hueh\nspecpeak_huel\nspecpeak_lo\nspecpeak_na\nsplitautoxfade\nstopendofloop\nstopprojlen\nsyncsmpmax2\nsyncsmpuse\ntabtotransflag\ntakelanes\ntcpalign\ntemplateditcursor\ntempoenvmax\ntempoenvmin\ntempoenvtimelock\ntextflags\n" 63 | A=A.."threadpr\ntimeseledge\ntinttcp\ntitlebarreghide\ntooltipdelay\ntooltips\ntrackitemgap\ntrackselonmouse\ntransflags\ntransientsensitivity\ntransientthreshold\ntrimmidionsplit\ntsmarker\nundomask\nundomaxmem\nunselitem_tintalpha\nuse_reamote\nusedxplugs\nuseinnc\nuserewire\nverchk\nvgrid\nvideo_colorspace\n" 64 | A=A.."video_decprio\nvideo_delayms\nviewadvance\nvolenvrange\nvstbr64\nvstfolder_settings\nvstfullstate\nvuclipstick\nvudecay\nvumaxvol\nvuminvol\nvuupdfreq\nvzoom2\nvzoommode\nwarnmaxram64\nworkbehvr\nworkbuffxuims\nworkbufmsex\nworkrender\nworkset_max\nworkset_min\nworkset_use\nworkthreads\nzoom\nzoommode\n" 65 | A=A.."zoomshowarm\nasio_bsize\nccresettab\ndefrecpath\nlazyupds\nmidiedit\nmidilatmask\nprojmetrofn1\nprojmetrofn2\nprojmetropattern\nprojrelsnap\nreuseeditor\nrulerlabelmargin\n" 66 | 67 | -- pre-release-config-vars only 68 | A=A.."\nara\nbouncecfg\ndefstretchmode\nuiscale\nwiring_options\n" 69 | end 70 | 71 | 72 | -- prepare all entries and read their current values 73 | 74 | -- Keep in mind, you must have all config-variable-names in the clipboard to execute 75 | -- the script successfully. You can find a list for Reaper 5.80 to copy'n'paste in the 76 | -- comment-section at the beginning of this script. 77 | -- Every variable-name must be in it's own line without trailing or preceding whitespaces or tabs! 78 | vars={} -- variable-values 79 | vars2={} -- variable-names 80 | counter=0 81 | i=1 -- number of variables(for later use) 82 | for line in A:gmatch("(.-)\n") do 83 | if vars[line]==nil then counter=counter+1 end 84 | vars[line]=reaper.SNM_GetDoubleConfigVar(line,-8) 85 | i=i+1 86 | vars2[i]=line 87 | end 88 | 89 | count=1 90 | Lotto=1 91 | 92 | -- Let's do the magic 93 | function main() 94 | Lotto=Lotto+1 95 | if Lotto==15 then Lotto=1 96 | -- update only every 15th cycle, to save ressources. 97 | for a=1, i do 98 | line=vars2[a] 99 | 100 | -- go through all variables and see, if their values have changed since last defer-run 101 | -- if they've changed, display them and update the value stored in the table vars 102 | if reaper.SNM_GetIntConfigVar(line,-8)==vars[line] then--and reaper.SNM_GetDoubleConfigVar(line,-7)==vars[line] then 103 | elseif line~=nil then 104 | vars[line]=reaper.SNM_GetIntConfigVar(line,-8) -- update value 105 | varsB=reaper.SNM_GetDoubleConfigVar(line,-8) 106 | if reaper.get_config_var_string~=nil then hui, varsString=reaper.get_config_var_string(line) varsString="string: "..varsString.."\n" else varsString="string: string-variables not available in this Reaper-version, sorry.\n" end 107 | if line~=nil and line~="" and count==3 then reaper.ShowConsoleMsg("\n"..line.." : \n int:"..vars[line].."\n double:"..varsB.."\n "..varsString) end -- show varname and value 108 | a1=vars[line]&1 if a1~=0 then a1=1 end 109 | a2=vars[line]&2 if a2~=0 then a2=1 end 110 | a3=vars[line]&4 if a3~=0 then a3=1 end 111 | a4=vars[line]&8 if a4~=0 then a4=1 end 112 | a5=vars[line]&16 if a5~=0 then a5=1 end 113 | a6=vars[line]&32 if a6~=0 then a6=1 end 114 | a7=vars[line]&64 if a7~=0 then a7=1 end 115 | a8=vars[line]&128 if a8~=0 then a8=1 end 116 | 117 | a9=vars[line]&256 if a9~=0 then a9=1 end 118 | a10=vars[line]&512 if a10~=0 then a10=1 end 119 | a11=vars[line]&1024 if a11~=0 then a11=1 end 120 | a12=vars[line]&2048 if a12~=0 then a12=1 end 121 | a13=vars[line]&4096 if a13~=0 then a13=1 end 122 | a14=vars[line]&8192 if a14~=0 then a14=1 end 123 | a15=vars[line]&16384 if a15~=0 then a15=1 end 124 | a16=vars[line]&32768 if a16~=0 then a16=1 end 125 | 126 | a17=vars[line]&65536 if a17~=0 then a17=1 end 127 | a18=vars[line]&131072 if a18~=0 then a18=1 end 128 | a19=vars[line]&262144 if a19~=0 then a19=1 end 129 | a20=vars[line]&524288 if a20~=0 then a20=1 end 130 | a21=vars[line]&1048576 if a21~=0 then a21=1 end 131 | a22=vars[line]&2097152 if a22~=0 then a22=1 end 132 | a23=vars[line]&4194304 if a23~=0 then a23=1 end 133 | a24=vars[line]&8388608 if a24~=0 then a24=1 end 134 | 135 | a25=vars[line]&16777216 if a25~=0 then a25=1 end 136 | a26=vars[line]&33554432 if a26~=0 then a26=1 end 137 | a27=vars[line]&67108864 if a27~=0 then a27=1 end 138 | a28=vars[line]&134217728 if a28~=0 then a28=1 end 139 | a29=vars[line]&268435456 if a29~=0 then a29=1 end 140 | a30=vars[line]&536870912 if a30~=0 then a30=1 end 141 | a31=vars[line]&1073741824 if a31~=0 then a31=1 end 142 | a32=vars[line]&2147483648 if a32~=0 then a32=1 end 143 | 144 | if count==3 then 145 | reaper.ShowConsoleMsg(" Bitfield, with &1 at start: "..a1.." "..a2.." "..a3.." "..a4..":"..a5.." "..a6.." "..a7.." "..a8.." - "..a9.." "..a10.." "..a11.." "..a12..":"..a13.." "..a14.." "..a15.." "..a16.." - "..a17.." "..a18.." "..a19.." "..a20..":"..a21.." "..a22.." "..a23.." "..a24.." - "..a25.." "..a26.." "..a27.." "..a28..":"..a29.." "..a30.." "..a31.." "..a32.."\n") 146 | Lr,LLr=reaper.BR_Win32_GetPrivateProfileString("REAPER", line,"nothingfound",reaper.get_ini_file()) 147 | if LLR~="nothingfound" then reaper.ShowConsoleMsg(" Entry in the reaper.ini: [REAPER] -> "..line.." - Currently-set-ini-value: "..LLr.."\n") end 148 | end 149 | end 150 | end 151 | if count~=3 then count=2 end 152 | -- after the first run, show an introduction to the script 153 | if count==2 then 154 | reaper.ClearConsole() 155 | reaper.ShowConsoleMsg("Reaper-Config-Variable-Inspector by Meo Mespotine(mespotine.de) 18.5.2018 for Ultraschall.fm\n\n This shows all altered Config-Variables and their bitwise-representation as well as the value in the reaper.ini,\n that can be accessed at runtime through LUA using the SWS-functions: \n SNM_GetIntConfigVar(), SNM_SetIntConfigVar(), SNM_GetDoubleConfigVar() and SNM_SetDoubleConfigVar(). \n\n These variables cover the preferences window, project-settings, render-dialog, settings in the context-menu of \n transportarea and numerous other things.\n\n Just change some settings in the preferences and click apply to see, which variable is changed to which value, \n shown in this Reascript-Console.\n\n Keep in mind: certain variables use bit-wise-values, which means, that one variable may contain the settings for \n numerous checkboxes; stored using a bitmask, which will be shown in here as well.\n\n") 156 | reaper.ShowConsoleMsg(" Mismatch between int/double-values the currently set reaper.ini-value(as well as only int/double changing) is a hint at,\n that the value is not stored into reaper.ini.\n\n") 157 | reaper.ShowConsoleMsg("IMPORTANT! This script has an issue with float-variables, when the float is set as an integer, it's changes will not be shown.\n For instance, when setting projmaxlen (maximum project-length) in Project Settings, it will not update, if you \n set the value to 1.000, but it will update it, when you set it to 1.001(triggering the float-section of the value).\n So when reverse-engineering floats, keep in mind to set the float-part of the value, or it will not show up!\n Sorry for that...\n") count=3 158 | end 159 | end 160 | reaper.defer(main) 161 | end 162 | 163 | main() -- kick it off 164 | 165 | 166 | -------------------------------------------------------------------------------- /Tools/ultraschall_Display-Altered-ConfigFile-Entries.lua: -------------------------------------------------------------------------------- 1 | files={} 2 | files[1]=reaper.get_ini_file() 3 | files[2]=reaper.GetResourcePath().."//reaper-midihw.ini" 4 | files[3]=reaper.GetResourcePath().."/reaper-extstate.ini" 5 | files[4]=reaper.GetResourcePath().."/reaper-dxplugins64.ini" 6 | files[5]=reaper.GetResourcePath().."/reaper-reginfo2.ini" 7 | files[6]=reaper.GetResourcePath().."/BR.ini" 8 | files[7]=reaper.GetResourcePath().."/S&M.ini" 9 | files[8]=reaper.GetResourcePath().."/sws-autocoloricon.ini" 10 | files[9]=reaper.GetResourcePath().."/reaper-recentfx.ini" 11 | files[10]=reaper.GetResourcePath().."/reaper-menu.ini" 12 | files[11]=reaper.GetResourcePath().."/reaper-mouse.ini" 13 | files[12]=reaper.GetResourcePath().."/reaper-install.ini" 14 | files[13]=reaper.GetResourcePath().."/reaper-vstplugins64.ini" 15 | files[14]=reaper.GetResourcePath().."/reaper-fxtags.ini" 16 | files[15]=reaper.GetResourcePath().."/reaper-fxoptions.ini" 17 | files[16]=reaper.GetResourcePath().."/Xenakios_Commands.ini" 18 | files[17]=reaper.GetResourcePath().."/S&M_Cyclactions.ini" 19 | files[18]=reaper.GetResourcePath().."/reaninjam.ini" 20 | files[19]=reaper.GetResourcePath().."/reaper-auplugins64.ini" 21 | files[20]=reaper.GetResourcePath().."/S&M_Cyclactions.ini" 22 | files[21]=reaper.GetResourcePath().."/reaper-defpresets.ini" 23 | files[22]=reaper.GetResourcePath().."/reaper-fxfolders.ini" 24 | files[23]=reaper.GetResourcePath().."/reaper-screensets.ini" 25 | files[24]=reaper.GetResourcePath().."/reaper-joystick.ini" 26 | files[25]=reaper.GetResourcePath().."/reaper-pinstates.ini" 27 | files[26]=reaper.GetResourcePath().."/S&M_Cyclactions.ini" 28 | --files[27]=reaper.GetResourcePath().."/ultraschall.ini" 29 | --]] 30 | 31 | maximumpowercounter=30 32 | 33 | ultraschall={} 34 | 35 | function ultraschall.ReadFullFile(filename_with_path, binary) 36 | -- Returns the whole file filename_with_path or nil in case of error 37 | 38 | -- check parameters 39 | if filename_with_path == nil then ultraschall.AddErrorMessage("ReadFullFile", "filename_with_path", "must be a string", -1) return nil end 40 | if reaper.file_exists(filename_with_path)==false then return nil end 41 | 42 | -- prepare variables 43 | if binary==true then binary="b" else binary="" end 44 | local linenumber=0 45 | 46 | -- read file 47 | local file=io.open(filename_with_path,"r"..binary) 48 | local filecontent=file:read("a") 49 | 50 | -- count lines in file, when non binary 51 | if binary~=true then 52 | for w in string.gmatch(filecontent, "\n") do 53 | linenumber=linenumber+1 54 | end 55 | else 56 | linenumber=-1 57 | end 58 | file:close() 59 | -- return read file, length and linenumbers 60 | return filecontent, filecontent:len(), linenumber 61 | end 62 | 63 | vartable={} 64 | --vartable 65 | reaper_ini="" 66 | 67 | counter2=1 68 | while files[counter2]~=nil do 69 | file=ultraschall.ReadFullFile(files[counter2],false) 70 | if file~=nil then reaper_ini=reaper_ini..files[counter2].."\n"..file end 71 | counter2=counter2+1 72 | end 73 | 74 | 75 | counter=1 76 | 77 | for line in reaper_ini:gmatch("(.-)%c") do 78 | if line:match("%[.-%]")==nil and line:match("=")==nil and line~="" then FILE=line end 79 | if line:match("%[.-%]") then SECTION=line:match("%[(.-)%]") end 80 | if line:match(".-=.*") then 81 | Key=line:match("(.-)=") 82 | Value=line:match("=(.*)") 83 | vartable[FILE..SECTION..Key]=Value 84 | counter=counter+1 85 | end 86 | end 87 | 88 | savepowercounter=1 89 | 90 | function main() 91 | if savepowercounter>maximumpowercounter then 92 | savepowercounter=1 93 | counter2=1 94 | reaper_ini="" 95 | while files[counter2]~=nil do 96 | file=ultraschall.ReadFullFile(files[counter2],false) 97 | if file~=nil then reaper_ini=reaper_ini..files[counter2].."\n"..file end 98 | counter2=counter2+1 99 | end 100 | for line in reaper_ini:gmatch("(.-)%c") do 101 | if line:match("%[")==nil and line:match("=")==nil and line~="" then FILE=line end 102 | -- if line:match("%[.-%)%)") then FILE=line:match("%[(.-)%)%)") end 103 | if line:match("%[.-%]") then SECTION=line:match("%[(.-)%]") end 104 | if line:match(".-=.*") then 105 | Key=line:match("(.-)=") 106 | Value=line:match("=(.*)") 107 | 108 | if vartable[FILE..SECTION..Key]~=line:match(".-=(.*)") then 109 | reaper.ShowConsoleMsg(FILE.."->["..SECTION.."] -> "..Key.." = "..tostring(vartable[FILE..SECTION..Key]).."\n") 110 | T=true 111 | vartable[FILE..SECTION..Key]=Value 112 | end 113 | end 114 | end 115 | end 116 | if T==true then T=false reaper.ShowConsoleMsg("\n") end 117 | savepowercounter=savepowercounter+1 118 | reaper.defer(main) 119 | end 120 | 121 | main() 122 | -------------------------------------------------------------------------------- /Tools/ultraschall_Find_Valid_ConfigVariables_In_String.lua: -------------------------------------------------------------------------------- 1 | -- Meo Mespotine (mespotine.de) 15.5.2018 for the ultraschall.fm-project 2 | 3 | -- the following code can be used to check, which strings within Reaper are 4 | -- valid config-variables that can be used by the SWS-functions 5 | -- SNM_GetIntConfigVar(), SNM_SetIntConfigVar(), SNM_GetDoubleConfigVar() and SNM_SetDoubleConfigVar() 6 | -- where you pass the variable-name as parameter "varname". 7 | -- This script expects a string with all entries to check for, each separated by a newline, with no trailing or 8 | -- preceding spaces, as otherwise the variable might be fail-checked. 9 | 10 | -- To get a list to check, use Microsoft Process Explorer, start Reaper, rightlick on it and click on Properties. 11 | -- The tab "Strings" contains all strings within Reaper. Click "Memory" and "Save" to save them into a textfile. 12 | -- Open the text-file, copy all(!) entries into clipboard and run this commented code. 13 | -- After execution, it will put all found strings, that are valid config-variables into the clipboard. 14 | -- 15 | -- keep in mind: some config-variables are duplicate, often in different camel-cases, some may not be found 16 | -- by this code (rendercfg seems to be problematic candidate) 17 | -- but at least, it's a start. 18 | 19 | -- Oh, and if you want to parse your own reaper.ini(whose entries seem to be a valuable source for variable-names), 20 | -- decomment the first line in the for statement! 21 | 22 | -- the variable int_line contains all valid variables, each separated by a \n 23 | -- the variable rest_line contains all strings, that weren't valid variables(where the check failed), 24 | -- each separated by a \n 25 | 26 | ultraschall={} 27 | function ultraschall.GetStringFromClipboard_SWS() 28 | -- gets a big string from clipboard, using the 29 | -- CF_GetClipboardBig-function from SWS 30 | -- and deals with all aspects necessary, that 31 | -- surround using it. 32 | local buf = reaper.CF_GetClipboard(buf) 33 | local WDL_FastString=reaper.SNM_CreateFastString("HudelDudel") 34 | local clipboardstring=reaper.CF_GetClipboardBig(WDL_FastString) 35 | reaper.SNM_DeleteFastString(WDL_FastString) 36 | return clipboardstring 37 | end 38 | 39 | 40 | A=ultraschall.GetStringFromClipboard_SWS() 41 | 42 | A=A.."\n" 43 | int_line="" -- found valid variables 44 | rest_line="" -- strings, where the check failed 45 | LL=0 46 | 47 | for line in A:gmatch("(.-)%c") do 48 | --line=tostring(line:match("(.-)=")) --uncomment, if you want to parse a reaper.ini 49 | L=reaper.SNM_GetDoubleConfigVar(line, -1) 50 | L2=reaper.SNM_GetDoubleConfigVar(line, -2) 51 | if (L~=-1 or L2~=-2) then if line~="nil" then int_line=int_line..line.."\n" LL=LL+1 end else rest_line=rest_line..line.."\n" end 52 | end 53 | 54 | 55 | if int_line=="" then reaper.MB("nothing found","",0) 56 | else reaper.CF_SetClipboard(int_line) end 57 | 58 | -------------------------------------------------------------------------------- /Tools/ultraschall_findConfigVarsToggledByActions.lua: -------------------------------------------------------------------------------- 1 | dofile(reaper.GetResourcePath().."/UserPlugins/ultraschall_api.lua") 2 | 3 | A="__numcpu\nacidimport\nactionmenu\nadjreclat\nadjrecmanlat\nadjrecmanlatin\nallstereopairs\naltpeaks\naltpeaksopathlist\naltpeakspath\nalwaysallowkb\naot\napplyfxtail\nasio_bsize\naudioasync\naudiocloseinactive\naudioclosestop\naudioprshift\naudiothreadpr\nautoclosetrackwnds\nautomute\nautomuteflags\nautomuteval\nautonbworkerthreads\nautoreturntime\nautoreturntime_action\nautosaveint\nautosavemode\nautoxfade\ncopyimpmedia\ncpuallowed\ncsurfrate\nctrlcopyitem\ncueitems\ncustommenu\ndefautomode\ndefenvs\ndeffadelen\ndeffadeshape\ndefhwvol\ndefpitchcfg\ndefrenderpath\ndefsavepath\ndefsendflag\ndefsendvol\ndefsplitxfadelen\ndeftrackrecflags\ndeftrackrecinput\ndeftrackvol\ndefvzoom\ndefxfadeshape\ndisabledxscan\ndisk_peakmmap2\ndisk_rdmodeex\ndisk_rdsizeex\ndisk_wrblks" 4 | A=A.."\ndisk_wrblks2\ndisk_wrmode\ndisk_wrsize\ndiskcheck\ndiskcheckmb\nedit_fontsize\nenv_autoadd\nenv_deffoc\nenv_ol_minh\nenv_options\nenv_reduce\nenvattach\nenvclicksegmode\nenvlanes\nenvtranstime\nenvtrimadjmode\nenvwritepasschg\nerrnowarn\nfadeeditflags\nfadeeditlink\nfadeeditpostsel\nfadeeditpresel\nfeedbackmode\nfullscreenRectB\nfullscreenRectL\nfullscreenRectR\nfullscreenRectT\nfxdenorm\nfxfloat_focus\nfxresize\ng_config_project\ng_markerlist_updcnt\ngriddot\ngridinbg\ngridinbg2\ngroupdispmode\nguidelines2\nhandzoom\nhelp\nhwfadex\nhwoutfx_bypass\nide_colors\ninsertmtrack\nisFullscreen\nitemclickmovecurs\nitemdblclk\nitemeditpr\nitemfade_minheight\nitemfade_minwidth\nitemfadehandle_maxwidth\nitemfxtail\nitemicons\nitemicons_minheight\nitemlabel_minheight\nitemlowerhalf_minheight" 5 | A=A.."\nitemmixflag\nitemprops\nitemprops_timemode\nitemsnap\nitemtexthide\nitemtimelock\nitemvolmode\nkbd_usealt\nlabelitems2\nlastthemefn5\nloadlastproj\nlocklooptotime\nloop\nloopclickmode\nloopgran\nloopgranlen\nloopnewitems\nloopselpr\nloopstopfx\nmanuallat\nmanuallatin\nmastermutesolo\nmaxitemlanes\nmaxrecent\nmaxrecentfx\nmaxrecsize\nmaxrecsize_use\nmaxsnaptrack\nmaxspeakgain\nmetronome_defout\nmetronome_flags\nmidiccdensity\nmididefcolormap\nmidieditor\nmidiins\nmidiins_cs\nmidioctoffs\nmidiouts\nmidiouts_clock\nmidiouts_clock_nospp\nmidiouts_llmode\nmidioutthread\nmidisendflags\nmiditicksperbeat\nmidivu\nmixerflag\nmixeruiflag\nmixrowflags\nmousemovemod\nmousewheelmode\nmultiprojopt\nmultitouch\nmultitouch_ignore_ms\nmultitouch_ignorewheel_ms\nmultitouch_rotate_gear" 6 | A=A.."\nmultitouch_swipe_gear\nmultitouch_zoom_gear\nmutefadems10\nmvu_rmsgain\nmvu_rmsmode\nmvu_rmsoffs2\nmvu_rmsred\nmvu_rmssize\nnativedrawtext\nnewfnopt\nnewprojdo\nnewtflag\nnometers\nnorunmute\nofflineinact\nopencopyprompt\nopennotes\noptimizesilence\npandispmode\npanlaw\npanmode\npeakcachegenmode\npeakcachegenrs\npeakrecbm\npeaksedges\npitchenvrange\nplaycursormode\nplayrate\nplayresamplemode\npmfol\npooledenvattach\npooledenvs\nprebufperb\npreroll\nprerollmeas\nprojalignbeatsrate\nprojbpm\nprojfrbase\nprojfrdrop\nprojgriddiv\nprojgriddivsnap\nprojgridframe\nprojgridmin\nprojgridsnapmin\nprojgridswing\nprojgroupover\nprojgroupsel\nprojintmix\nprojmasternch\nprojmastervuflags\nprojmaxlen\nprojmaxlenuse\nprojmeaslen\nprojmeasoffs\nprojmetrobeatlen\nprojmetrocountin" 7 | A=A.."\nprojmetroen\nprojmetrof1\nprojmetrof2\nprojmetrov1\nprojmetrov2\nprojmidieditor\nprojpeaksgain\nprojrecforopencopy\nprojrecmode\nprojrelpath\nprojrenderaddtoproj\nprojrenderdither\nprojrenderlimit\nprojrendernch\nprojrenderqdelay\nprojrenderrateinternal\nprojrenderresample\nprojrendersrate\nprojrenderstems\nprojripedit\nprojsellock\nprojshowgrid\nprojsmpteahead\nprojsmptefw_rec\nprojsmpteinput\nprojsmptemaxfree\nprojsmpteoffs\nprojsmpterate\nprojsmpterateuseproj\nprojsmpteresync\nprojsmpteresync_rec\nprojsmpteskip\nprojsmptesync\nprojsrate\nprojsrateuse\nprojtakelane\nprojtimemode\nprojtimemode2\nprojtimeoffs\nprojtrackgroupdisabled\nprojtsdenom\nprojvidflags\nprojvidh\nprojvidw\npromptendrec\npsmaxv\npsminv\nquantflag\nquantolms\nquantolms2\nquantsize2\nrbn" 8 | A=A.."\nreamote_maxblock\nreamote_maxlat_render\nreamote_maxpkt\nreamote_smplfmt\nreascript\nreascripttimeout\nrecaddatloop\nrecfile_wildcards\nrecopts\nrecupdatems\nrelativeedges\nrelsnap\nrenderaheadlen\nrenderaheadlen2\nrenderbsnew\nrendercfg\nrenderclosewhendone\nrenderqdelay\nrendertail\nrendertaillen\nrendertails\nresetvuplay\nrestrictcpu\nrewireslave\nrewireslavedelay\nreximport\nrfprojfirst\nrightclickemulate\nripplelockmode\nrulerlayout\nrunafterstop\nrunallonstop\nsampleedges\nsaveopts\nsaveundostatesproj\nscnameedit\nscnotes\nscoreminnotelen\nscorequant\nscreenset_as_views\nscreenset_as_win\nscreenset_autosave\nscrubloopend\nscrubloopstart\nscrubmode\nscrubrelgain\nseekmodes\nselitem_tintalpha\nselitemtop\nshowctinmix\nshowlastundo\nshowmaintrack\nshowpeaks" 9 | A=A.."\nshowpeaksbuild\nshowrecitems\nslidermaxv\nsliderminv\nslidershex\nsmoothseek\nsmoothseekmeas\nsnapextrad\nsnapextraden\nsolodimdb10\nsolodimen\nsoloip\nspecpeak_alpha\nspecpeak_bv\nspecpeak_ftp\nspecpeak_hueh\nspecpeak_huel\nspecpeak_lo\nspecpeak_na\nsplitautoxfade\nstopendofloop\nstopprojlen\nsyncsmpmax2\nsyncsmpuse\ntabtotransflag\ntakelanes\ntcpalign\ntemplateditcursor\ntempoenvmax\ntempoenvmin\ntempoenvtimelock\ntextflags\nthreadpr\ntimeseledge\ntinttcp\ntitlebarreghide\ntooltipdelay\ntooltips\ntrackitemgap\ntrackselonmouse\ntransflags\ntransientsensitivity\ntransientthreshold\ntrimmidionsplit\ntsmarker\nundomask\nundomaxmem\nunselitem_tintalpha\nuse_reamote\nusedxplugs\nuseinnc\nuserewire\nverchk\nvgrid\nvideo_colorspace\nvideo_decprio\nvideo_delayms\nviewadvance" 10 | A=A.."\nvolenvrange\nvstbr64\nvstfolder_settings\nvstfullstate\nvuclipstick\nvudecay\nvumaxvol\nvuminvol\nvuupdfreq\nvzoom2\nvzoommode\nwarnmaxram64\nworkbehvr\nworkbuffxuims\nworkbufmsex\nworkrender\nworkset_max\nworkset_min\nworkset_use\nworkthreads\nzoom\nzoommode\nzoomshowarm" 11 | 12 | -- these are rumored to work, but I couldn't verify them. I include them anyway, just in case 13 | A=A.."\nafxcfg\nbigwndframes\nccresettab\ndefrecpath\nlazyupds\nmidiedit\nmidilatmask\nprojmetrofn1\nprojmetrofn2\nprojmetropattern\nprojrelsnap\nreccfg\nreuseeditor\nrulerlabelmargin\nvstbr32" 14 | A=A.."\nhidpi_win32" 15 | 16 | vars={} -- variable-values 17 | vars2={} -- variable-names 18 | counter=0 19 | i=1 -- number of variables(for later use) 20 | for line in A:gmatch("(.-)\n") do 21 | if vars[line]==nil then counter=counter+1 end 22 | reaper.SNM_SetIntConfigVar(line,reaper.SNM_GetIntConfigVar(line,-8)+2) 23 | vars[line]=reaper.SNM_GetIntConfigVar(line,-8) 24 | i=i+1 25 | vars2[i]=line 26 | end 27 | 28 | --I=53997 29 | --I=55470 30 | I=-1 31 | --I=26752 32 | K=0 33 | a=0 --a=2 34 | AnzahlToggleActions=0 35 | CommandName="" 36 | O=0 37 | Lotto=0 38 | count=1 39 | -- Options: Add edge points when ripple editing or inserting time 40 | 41 | function checkchanges(SECTION, AID) 42 | for a=1, i do 43 | line=vars2[a] 44 | 45 | -- go through all variables and see, if their values have changed since last defer-run 46 | -- if they've changed, display them and update the value stored in the table vars 47 | if reaper.SNM_GetIntConfigVar(line,-8)==vars[line] then--and reaper.SNM_GetDoubleConfigVar(line,-7)==vars[line] then 48 | elseif line~=nil then 49 | vars[line]=reaper.SNM_GetIntConfigVar(line,-8) -- update value 50 | varsB=reaper.SNM_GetDoubleConfigVar(line,-8) 51 | _t,varsC=reaper.get_config_var_string(line) 52 | if line~=nil and line~="" then reaper.ShowConsoleMsg("\n"..line.."\n int: "..vars[line].."\n double: "..varsB.."\n string: "..varsC.."\n") end -- show varname and value 53 | a1=vars[line]&1 if a1~=0 then a1=1 end 54 | a2=vars[line]&2 if a2~=0 then a2=1 end 55 | a3=vars[line]&4 if a3~=0 then a3=1 end 56 | a4=vars[line]&8 if a4~=0 then a4=1 end 57 | a5=vars[line]&16 if a5~=0 then a5=1 end 58 | a6=vars[line]&32 if a6~=0 then a6=1 end 59 | a7=vars[line]&64 if a7~=0 then a7=1 end 60 | a8=vars[line]&128 if a8~=0 then a8=1 end 61 | 62 | a9=vars[line]&256 if a9~=0 then a9=1 end 63 | a10=vars[line]&512 if a10~=0 then a10=1 end 64 | a11=vars[line]&1024 if a11~=0 then a11=1 end 65 | a12=vars[line]&2048 if a12~=0 then a12=1 end 66 | a13=vars[line]&4096 if a13~=0 then a13=1 end 67 | a14=vars[line]&8192 if a14~=0 then a14=1 end 68 | a15=vars[line]&16384 if a15~=0 then a15=1 end 69 | a16=vars[line]&32768 if a16~=0 then a16=1 end 70 | 71 | a17=vars[line]&65536 if a17~=0 then a17=1 end 72 | a18=vars[line]&131072 if a18~=0 then a18=1 end 73 | a19=vars[line]&262144 if a19~=0 then a19=1 end 74 | a20=vars[line]&524288 if a20~=0 then a20=1 end 75 | a21=vars[line]&1048576 if a21~=0 then a21=1 end 76 | a22=vars[line]&2097152 if a22~=0 then a22=1 end 77 | a23=vars[line]&4194304 if a23~=0 then a23=1 end 78 | a24=vars[line]&8388608 if a24~=0 then a24=1 end 79 | 80 | a25=vars[line]&16777216 if a25~=0 then a25=1 end 81 | a26=vars[line]&33554432 if a26~=0 then a26=1 end 82 | a27=vars[line]&67108864 if a27~=0 then a27=1 end 83 | a28=vars[line]&134217728 if a28~=0 then a28=1 end 84 | a29=vars[line]&268435456 if a29~=0 then a29=1 end 85 | a30=vars[line]&536870912 if a30~=0 then a30=1 end 86 | a31=vars[line]&1073741824 if a31~=0 then a31=1 end 87 | a32=vars[line]&2147483648 if a32~=0 then a32=1 end 88 | 89 | 90 | A=reaper.GetExtState("hack","count") 91 | A=A:match("(.-)_AID").." ("..sect..")"..A:match("(_AID.*)") 92 | reaper.ShowConsoleMsg(A.." Bitfield, with &1 at start: "..a1.." "..a2.." "..a3.." "..a4..":"..a5.." "..a6.." "..a7.." "..a8.." - "..a9.." "..a10.." "..a11.." "..a12..":"..a13.." "..a14.." "..a15.." "..a16.." - "..a17.." "..a18.." "..a19.." "..a20..":"..a21.." "..a22.." "..a23.." "..a24.." - "..a25.." "..a26.." "..a27.." "..a28..":"..a29.." "..a30.." "..a31.." "..a32.."\n") 93 | Lr,LLr=reaper.BR_Win32_GetPrivateProfileString("REAPER", line,"nothingfound",reaper.get_ini_file()) 94 | if LLR~="nothingfound" then reaper.ShowConsoleMsg(" Entry in the reaper.ini: [REAPER] -> "..line.." - Currently-set-ini-value: "..LLr.."\n") end 95 | reaper.ShowConsoleMsg("At Action:"..I.."\n") 96 | KKKK=ultraschall.WriteValueToFile("c:\\ShowVars_Toggle-5_90pre2.txt", A.."="..line.." \t - INT: "..(vars[line]).." - DOUBLE: "..(varsB).." - STRING: \""..varsC.."\"\tBitfield, with &1 at start: "..a1.." "..a2.." "..a3.." "..a4..":"..a5.." "..a6.." "..a7.." "..a8.." - "..a9.." "..a10.." "..a11.." "..a12..":"..a13.." "..a14.." "..a15.." "..a16.." - "..a17.." "..a18.." "..a19.." "..a20..":"..a21.." "..a22.." "..a23.." "..a24.." - "..a25.." "..a26.." "..a27.." "..a28..":"..a29.." "..a30.." "..a31.." "..a32.."\n", false, true) 97 | 98 | end 99 | end 100 | count=count+1 101 | if count~=3 then count=2 end 102 | end 103 | 104 | function main() 105 | if Lotto==1 then Lotto=-1 end 106 | Lotto=Lotto+1 107 | if Lotto==1 then 108 | -- I=I+1 109 | if K==0 then 110 | for i=0, 10000 do 111 | I=I+1 112 | T=reaper.GetToggleCommandState(I) 113 | CommandName=tostring(reaper.ReverseNamedCommandLookup(I)) 114 | if T~=-1 and CommandName=="nil" then O=O+1 break end 115 | end 116 | end 117 | if a==0 then Section=0 sect="Main" 118 | elseif a==1 then Section=100 sect="Main(Alt Rec)" 119 | elseif a==2 then Section=32060 sect="Media Explorer" 120 | elseif a==3 then Section=32061 sect="MIDI Editor" 121 | elseif a==4 then Section=32062 sect="MIDI Event List Editor" 122 | elseif a==5 then Section=32063 sect="MIDI Inline Editor" 123 | end 124 | if I>65536 then a=a+1 I=0 end 125 | L=reaper.ReverseNamedCommandLookup(I) 126 | reaper.SetExtState("hack","count","Sec:"..tostring(Section).."_AID:"..tostring(I),true) 127 | if K>0 then reaper.Main_OnCommand(I,0) 128 | checkchanges(Section, I) 129 | K=K+1 end --else I=I+1 end 130 | if K==0 and T~=-1 then 131 | reaper.Main_OnCommand(I,0) 132 | checkchanges(Section, I) 133 | K=K+1 134 | AnzahlToggleActions=AnzahlToggleActions+1 135 | end 136 | -- if I<=65536 then reaper.defer(main) end 137 | T2=reaper.GetToggleCommandState(I) 138 | if a<=5 then reaper.defer(main) end 139 | if K==3 then K=0 end 140 | else 141 | reaper.defer(main) 142 | end 143 | end 144 | 145 | main() 146 | 147 | --[[ reaper.Main_OnCommand(I,0) 148 | reaper.Main_OnCommand(I,0) 149 | reaper.Main_OnCommand(I,0) 150 | reaper.Main_OnCommand(I,0) 151 | --]] 152 | 153 | 154 | --------------------------------------------------------------------------------