From fee6879298b68ff681710a10682deb44d6b2d5d4 Mon Sep 17 00:00:00 2001 From: Keith Rocheck <749812+krocheck@users.noreply.github.com> Date: Thu, 9 Dec 2021 16:05:41 -0500 Subject: [PATCH] migrate rcp branch to old module --- .gitignore | 4 +- ...P Parameters-1.txt => CL5 Parameters-1.txt | 534 +++++----- HELP.md | 31 +- README.md | 108 +- Rivage Parameters-1.txt | 65 ++ ...P Parameters-1.txt => TF5 Parameters-1.txt | 12 +- index.js | 996 ++++++++++-------- package.json | 21 +- paramFuncs.js | 88 ++ scpNames.json => rcpNames.json | 50 +- upgrade.js | 296 +++--- 11 files changed, 1270 insertions(+), 935 deletions(-) rename CL5 SCP Parameters-1.txt => CL5 Parameters-1.txt (94%) create mode 100644 Rivage Parameters-1.txt rename TF5 SCP Parameters-1.txt => TF5 Parameters-1.txt (95%) create mode 100644 paramFuncs.js rename scpNames.json => rcpNames.json (96%) diff --git a/.gitignore b/.gitignore index dfd5691f..ee5aff8c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ node_modules/ .eslintrc -Yam-SCP (GitHub).code-workspace \ No newline at end of file +Yam-SCP (GitHub).code-workspace +yamaha-scp.code-workspace +yamaha-rcp (working).code-workspace \ No newline at end of file diff --git a/CL5 SCP Parameters-1.txt b/CL5 Parameters-1.txt similarity index 94% rename from CL5 SCP Parameters-1.txt rename to CL5 Parameters-1.txt index 3002dabf..9445d4a1 100644 --- a/CL5 SCP Parameters-1.txt +++ b/CL5 Parameters-1.txt @@ -1,268 +1,268 @@ -OK prminfo 0 "MIXER:Current/StIn/Fader/Level" 16 1 -32768 1000 -32768 "" integer any rw 1 -OK prminfo 1 "MIXER:Current/StInCh/Fader/Level" 16 1 -32768 1000 -32768 "" integer any rw 1 -OK prminfo 2 "MIXER:Current/Mtrx/Fader/Level" 8 1 -32768 1000 0 "" integer any rw 1 -OK prminfo 3 "MIXER:Current/St/Fader/Level" 3 1 -32768 1000 -32768 "" integer any rw 1 -OK prminfo 4 "MIXER:Current/DCA/Fader/Level" 16 1 -32768 1000 0 "" integer any rw 1 -OK prminfo 5 "MIXER:Current/StIn/Fader/On" 16 1 0 1 1 "" integer any rw 1 -OK prminfo 6 "MIXER:Current/StInCh/Fader/On" 16 1 0 1 1 "" integer any rw 1 -OK prminfo 7 "MIXER:Current/Mtrx/Fader/On" 8 1 0 1 1 "" integer any rw 1 -OK prminfo 8 "MIXER:Current/St/Fader/On" 3 1 0 1 1 "" integer any rw 1 -OK prminfo 9 "MIXER:Current/DCA/Fader/On" 16 1 0 1 0 "" integer any rw 1 -OK prminfo 10 "MIXER:Current/MuteMaster/On" 8 1 0 1 0 "" integer any rw 1 --- prminfo 11 "MIXER:Current/StIn/PanMode" 16 1 0 1 0 "" integer any r 1 -OK prminfo 12 "MIXER:Current/StIn/ToSt/Pan" 16 1 -63 63 0 "" integer any rw 1 -OK prminfo 13 "MIXER:Current/StIn/Out/Balance" 16 1 -63 63 0 "" integer any rw 1 --- prminfo 14 "MIXER:Current/StIn/Role" 16 1 0 7 "StereoL" "" string any r 1 --- prminfo 15 "MIXER:Current/StInCh/PanMode" 16 1 0 1 0 "" integer any r 1 -OK prminfo 16 "MIXER:Current/StInCh/ToSt/Pan" 16 1 -63 63 0 "" integer any rw 1 -OK prminfo 17 "MIXER:Current/StInCh/Out/Balance" 16 1 -63 63 0 "" integer any rw 1 --- prminfo 18 "MIXER:Current/StInCh/Role" 16 1 0 7 "StereoL" "" string any r 1 --- prminfo 19 "MIXER:Current/Mtrx/Role" 8 1 0 7 "Mono" "" string any r 1 -OK prminfo 20 "MIXER:Current/Mtrx/Out/Balance" 8 1 -63 63 0 "" integer any rw 1 --- prminfo 21 "MIXER:Current/St/PanMode" 2 1 0 1 0 "" integer any r 1 -OK prminfo 22 "MIXER:Current/St/Out/Balance" 2 1 -63 63 0 "" integer any rw 1 --- prminfo 23 "MIXER:Current/St/Role" 3 1 0 7 "StereoL" "" string any r 1 --- prminfo 24 "MIXER:Current/SurrMode" 1 1 0 1 0 "" integer any r 1 --- prminfo 25 "MIXER:Current/StIn/Surr/LRPan" 16 1 -63 63 0 "" integer any rw 1 --- prminfo 26 "MIXER:Current/StIn/Surr/FRPan" 16 1 -63 63 0 "" integer any rw 1 --- prminfo 27 "MIXER:Current/StIn/Surr/FRPanRev" 16 1 -63 63 0 "" integer any rw 1 -OK prminfo 28 "MIXER:Current/StIn/Surr/Div" 16 1 0 100 100 "" integer any rw 1 --- prminfo 29 "MIXER:Current/StIn/Surr/LOn" 16 1 0 1 1 "" integer any rw 1 --- prminfo 30 "MIXER:Current/StIn/Surr/ROn" 16 1 0 1 1 "" integer any rw 1 --- prminfo 31 "MIXER:Current/StIn/Surr/COn" 16 1 0 1 1 "" integer any rw 1 --- prminfo 32 "MIXER:Current/StIn/Surr/LFEOn" 16 1 0 1 1 "" integer any rw 1 --- prminfo 33 "MIXER:Current/StIn/Surr/LsOn" 16 1 0 1 1 "" integer any rw 1 --- prminfo 34 "MIXER:Current/StIn/Surr/RsOn" 16 1 0 1 1 "" integer any rw 1 --- prminfo 35 "MIXER:Current/StIn/Surr/LFELevel" 16 1 -32768 1000 -32768 "" integer any rw 1 -OK prminfo 36 "MIXER:Current/StIn/Port/HA/Gain" 16 1 -600 6600 -600 "" integer any rw 1 --- prminfo 37 "MIXER:Current/StIn/Dyna1/Type" 16 1 0 10 "Gate" "" string any rw 1 -OK prminfo 38 "MIXER:Current/StIn/Dyna1/Threshold" 16 1 -720 0 -260 "" integer any rw 1 --- prminfo 39 "MIXER:Current/StIn/Dyna2/Type" 16 1 0 11 "Compressor" "" string any rw 1 -OK prminfo 40 "MIXER:Current/StIn/Dyna2/Threshold" 16 1 -540 0 -80 "" integer any rw 1 --- prminfo 41 "MIXER:Current/StInCh/Surr/LRPan" 16 1 -63 63 0 "" integer any rw 1 --- prminfo 42 "MIXER:Current/StInCh/Surr/FRPan" 16 1 -63 63 0 "" integer any rw 1 --- prminfo 43 "MIXER:Current/StInCh/Surr/FRPanRev" 16 1 -63 63 0 "" integer any rw 1 -OK prminfo 44 "MIXER:Current/StInCh/Surr/Div" 16 1 0 100 100 "" integer any rw 1 --- prminfo 45 "MIXER:Current/StInCh/Surr/LOn" 16 1 0 1 1 "" integer any rw 1 --- prminfo 46 "MIXER:Current/StInCh/Surr/ROn" 16 1 0 1 1 "" integer any rw 1 --- prminfo 47 "MIXER:Current/StInCh/Surr/COn" 16 1 0 1 1 "" integer any rw 1 --- prminfo 48 "MIXER:Current/StInCh/Surr/LFEOn" 16 1 0 1 1 "" integer any rw 1 --- prminfo 49 "MIXER:Current/StInCh/Surr/LsOn" 16 1 0 1 1 "" integer any rw 1 --- prminfo 50 "MIXER:Current/StInCh/Surr/RsOn" 16 1 0 1 1 "" integer any rw 1 --- prminfo 51 "MIXER:Current/StInCh/Surr/LFELevel" 16 1 -32768 1000 -32768 "" integer any rw 1 --- prminfo 52 "MIXER:Current/StInCh/Port/HA/Gain" 16 1 -600 6600 -600 "" integer any rw 1 --- prminfo 53 "MIXER:Current/StInCh/Dyna1/Type" 16 1 0 10 "Gate" "" string any rw 1 -OK prminfo 54 "MIXER:Current/StInCh/Dyna1/Threshold" 16 1 -720 0 -260 "" integer any rw 1 --- prminfo 55 "MIXER:Current/StInCh/Dyna2/Type" 16 1 0 11 "Compressor" "" string any rw 1 -OK prminfo 56 "MIXER:Current/StInCh/Dyna2/Threshold" 16 1 -540 0 -80 "" integer any rw 1 --- prminfo 57 "MIXER:Current/Mtrx/Dyna1/Type" 8 1 0 11 "Compressor" "" string any rw 1 -OK prminfo 58 "MIXER:Current/Mtrx/Dyna1/Threshold" 8 1 -540 0 -80 "" integer any rw 1 --- prminfo 59 "MIXER:Current/St/Dyna1/Type" 3 1 0 11 "Compressor" "" string any rw 1 -OK prminfo 60 "MIXER:Current/St/Dyna1/Threshold" 3 1 -540 0 -80 "" integer any rw 1 -OK prminfo 61 "MIXER:Current/StIn/DCA/Assign" 16 16 0 1 0 "" integer any rw 1 -OK prminfo 62 "MIXER:Current/StInCh/DCA/Assign" 16 16 0 1 0 "" integer any rw 1 -OK prminfo 63 "MIXER:Current/Mtrx/DCA/Assign" 8 16 0 1 0 "" integer any rw 1 -OK prminfo 64 "MIXER:Current/St/DCA/Assign" 3 16 0 1 0 "" integer any rw 1 -OK prminfo 65 "MIXER:Current/StIn/Label/Name" 16 1 0 8 "Rt1L" "" string any rw 1 -OK prminfo 66 "MIXER:Current/StInCh/Label/Name" 16 1 0 8 "Rt1L" "" string any rw 1 -OK prminfo 67 "MIXER:Current/Mtrx/Label/Name" 8 1 0 8 "MT 1" "" string any rw 1 -OK prminfo 68 "MIXER:Current/St/Label/Name" 3 1 0 8 "ST L" "" string any rw 1 -OK prminfo 69 "MIXER:Current/DCA/Label/Name" 16 1 0 8 "DCA 1" "" string any rw 1 -OK prminfo 70 "MIXER:Current/MuteMaster/Label/Name" 8 1 0 8 "MUTE 1" "" string any rw 1 -OK prminfo 71 "MIXER:Current/StIn/Label/Color" 16 1 0 7 "Blue" "" string any rw 1 -OK prminfo 72 "MIXER:Current/StInCh/Label/Color" 16 1 0 7 "Blue" "" string any rw 1 -OK prminfo 73 "MIXER:Current/Mtrx/Label/Color" 8 1 0 7 "Orange" "" string any rw 1 -OK prminfo 74 "MIXER:Current/St/Label/Color" 3 1 0 7 "Orange" "" string any rw 1 -OK prminfo 75 "MIXER:Current/DCA/Label/Color" 16 1 0 7 "Yellow" "" string any rw 1 -OK prminfo 76 "MIXER:Current/StIn/ToMtrx/Level" 16 8 -32768 1000 -32768 "" integer any rw 1 -OK prminfo 77 "MIXER:Current/StIn/ToMtrx/On" 16 8 0 1 1 "" integer any rw 1 -OK prminfo 78 "MIXER:Current/StInCh/ToMtrx/Level" 16 8 -32768 1000 -32768 "" integer any rw 1 -OK prminfo 79 "MIXER:Current/StInCh/ToMtrx/On" 16 8 0 1 1 "" integer any rw 1 -OK prminfo 80 "MIXER:Current/St/ToMtrx/Level" 3 8 -32768 1000 -32768 "" integer any rw 1 -OK prminfo 81 "MIXER:Current/St/ToMtrx/On" 3 8 0 1 1 "" integer any rw 1 -OK prminfo 82 "MIXER:Current/Monitor/On" 1 1 0 1 1 "" integer any rw 1 -OK prminfo 83 "MIXER:Current/Monitor/DimmerOn" 1 1 0 1 0 "" integer any rw 1 --- prminfo 84 "MIXER:Current/Monitor/PhonesLevelLink" 1 1 0 1 1 "" integer any rw 1 -OK prminfo 85 "MIXER:Current/Monitor/CueInterruption" 1 1 0 1 1 "" integer any rw 1 -OK prminfo 86 "MIXER:Current/Monitor/Fader/Level" 1 1 -32768 1000 0 "" integer any rw 1 --- prminfo 87 "MIXER:Current/Monitor/DelayAutoBypass" 1 1 0 1 1 "" integer any rw 1 --- prminfo 88 "MIXER:Current/Monitor/St/SourceSelect" 1 1 0 10 "Stereo" "" string any rw 1 --- prminfo 89 "MIXER:Current/Monitor/St/SourceCh/Mtrx" 8 1 0 1 0 "" integer any rw 1 --- prminfo 90 "MIXER:Current/Monitor/St/SourceCh/St" 2 1 0 1 0 "" integer any rw 1 --- prminfo 91 "MIXER:Current/Monitor/St/SourceCh/LocalInput" 4 1 0 1 0 "" integer any rw 1 --- prminfo 92 "MIXER:Current/Monitor/St/SourceCh/Rec" 1 1 0 1 0 "" integer any rw 1 --- prminfo 93 "MIXER:Current/Monitor/St/MonoMonitor" 1 1 0 1 0 "" integer any rw 1 --- prminfo 94 "MIXER:Current/Monitor/Surr/SourceSelect" 1 1 0 11 "Mix1-6" "" string any rw 1 --- prminfo 95 "MIXER:Current/Monitor/Surr/SourceCh" 1 1 0 9 "EXT ST1" "" string any rw 1 --- prminfo 96 "MIXER:Current/Monitor/Surr/SoloMode" 1 1 0 1 0 "" integer any rw 1 --- prminfo 97 "MIXER:Current/Monitor/Surr/LOn" 1 1 0 1 1 "" integer any rw 1 --- prminfo 98 "MIXER:Current/Monitor/Surr/ROn" 1 1 0 1 1 "" integer any rw 1 --- prminfo 99 "MIXER:Current/Monitor/Surr/COn" 1 1 0 1 1 "" integer any rw 1 --- prminfo 100 "MIXER:Current/Monitor/Surr/LFEOn" 1 1 0 1 1 "" integer any rw 1 --- prminfo 101 "MIXER:Current/Monitor/Surr/LsOn" 1 1 0 1 1 "" integer any rw 1 --- prminfo 102 "MIXER:Current/Monitor/Surr/RsOn" 1 1 0 1 1 "" integer any rw 1 --- prminfo 103 "MIXER:Current/Monitor/DownMix/Type" 1 1 0 6 "5.1" "" string any rw 1 --- prminfo 104 "MIXER:Current/Monitor/DownMix/LToLOn" 1 1 0 1 1 "" integer any rw 1 --- prminfo 105 "MIXER:Current/Monitor/DownMix/LToROn" 1 1 0 1 0 "" integer any rw 1 --- prminfo 106 "MIXER:Current/Monitor/DownMix/RToLOn" 1 1 0 1 0 "" integer any rw 1 --- prminfo 107 "MIXER:Current/Monitor/DownMix/RToROn" 1 1 0 1 1 "" integer any rw 1 --- prminfo 108 "MIXER:Current/Monitor/DownMix/CToLOn" 1 1 0 1 1 "" integer any rw 1 --- prminfo 109 "MIXER:Current/Monitor/DownMix/CToROn" 1 1 0 1 1 "" integer any rw 1 --- prminfo 110 "MIXER:Current/Monitor/DownMix/LFEToLOn" 1 1 0 1 0 "" integer any rw 1 --- prminfo 111 "MIXER:Current/Monitor/DownMix/LFEToROn" 1 1 0 1 0 "" integer any rw 1 --- prminfo 112 "MIXER:Current/Monitor/DownMix/LsToLOn" 1 1 0 1 1 "" integer any rw 1 --- prminfo 113 "MIXER:Current/Monitor/DownMix/LsToROn" 1 1 0 1 0 "" integer any rw 1 --- prminfo 114 "MIXER:Current/Monitor/DownMix/RsToLOn" 1 1 0 1 0 "" integer any rw 1 --- prminfo 115 "MIXER:Current/Monitor/DownMix/RsToROn" 1 1 0 1 1 "" integer any rw 1 --- prminfo 116 "MIXER:Current/Monitor/DownMix/LToLRLevel" 1 1 -32768 0 0 "" integer any rw 1 --- prminfo 117 "MIXER:Current/Monitor/DownMix/RToLRLevel" 1 1 -32768 0 0 "" integer any rw 1 --- prminfo 118 "MIXER:Current/Monitor/DownMix/CToLRLevel" 1 1 -32768 0 -300 "" integer any rw 1 --- prminfo 119 "MIXER:Current/Monitor/DownMix/LFEToLRLevel" 1 1 -32768 0 -32768 "" integer any rw 1 --- prminfo 120 "MIXER:Current/Monitor/DownMix/LsToLRLevel" 1 1 -32768 0 -300 "" integer any rw 1 --- prminfo 121 "MIXER:Current/Monitor/DownMix/RsToLRLevel" 1 1 -32768 0 -300 "" integer any rw 1 --- prminfo 122 "MIXER:Current/Monitor/DownMix/MasterLevel" 1 1 -32768 0 -300 "" integer any rw 1 -OK prminfo 123 "MIXER:Current/Cue/Output" 1 1 0 1 0 "" integer any rw 1 --- prminfo 124 "MIXER:Current/Cue/CueMode" 1 1 0 8 "Mix Cue" "" string any rw 1 --- prminfo 125 "MIXER:Current/Cue/Surr/CueMode" 1 1 0 8 "Mix Cue" "" string any rw 1 -OK prminfo 126 "MIXER:Current/Cue/FaderCueRelease" 1 1 0 1 0 "" integer any rw 1 --- prminfo 127 "MIXER:Current/Cue/InCh/Point" 1 1 0 8 "PFL" "" string any rw 1 --- prminfo 128 "MIXER:Current/Cue/OutCh/Point" 1 1 0 3 "PFL" "" string any rw 1 --- prminfo 129 "MIXER:Current/Cue/DCA/Point" 1 1 0 8 "Pre Pan" "" string any rw 1 --- prminfo 130 "MIXER:Current/Cue/DCA/Unity" 1 1 0 1 0 "" integer any rw 1 -OK prminfo 131 "MIXER:Current/Cue/OutputLevel" 1 1 -32768 1000 0 "" integer any rw 1 --- prminfo 132 "MIXER:Current/Cue/ActiveCue" 1 1 0 10 "None" "" string any r 1 -OK prminfo 133 "MIXER:Current/Cue/StIn/On" 16 1 0 1 0 "" integer any rw 1 -OK prminfo 134 "MIXER:Current/Cue/StInCh/On" 16 1 0 1 0 "" integer any rw 1 -OK prminfo 135 "MIXER:Current/Cue/Mtrx/On" 8 1 0 1 0 "" integer any rw 1 -OK prminfo 136 "MIXER:Current/Cue/St/On" 3 1 0 1 0 "" integer any rw 1 -OK prminfo 137 "MIXER:Current/Cue/DCA/On" 16 1 0 1 0 "" integer any rw 1 -OK prminfo 138 "MIXER:Current/StIn/Patch" 16 1 0 8 "FX5 L(A)" "" string any rw 1 -OK prminfo 139 "MIXER:Current/StInCh/Patch" 16 1 0 8 "FX5 L(A)" "" string any rw 1 -OK prminfo 140 "MIXER:Current/Recorder/Patch" 1 2 0 12 "ST L" "" string any rw 1 -OK prminfo 141 "MIXER:Current/DigitalOutPort/Patch" 2 1 0 12 "ST L" "" string any rw 1 --- prminfo 142 "MIXER:Setup/MonitorMix/Password" 1 1 0 24 "" "" string any r 1 -OK prminfo 143 "MIXER:Current/StInCh/Label/Icon" 16 1 0 12 "Effect" "" string any rw 1 -OK prminfo 144 "MIXER:Current/StInCh/ToMtrx/Pan" 16 8 -63 63 0 "" integer any rw 1 -OK prminfo 145 "MIXER:Current/StInCh/ToMtrx/PrePost" 16 8 0 1 0 "" integer any rw 1 --- prminfo 146 "MIXER:Current/Mtrx/BusType" 8 1 0 5 "VARI" "" string any rw 1 -OK prminfo 147 "MIXER:Current/Mtrx/Label/Icon" 8 1 0 7 "Blank" "" string any rw 1 --- prminfo 148 "MIXER:Current/Mtrx/PanLink" 8 1 0 1 0 "" integer any rw 1 -OK prminfo 149 "MIXER:Current/St/Label/Icon" 3 1 0 12 "Blank" "" string any rw 1 -OK prminfo 150 "MIXER:Current/St/ToMtrx/Pan" 3 8 -63 63 0 "" integer any rw 1 -OK prminfo 151 "MIXER:Current/St/ToMtrx/PrePost" 3 8 0 1 0 "" integer any rw 1 --- prminfo 152 "MIXER:Current/InputChLink/StInCh/Assign" 16 1 0 40 0 "" integer any r 1 --- prminfo 153 "MIXER:Current/InputChLink/LinkParams/EQ" 40 1 0 1 1 "" integer any r 1 --- prminfo 154 "MIXER:Current/InputChLink/LinkParams/Insert" 40 1 0 1 1 "" integer any r 1 --- prminfo 155 "MIXER:Current/InputChLink/LinkParams/Fader" 40 1 0 1 1 "" integer any r 1 --- prminfo 156 "MIXER:Current/InputChLink/LinkParams/ChOn" 40 1 0 1 1 "" integer any r 1 --- prminfo 157 "MIXER:Current/InputChLink/LinkParams/ToSt" 40 1 0 1 1 "" integer any r 1 --- prminfo 158 "MIXER:Current/InputChLink/LinkParams/DCA" 40 1 0 1 1 "" integer any r 1 --- prminfo 159 "MIXER:Current/InputChLink/LinkParams/Mute" 40 1 0 1 1 "" integer any r 1 --- prminfo 160 "MIXER:Current/InputChLink/LinkParams/MatrixSend" 40 1 0 1 1 "" integer any r 1 --- prminfo 161 "MIXER:Current/InputChLink/LinkParams/MatrixSendOn" 40 1 0 1 1 "" integer any r 1 --- prminfo 162 "MIXER:Current/InputChLink/LinkParams/Dyna1" 40 1 0 1 1 "" integer any r 1 --- prminfo 163 "MIXER:Current/InputChLink/LinkParams/Dyna2" 40 1 0 1 1 "" integer any r 1 --- prminfo 164 "MIXER:Current/InputChLink/LinkParams/HA" 40 1 0 1 1 "" integer any r 1 --- prminfo 165 "MIXER:Current/InputChLink/LinkParams/HPF" 40 1 0 1 1 "" integer any r 1 --- prminfo 166 "MIXER:Current/InputChLink/LinkParams/DigitalGain" 40 1 0 1 1 "" integer any r 1 --- prminfo 167 "MIXER:Current/InputChLink/LinkParams/DirectOut" 40 1 0 1 1 "" integer any r 1 --- prminfo 168 "MIXER:Current/InputChLink/LinkParams/MixSend" 40 1 0 1 1 "" integer any r 1 --- prminfo 169 "MIXER:Current/InputChLink/LinkParams/MixSendOn" 40 1 0 1 1 "" integer any r 1 --- prminfo 170 "MIXER:Current/InputChLink/LinkParams/Delay" 40 1 0 1 1 "" integer any r 1 --- prminfo 171 "MIXER:Current/InputChLink/SendParams/ToMtrx" 40 8 0 1 1 "" integer any r 1 --- prminfo 172 "MIXER:Current/OutputChLink/Mtrx/Assign" 8 1 0 17 0 "" integer any r 1 --- prminfo 173 "MIXER:Current/OutputChLink/LinkParams/EQ" 16 1 0 1 1 "" integer any r 1 --- prminfo 174 "MIXER:Current/OutputChLink/LinkParams/Insert" 16 1 0 1 1 "" integer any r 1 --- prminfo 175 "MIXER:Current/OutputChLink/LinkParams/Fader" 16 1 0 1 1 "" integer any r 1 --- prminfo 176 "MIXER:Current/OutputChLink/LinkParams/ChOn" 16 1 0 1 1 "" integer any r 1 --- prminfo 177 "MIXER:Current/OutputChLink/LinkParams/ToSt" 16 1 0 1 1 "" integer any r 1 --- prminfo 178 "MIXER:Current/OutputChLink/LinkParams/DCA" 16 1 0 1 1 "" integer any r 1 --- prminfo 179 "MIXER:Current/OutputChLink/LinkParams/Mute" 16 1 0 1 1 "" integer any r 1 --- prminfo 180 "MIXER:Current/OutputChLink/LinkParams/MatrixSend" 16 1 0 1 1 "" integer any r 1 --- prminfo 181 "MIXER:Current/OutputChLink/LinkParams/MatrixSendOn" 16 1 0 1 1 "" integer any r 1 --- prminfo 182 "MIXER:Current/OutputChLink/LinkParams/Dyna1" 16 1 0 1 1 "" integer any r 1 --- prminfo 183 "MIXER:Current/OutputChLink/SendParams/ToMtrx" 16 8 0 1 1 "" integer any r 1 -OK prminfo 184 "MIXER:Current/InCh/Fader/Level" 72 1 -32768 1000 -32768 "" integer any rw 1 -OK prminfo 185 "MIXER:Current/Mix/Fader/Level" 24 1 -32768 1000 0 "" integer any rw 1 -OK prminfo 186 "MIXER:Current/InCh/Fader/On" 72 1 0 1 1 "" integer any rw 1 -OK prminfo 187 "MIXER:Current/Mix/Fader/On" 24 1 0 1 1 "" integer any rw 1 --- prminfo 188 "MIXER:Current/InCh/PanMode" 72 1 0 0 0 "" integer any r 1 -OK prminfo 189 "MIXER:Current/InCh/ToSt/Pan" 72 1 -63 63 0 "" integer any rw 1 --- prminfo 190 "MIXER:Current/InCh/Role" 72 1 0 7 "Mono" "" string any r 1 --- prminfo 191 "MIXER:Current/Mix/PanMode" 24 1 0 1 0 "" integer any r 1 -OK prminfo 192 "MIXER:Current/Mix/ToSt/Pan" 24 1 -63 63 0 "" integer any rw 1 -OK prminfo 193 "MIXER:Current/Mix/Out/Balance" 24 1 -63 63 0 "" integer any rw 1 --- prminfo 194 "MIXER:Current/Mix/Role" 24 1 0 7 "Mono" "" string any r 1 --- prminfo 195 "MIXER:Current/InCh/Surr/LRPan" 72 1 -63 63 0 "" integer any rw 1 --- prminfo 196 "MIXER:Current/InCh/Surr/FRPan" 72 1 -63 63 0 "" integer any rw 1 --- prminfo 197 "MIXER:Current/InCh/Surr/FRPanRev" 72 1 -63 63 0 "" integer any rw 1 -OK prminfo 198 "MIXER:Current/InCh/Surr/Div" 72 1 0 100 100 "" integer any rw 1 --- prminfo 199 "MIXER:Current/InCh/Surr/LOn" 72 1 0 1 1 "" integer any rw 1 --- prminfo 200 "MIXER:Current/InCh/Surr/ROn" 72 1 0 1 1 "" integer any rw 1 --- prminfo 201 "MIXER:Current/InCh/Surr/COn" 72 1 0 1 1 "" integer any rw 1 --- prminfo 202 "MIXER:Current/InCh/Surr/LFEOn" 72 1 0 1 1 "" integer any rw 1 --- prminfo 203 "MIXER:Current/InCh/Surr/LsOn" 72 1 0 1 1 "" integer any rw 1 --- prminfo 204 "MIXER:Current/InCh/Surr/RsOn" 72 1 0 1 1 "" integer any rw 1 --- prminfo 205 "MIXER:Current/InCh/Surr/LFELevel" 72 1 -32768 1000 -32768 "" integer any rw 1 -OK prminfo 206 "MIXER:Current/InCh/Port/HA/Gain" 72 1 -600 6600 -600 "" integer any rw 1 --- prminfo 207 "MIXER:Current/InCh/Dyna1/Type" 72 1 0 10 "Gate" "" string any rw 1 -OK prminfo 208 "MIXER:Current/InCh/Dyna1/Threshold" 72 1 -720 0 -260 "" integer any rw 1 --- prminfo 209 "MIXER:Current/InCh/Dyna2/Type" 72 1 0 11 "Compressor" "" string any rw 1 -OK prminfo 210 "MIXER:Current/InCh/Dyna2/Threshold" 72 1 -540 0 -80 "" integer any rw 1 --- prminfo 211 "MIXER:Current/Mix/Dyna1/Type" 24 1 0 11 "Compressor" "" string any rw 1 -OK prminfo 212 "MIXER:Current/Mix/Dyna1/Threshold" 24 1 -540 0 -80 "" integer any rw 1 -OK prminfo 213 "MIXER:Current/InCh/DCA/Assign" 72 16 0 1 0 "" integer any rw 1 -OK prminfo 214 "MIXER:Current/Mix/DCA/Assign" 24 16 0 1 0 "" integer any rw 1 -OK prminfo 215 "MIXER:Current/InCh/Label/Name" 72 1 0 8 "ch 1" "" string any rw 1 -OK prminfo 216 "MIXER:Current/Mix/Label/Name" 24 1 0 8 "MX 1" "" string any rw 1 -OK prminfo 217 "MIXER:Current/InCh/Label/Color" 72 1 0 7 "Blue" "" string any rw 1 -OK prminfo 218 "MIXER:Current/Mix/Label/Color" 24 1 0 7 "Orange" "" string any rw 1 -OK prminfo 219 "MIXER:Current/InCh/ToMix/Level" 72 24 -32768 1000 -32768 "" integer any rw 1 -OK prminfo 220 "MIXER:Current/InCh/ToMix/On" 72 24 0 1 1 "" integer any rw 1 -OK prminfo 221 "MIXER:Current/StIn/ToMix/Level" 16 24 -32768 1000 -32768 "" integer any rw 1 -OK prminfo 222 "MIXER:Current/StIn/ToMix/On" 16 24 0 1 1 "" integer any rw 1 -OK prminfo 223 "MIXER:Current/StInCh/ToMix/Level" 16 24 -32768 1000 -32768 "" integer any rw 1 -OK prminfo 224 "MIXER:Current/StInCh/ToMix/On" 16 24 0 1 1 "" integer any rw 1 -OK prminfo 225 "MIXER:Current/InCh/ToMtrx/Level" 72 8 -32768 1000 -32768 "" integer any rw 1 -OK prminfo 226 "MIXER:Current/InCh/ToMtrx/On" 72 8 0 1 1 "" integer any rw 1 -OK prminfo 227 "MIXER:Current/Mix/ToMtrx/Level" 24 8 -32768 1000 -32768 "" integer any rw 1 -OK prminfo 228 "MIXER:Current/Mix/ToMtrx/On" 24 8 0 1 1 "" integer any rw 1 --- prminfo 229 "MIXER:Current/Monitor/St/SourceCh/Mix" 24 1 0 1 0 "" integer any rw 1 -OK prminfo 230 "MIXER:Current/Cue/InCh/On" 72 1 0 1 0 "" integer any rw 1 -OK prminfo 231 "MIXER:Current/Cue/Mix/On" 24 1 0 1 0 "" integer any rw 1 -OK prminfo 232 "MIXER:Current/InCh/Patch" 72 1 0 8 "DANTE1" "" string any rw 1 -OK prminfo 233 "MIXER:Current/DanteOutPort/Patch" 64 1 0 12 "MIX1" "" string any rw 1 -OK prminfo 234 "MIXER:Current/OmniOutPort/Patch" 8 1 0 12 "MIX1" "" string any rw 1 -OK prminfo 235 "MIXER:Current/SlotOut1Port/Patch" 1 16 0 12 "MIX1" "" string any rw 1 -OK prminfo 236 "MIXER:Current/SlotOut2Port/Patch" 1 16 0 12 "MIX17" "" string any rw 1 -OK prminfo 237 "MIXER:Current/SlotOut3Port/Patch" 1 16 0 12 "ST L" "" string any rw 1 -OK prminfo 238 "CL:Current/CustomFaderBank/A/SourceCh" 2 16 0 11 "NO ASSIGN" "" string any rw 1 -OK prminfo 239 "CL:Current/CustomFaderBank/B/CentraOut/SourceCh" 1 8 0 11 "NO ASSIGN" "" string any rw 1 -OK prminfo 240 "CL:Current/CustomFaderBank/C/SourceCh" 6 8 0 11 "NO ASSIGN" "" string any rw 1 -OK prminfo 241 "CL:Current/CustomFaderBank/Master/SourceCh" 1 2 0 11 "ST" "" string any rw 1 -OK prminfo 242 "CL:Current/FaderBank/A/Recall" 1 1 0 8 0 "" integer any rw 1 -OK prminfo 243 "CL:Current/FaderBank/B/Centralogic/Select" 1 1 0 1 0 "" integer any rw 1 -OK prminfo 244 "CL:Current/FaderBank/B/CentraIn/Recall" 1 1 0 8 0 "" integer any rw 1 -OK prminfo 245 "CL:Current/FaderBank/B/CentraOut/Recall" 1 1 0 8 0 "" integer any rw 1 -OK prminfo 246 "CL:Current/FaderBank/C/Recall" 1 1 0 8 0 "" integer any rw 1 -OK prminfo 247 "MIXER:Current/InCh/Label/Icon" 72 1 0 12 "DynamicMic" "" string any rw 1 -OK prminfo 248 "MIXER:Current/InCh/ToMix/Pan" 72 24 -63 63 0 "" integer any rw 1 -OK prminfo 249 "MIXER:Current/InCh/ToMix/PrePost" 72 24 0 1 0 "" integer any rw 1 -OK prminfo 250 "MIXER:Current/InCh/ToMtrx/Pan" 72 8 -63 63 0 "" integer any rw 1 -OK prminfo 251 "MIXER:Current/InCh/ToMtrx/PrePost" 72 8 0 1 0 "" integer any rw 1 -OK prminfo 252 "MIXER:Current/StInCh/ToMix/Pan" 16 24 -63 63 0 "" integer any rw 1 -OK prminfo 253 "MIXER:Current/StInCh/ToMix/PrePost" 16 24 0 1 0 "" integer any rw 1 --- prminfo 254 "MIXER:Current/Mix/BusType" 24 1 0 5 "VARI" "" string any rw 1 -OK prminfo 255 "MIXER:Current/Mix/Label/Icon" 24 1 0 12 "Blank" "" string any rw 1 --- prminfo 256 "MIXER:Current/Mix/PanLink" 24 1 0 1 0 "" integer any rw 1 -OK prminfo 257 "MIXER:Current/Mix/ToMtrx/Pan" 24 8 -63 63 0 "" integer any rw 1 -OK prminfo 258 "MIXER:Current/Mix/ToMtrx/PrePost" 24 8 0 1 0 "" integer any rw 1 --- prminfo 259 "MIXER:Current/InputChLink/InCh/Assign" 72 1 0 40 0 "" integer any r 1 --- prminfo 260 "MIXER:Current/InputChLink/SendParams/ToMix" 40 24 0 1 1 "" integer any r 1 -OK prminfo 261 "MIXER:Current/OutputChLink/Mix/Assign" 24 1 0 17 0 "" integer any r 1 -OK prminfo 262 "QL:Current/CustomFaderBank/SourceCh" 4 32 0 11 "NO ASSIGN" "" string any rw 1 -OK prminfo 263 "QL:Current/CustomFaderBank/Master/SourceCh" 4 2 0 11 "NO ASSIGN" "" string any rw 1 -OK prminfo 264 "QL:Current/FaderBank/Select" 1 1 0 1 0 "" integer any rw 1 -OK prminfo 265 "QL:Current/FaderBank/Bank/Recall" 1 3 0 8 0 "" integer any rw 1 -OK prminfo 266 "QL:Current/FaderBank/Bank/Toggle" 1 1 0 8 0 "" integer any rw 1 +-- prminfo 0 "MIXER:Current/StIn/Fader/Level" 16 1 -32768 1000 -32768 "" integer any rw 1 +OK prminfo 1 "MIXER:Current/StInCh/Fader/Level" 16 1 -32768 1000 -32768 "" integer any rw 1 +OK prminfo 2 "MIXER:Current/Mtrx/Fader/Level" 8 1 -32768 1000 0 "" integer any rw 1 +OK prminfo 3 "MIXER:Current/St/Fader/Level" 3 1 -32768 1000 -32768 "" integer any rw 1 +OK prminfo 4 "MIXER:Current/DCA/Fader/Level" 16 1 -32768 1000 0 "" integer any rw 1 +-- prminfo 5 "MIXER:Current/StIn/Fader/On" 16 1 0 1 1 "" integer any rw 1 +OK prminfo 6 "MIXER:Current/StInCh/Fader/On" 16 1 0 1 1 "" integer any rw 1 +OK prminfo 7 "MIXER:Current/Mtrx/Fader/On" 8 1 0 1 1 "" integer any rw 1 +OK prminfo 8 "MIXER:Current/St/Fader/On" 3 1 0 1 1 "" integer any rw 1 +OK prminfo 9 "MIXER:Current/DCA/Fader/On" 16 1 0 1 0 "" integer any rw 1 +OK prminfo 10 "MIXER:Current/MuteMaster/On" 8 1 0 1 0 "" integer any rw 1 +-- prminfo 11 "MIXER:Current/StIn/PanMode" 16 1 0 1 0 "" integer any r 1 +-- prminfo 12 "MIXER:Current/StIn/ToSt/Pan" 16 1 -63 63 0 "" integer any rw 1 +-- prminfo 13 "MIXER:Current/StIn/Out/Balance" 16 1 -63 63 0 "" integer any rw 1 +-- prminfo 14 "MIXER:Current/StIn/Role" 16 1 0 7 "StereoL" "" string any r 1 +-- prminfo 15 "MIXER:Current/StInCh/PanMode" 16 1 0 1 0 "" integer any r 1 +OK prminfo 16 "MIXER:Current/StInCh/ToSt/Pan" 16 1 -63 63 0 "" integer any rw 1 +OK prminfo 17 "MIXER:Current/StInCh/Out/Balance" 16 1 -63 63 0 "" integer any rw 1 +-- prminfo 18 "MIXER:Current/StInCh/Role" 16 1 0 7 "StereoL" "" string any r 1 +-- prminfo 19 "MIXER:Current/Mtrx/Role" 8 1 0 7 "Mono" "" string any r 1 +OK prminfo 20 "MIXER:Current/Mtrx/Out/Balance" 8 1 -63 63 0 "" integer any rw 1 +-- prminfo 21 "MIXER:Current/St/PanMode" 2 1 0 1 0 "" integer any r 1 +OK prminfo 22 "MIXER:Current/St/Out/Balance" 2 1 -63 63 0 "" integer any rw 1 +-- prminfo 23 "MIXER:Current/St/Role" 3 1 0 7 "StereoL" "" string any r 1 +-- prminfo 24 "MIXER:Current/SurrMode" 1 1 0 1 0 "" integer any r 1 +-- prminfo 25 "MIXER:Current/StIn/Surr/LRPan" 16 1 -63 63 0 "" integer any rw 1 +-- prminfo 26 "MIXER:Current/StIn/Surr/FRPan" 16 1 -63 63 0 "" integer any rw 1 +-- prminfo 27 "MIXER:Current/StIn/Surr/FRPanRev" 16 1 -63 63 0 "" integer any rw 1 +-- prminfo 28 "MIXER:Current/StIn/Surr/Div" 16 1 0 100 100 "" integer any rw 1 +-- prminfo 29 "MIXER:Current/StIn/Surr/LOn" 16 1 0 1 1 "" integer any rw 1 +-- prminfo 30 "MIXER:Current/StIn/Surr/ROn" 16 1 0 1 1 "" integer any rw 1 +-- prminfo 31 "MIXER:Current/StIn/Surr/COn" 16 1 0 1 1 "" integer any rw 1 +-- prminfo 32 "MIXER:Current/StIn/Surr/LFEOn" 16 1 0 1 1 "" integer any rw 1 +-- prminfo 33 "MIXER:Current/StIn/Surr/LsOn" 16 1 0 1 1 "" integer any rw 1 +-- prminfo 34 "MIXER:Current/StIn/Surr/RsOn" 16 1 0 1 1 "" integer any rw 1 +-- prminfo 35 "MIXER:Current/StIn/Surr/LFELevel" 16 1 -32768 1000 -32768 "" integer any rw 1 +-- prminfo 36 "MIXER:Current/StIn/Port/HA/Gain" 16 1 -600 6600 -600 "" integer any rw 1 +-- prminfo 37 "MIXER:Current/StIn/Dyna1/Type" 16 1 0 10 "Gate" "" string any rw 1 +-- prminfo 38 "MIXER:Current/StIn/Dyna1/Threshold" 16 1 -720 0 -260 "" integer any rw 1 +-- prminfo 39 "MIXER:Current/StIn/Dyna2/Type" 16 1 0 11 "Compressor" "" string any rw 1 +-- prminfo 40 "MIXER:Current/StIn/Dyna2/Threshold" 16 1 -540 0 -80 "" integer any rw 1 +-- prminfo 41 "MIXER:Current/StInCh/Surr/LRPan" 16 1 -63 63 0 "" integer any rw 1 +-- prminfo 42 "MIXER:Current/StInCh/Surr/FRPan" 16 1 -63 63 0 "" integer any rw 1 +-- prminfo 43 "MIXER:Current/StInCh/Surr/FRPanRev" 16 1 -63 63 0 "" integer any rw 1 +OK prminfo 44 "MIXER:Current/StInCh/Surr/Div" 16 1 0 100 100 "" integer any rw 1 +-- prminfo 45 "MIXER:Current/StInCh/Surr/LOn" 16 1 0 1 1 "" integer any rw 1 +-- prminfo 46 "MIXER:Current/StInCh/Surr/ROn" 16 1 0 1 1 "" integer any rw 1 +-- prminfo 47 "MIXER:Current/StInCh/Surr/COn" 16 1 0 1 1 "" integer any rw 1 +-- prminfo 48 "MIXER:Current/StInCh/Surr/LFEOn" 16 1 0 1 1 "" integer any rw 1 +-- prminfo 49 "MIXER:Current/StInCh/Surr/LsOn" 16 1 0 1 1 "" integer any rw 1 +-- prminfo 50 "MIXER:Current/StInCh/Surr/RsOn" 16 1 0 1 1 "" integer any rw 1 +-- prminfo 51 "MIXER:Current/StInCh/Surr/LFELevel" 16 1 -32768 1000 -32768 "" integer any rw 1 +-- prminfo 52 "MIXER:Current/StInCh/Port/HA/Gain" 16 1 -600 6600 -600 "" integer any rw 1 +-- prminfo 53 "MIXER:Current/StInCh/Dyna1/Type" 16 1 0 10 "Gate" "" string any rw 1 +OK prminfo 54 "MIXER:Current/StInCh/Dyna1/Threshold" 16 1 -720 0 -260 "" integer any rw 1 +-- prminfo 55 "MIXER:Current/StInCh/Dyna2/Type" 16 1 0 11 "Compressor" "" string any rw 1 +OK prminfo 56 "MIXER:Current/StInCh/Dyna2/Threshold" 16 1 -540 0 -80 "" integer any rw 1 +-- prminfo 57 "MIXER:Current/Mtrx/Dyna1/Type" 8 1 0 11 "Compressor" "" string any rw 1 +OK prminfo 58 "MIXER:Current/Mtrx/Dyna1/Threshold" 8 1 -540 0 -80 "" integer any rw 1 +-- prminfo 59 "MIXER:Current/St/Dyna1/Type" 3 1 0 11 "Compressor" "" string any rw 1 +OK prminfo 60 "MIXER:Current/St/Dyna1/Threshold" 3 1 -540 0 -80 "" integer any rw 1 +-- prminfo 61 "MIXER:Current/StIn/DCA/Assign" 16 16 0 1 0 "" integer any rw 1 +OK prminfo 62 "MIXER:Current/StInCh/DCA/Assign" 16 16 0 1 0 "" integer any rw 1 +OK prminfo 63 "MIXER:Current/Mtrx/DCA/Assign" 8 16 0 1 0 "" integer any rw 1 +OK prminfo 64 "MIXER:Current/St/DCA/Assign" 3 16 0 1 0 "" integer any rw 1 +-- prminfo 65 "MIXER:Current/StIn/Label/Name" 16 1 0 8 "Rt1L" "" string any rw 1 +OK prminfo 66 "MIXER:Current/StInCh/Label/Name" 16 1 0 8 "Rt1L" "" string any rw 1 +OK prminfo 67 "MIXER:Current/Mtrx/Label/Name" 8 1 0 8 "MT 1" "" string any rw 1 +OK prminfo 68 "MIXER:Current/St/Label/Name" 3 1 0 8 "ST L" "" string any rw 1 +OK prminfo 69 "MIXER:Current/DCA/Label/Name" 16 1 0 8 "DCA 1" "" string any rw 1 +OK prminfo 70 "MIXER:Current/MuteMaster/Label/Name" 8 1 0 8 "MUTE 1" "" string any rw 1 +-- prminfo 71 "MIXER:Current/StIn/Label/Color" 16 1 0 7 "Blue" "" string any rw 1 +OK prminfo 72 "MIXER:Current/StInCh/Label/Color" 16 1 0 7 "Blue" "" string any rw 1 +OK prminfo 73 "MIXER:Current/Mtrx/Label/Color" 8 1 0 7 "Orange" "" string any rw 1 +OK prminfo 74 "MIXER:Current/St/Label/Color" 3 1 0 7 "Orange" "" string any rw 1 +OK prminfo 75 "MIXER:Current/DCA/Label/Color" 16 1 0 7 "Yellow" "" string any rw 1 +-- prminfo 76 "MIXER:Current/StIn/ToMtrx/Level" 16 8 -32768 1000 -32768 "" integer any rw 1 +-- prminfo 77 "MIXER:Current/StIn/ToMtrx/On" 16 8 0 1 1 "" integer any rw 1 +OK prminfo 78 "MIXER:Current/StInCh/ToMtrx/Level" 16 8 -32768 1000 -32768 "" integer any rw 1 +OK prminfo 79 "MIXER:Current/StInCh/ToMtrx/On" 16 8 0 1 1 "" integer any rw 1 +OK prminfo 80 "MIXER:Current/St/ToMtrx/Level" 3 8 -32768 1000 -32768 "" integer any rw 1 +OK prminfo 81 "MIXER:Current/St/ToMtrx/On" 3 8 0 1 1 "" integer any rw 1 +OK prminfo 82 "MIXER:Current/Monitor/On" 1 1 0 1 1 "" integer any rw 1 +OK prminfo 83 "MIXER:Current/Monitor/DimmerOn" 1 1 0 1 0 "" integer any rw 1 +-- prminfo 84 "MIXER:Current/Monitor/PhonesLevelLink" 1 1 0 1 1 "" integer any rw 1 +OK prminfo 85 "MIXER:Current/Monitor/CueInterruption" 1 1 0 1 1 "" integer any rw 1 +OK prminfo 86 "MIXER:Current/Monitor/Fader/Level" 1 1 -32768 1000 0 "" integer any rw 1 +-- prminfo 87 "MIXER:Current/Monitor/DelayAutoBypass" 1 1 0 1 1 "" integer any rw 1 +-- prminfo 88 "MIXER:Current/Monitor/St/SourceSelect" 1 1 0 10 "Stereo" "" string any rw 1 +-- prminfo 89 "MIXER:Current/Monitor/St/SourceCh/Mtrx" 8 1 0 1 0 "" integer any rw 1 +-- prminfo 90 "MIXER:Current/Monitor/St/SourceCh/St" 2 1 0 1 0 "" integer any rw 1 +-- prminfo 91 "MIXER:Current/Monitor/St/SourceCh/LocalInput" 4 1 0 1 0 "" integer any rw 1 +-- prminfo 92 "MIXER:Current/Monitor/St/SourceCh/Rec" 1 1 0 1 0 "" integer any rw 1 +-- prminfo 93 "MIXER:Current/Monitor/St/MonoMonitor" 1 1 0 1 0 "" integer any rw 1 +-- prminfo 94 "MIXER:Current/Monitor/Surr/SourceSelect" 1 1 0 11 "Mix1-6" "" string any rw 1 +-- prminfo 95 "MIXER:Current/Monitor/Surr/SourceCh" 1 1 0 9 "EXT ST1" "" string any rw 1 +-- prminfo 96 "MIXER:Current/Monitor/Surr/SoloMode" 1 1 0 1 0 "" integer any rw 1 +-- prminfo 97 "MIXER:Current/Monitor/Surr/LOn" 1 1 0 1 1 "" integer any rw 1 +-- prminfo 98 "MIXER:Current/Monitor/Surr/ROn" 1 1 0 1 1 "" integer any rw 1 +-- prminfo 99 "MIXER:Current/Monitor/Surr/COn" 1 1 0 1 1 "" integer any rw 1 +-- prminfo 100 "MIXER:Current/Monitor/Surr/LFEOn" 1 1 0 1 1 "" integer any rw 1 +-- prminfo 101 "MIXER:Current/Monitor/Surr/LsOn" 1 1 0 1 1 "" integer any rw 1 +-- prminfo 102 "MIXER:Current/Monitor/Surr/RsOn" 1 1 0 1 1 "" integer any rw 1 +-- prminfo 103 "MIXER:Current/Monitor/DownMix/Type" 1 1 0 6 "5.1" "" string any rw 1 +-- prminfo 104 "MIXER:Current/Monitor/DownMix/LToLOn" 1 1 0 1 1 "" integer any rw 1 +-- prminfo 105 "MIXER:Current/Monitor/DownMix/LToROn" 1 1 0 1 0 "" integer any rw 1 +-- prminfo 106 "MIXER:Current/Monitor/DownMix/RToLOn" 1 1 0 1 0 "" integer any rw 1 +-- prminfo 107 "MIXER:Current/Monitor/DownMix/RToROn" 1 1 0 1 1 "" integer any rw 1 +-- prminfo 108 "MIXER:Current/Monitor/DownMix/CToLOn" 1 1 0 1 1 "" integer any rw 1 +-- prminfo 109 "MIXER:Current/Monitor/DownMix/CToROn" 1 1 0 1 1 "" integer any rw 1 +-- prminfo 110 "MIXER:Current/Monitor/DownMix/LFEToLOn" 1 1 0 1 0 "" integer any rw 1 +-- prminfo 111 "MIXER:Current/Monitor/DownMix/LFEToROn" 1 1 0 1 0 "" integer any rw 1 +-- prminfo 112 "MIXER:Current/Monitor/DownMix/LsToLOn" 1 1 0 1 1 "" integer any rw 1 +-- prminfo 113 "MIXER:Current/Monitor/DownMix/LsToROn" 1 1 0 1 0 "" integer any rw 1 +-- prminfo 114 "MIXER:Current/Monitor/DownMix/RsToLOn" 1 1 0 1 0 "" integer any rw 1 +-- prminfo 115 "MIXER:Current/Monitor/DownMix/RsToROn" 1 1 0 1 1 "" integer any rw 1 +-- prminfo 116 "MIXER:Current/Monitor/DownMix/LToLRLevel" 1 1 -32768 0 0 "" integer any rw 1 +-- prminfo 117 "MIXER:Current/Monitor/DownMix/RToLRLevel" 1 1 -32768 0 0 "" integer any rw 1 +-- prminfo 118 "MIXER:Current/Monitor/DownMix/CToLRLevel" 1 1 -32768 0 -300 "" integer any rw 1 +-- prminfo 119 "MIXER:Current/Monitor/DownMix/LFEToLRLevel" 1 1 -32768 0 -32768 "" integer any rw 1 +-- prminfo 120 "MIXER:Current/Monitor/DownMix/LsToLRLevel" 1 1 -32768 0 -300 "" integer any rw 1 +-- prminfo 121 "MIXER:Current/Monitor/DownMix/RsToLRLevel" 1 1 -32768 0 -300 "" integer any rw 1 +-- prminfo 122 "MIXER:Current/Monitor/DownMix/MasterLevel" 1 1 -32768 0 -300 "" integer any rw 1 +OK prminfo 123 "MIXER:Current/Cue/Output" 1 1 0 1 0 "" integer any rw 1 +-- prminfo 124 "MIXER:Current/Cue/CueMode" 1 1 0 8 "Mix Cue" "" string any rw 1 +-- prminfo 125 "MIXER:Current/Cue/Surr/CueMode" 1 1 0 8 "Mix Cue" "" string any rw 1 +OK prminfo 126 "MIXER:Current/Cue/FaderCueRelease" 1 1 0 1 0 "" integer any rw 1 +-- prminfo 127 "MIXER:Current/Cue/InCh/Point" 1 1 0 8 "PFL" "" string any rw 1 +-- prminfo 128 "MIXER:Current/Cue/OutCh/Point" 1 1 0 3 "PFL" "" string any rw 1 +-- prminfo 129 "MIXER:Current/Cue/DCA/Point" 1 1 0 8 "Pre Pan" "" string any rw 1 +-- prminfo 130 "MIXER:Current/Cue/DCA/Unity" 1 1 0 1 0 "" integer any rw 1 +OK prminfo 131 "MIXER:Current/Cue/OutputLevel" 1 1 -32768 1000 0 "" integer any rw 1 +-- prminfo 132 "MIXER:Current/Cue/ActiveCue" 1 1 0 10 "None" "" string any r 1 +-- prminfo 133 "MIXER:Current/Cue/StIn/On" 16 1 0 1 0 "" integer any rw 1 +OK prminfo 134 "MIXER:Current/Cue/StInCh/On" 16 1 0 1 0 "" integer any rw 1 +OK prminfo 135 "MIXER:Current/Cue/Mtrx/On" 8 1 0 1 0 "" integer any rw 1 +OK prminfo 136 "MIXER:Current/Cue/St/On" 3 1 0 1 0 "" integer any rw 1 +OK prminfo 137 "MIXER:Current/Cue/DCA/On" 16 1 0 1 0 "" integer any rw 1 +-- prminfo 138 "MIXER:Current/StIn/Patch" 16 1 0 8 "FX5 L(A)" "" string any rw 1 +OK prminfo 139 "MIXER:Current/StInCh/Patch" 16 1 0 8 "FX5 L(A)" "" string any rw 1 +OK prminfo 140 "MIXER:Current/Recorder/Patch" 1 2 0 12 "ST L" "" string any rw 1 +OK prminfo 141 "MIXER:Current/DigitalOutPort/Patch" 2 1 0 12 "ST L" "" string any rw 1 +-- prminfo 142 "MIXER:Setup/MonitorMix/Password" 1 1 0 24 "" "" string any r 1 +OK prminfo 143 "MIXER:Current/StInCh/Label/Icon" 16 1 0 12 "Effect" "" string any rw 1 +OK prminfo 144 "MIXER:Current/StInCh/ToMtrx/Pan" 16 8 -63 63 0 "" integer any rw 1 +OK prminfo 145 "MIXER:Current/StInCh/ToMtrx/PrePost" 16 8 0 1 0 "" integer any rw 1 +-- prminfo 146 "MIXER:Current/Mtrx/BusType" 8 1 0 5 "VARI" "" string any rw 1 +OK prminfo 147 "MIXER:Current/Mtrx/Label/Icon" 8 1 0 7 "Blank" "" string any rw 1 +-- prminfo 148 "MIXER:Current/Mtrx/PanLink" 8 1 0 1 0 "" integer any rw 1 +OK prminfo 149 "MIXER:Current/St/Label/Icon" 3 1 0 12 "Blank" "" string any rw 1 +OK prminfo 150 "MIXER:Current/St/ToMtrx/Pan" 3 8 -63 63 0 "" integer any rw 1 +OK prminfo 151 "MIXER:Current/St/ToMtrx/PrePost" 3 8 0 1 0 "" integer any rw 1 +-- prminfo 152 "MIXER:Current/InputChLink/StInCh/Assign" 16 1 0 40 0 "" integer any r 1 +-- prminfo 153 "MIXER:Current/InputChLink/LinkParams/EQ" 40 1 0 1 1 "" integer any r 1 +-- prminfo 154 "MIXER:Current/InputChLink/LinkParams/Insert" 40 1 0 1 1 "" integer any r 1 +-- prminfo 155 "MIXER:Current/InputChLink/LinkParams/Fader" 40 1 0 1 1 "" integer any r 1 +-- prminfo 156 "MIXER:Current/InputChLink/LinkParams/ChOn" 40 1 0 1 1 "" integer any r 1 +-- prminfo 157 "MIXER:Current/InputChLink/LinkParams/ToSt" 40 1 0 1 1 "" integer any r 1 +-- prminfo 158 "MIXER:Current/InputChLink/LinkParams/DCA" 40 1 0 1 1 "" integer any r 1 +-- prminfo 159 "MIXER:Current/InputChLink/LinkParams/Mute" 40 1 0 1 1 "" integer any r 1 +-- prminfo 160 "MIXER:Current/InputChLink/LinkParams/MatrixSend" 40 1 0 1 1 "" integer any r 1 +-- prminfo 161 "MIXER:Current/InputChLink/LinkParams/MatrixSendOn" 40 1 0 1 1 "" integer any r 1 +-- prminfo 162 "MIXER:Current/InputChLink/LinkParams/Dyna1" 40 1 0 1 1 "" integer any r 1 +-- prminfo 163 "MIXER:Current/InputChLink/LinkParams/Dyna2" 40 1 0 1 1 "" integer any r 1 +-- prminfo 164 "MIXER:Current/InputChLink/LinkParams/HA" 40 1 0 1 1 "" integer any r 1 +-- prminfo 165 "MIXER:Current/InputChLink/LinkParams/HPF" 40 1 0 1 1 "" integer any r 1 +-- prminfo 166 "MIXER:Current/InputChLink/LinkParams/DigitalGain" 40 1 0 1 1 "" integer any r 1 +-- prminfo 167 "MIXER:Current/InputChLink/LinkParams/DirectOut" 40 1 0 1 1 "" integer any r 1 +-- prminfo 168 "MIXER:Current/InputChLink/LinkParams/MixSend" 40 1 0 1 1 "" integer any r 1 +-- prminfo 169 "MIXER:Current/InputChLink/LinkParams/MixSendOn" 40 1 0 1 1 "" integer any r 1 +-- prminfo 170 "MIXER:Current/InputChLink/LinkParams/Delay" 40 1 0 1 1 "" integer any r 1 +-- prminfo 171 "MIXER:Current/InputChLink/SendParams/ToMtrx" 40 8 0 1 1 "" integer any r 1 +-- prminfo 172 "MIXER:Current/OutputChLink/Mtrx/Assign" 8 1 0 17 0 "" integer any r 1 +-- prminfo 173 "MIXER:Current/OutputChLink/LinkParams/EQ" 16 1 0 1 1 "" integer any r 1 +-- prminfo 174 "MIXER:Current/OutputChLink/LinkParams/Insert" 16 1 0 1 1 "" integer any r 1 +-- prminfo 175 "MIXER:Current/OutputChLink/LinkParams/Fader" 16 1 0 1 1 "" integer any r 1 +-- prminfo 176 "MIXER:Current/OutputChLink/LinkParams/ChOn" 16 1 0 1 1 "" integer any r 1 +-- prminfo 177 "MIXER:Current/OutputChLink/LinkParams/ToSt" 16 1 0 1 1 "" integer any r 1 +-- prminfo 178 "MIXER:Current/OutputChLink/LinkParams/DCA" 16 1 0 1 1 "" integer any r 1 +-- prminfo 179 "MIXER:Current/OutputChLink/LinkParams/Mute" 16 1 0 1 1 "" integer any r 1 +-- prminfo 180 "MIXER:Current/OutputChLink/LinkParams/MatrixSend" 16 1 0 1 1 "" integer any r 1 +-- prminfo 181 "MIXER:Current/OutputChLink/LinkParams/MatrixSendOn" 16 1 0 1 1 "" integer any r 1 +-- prminfo 182 "MIXER:Current/OutputChLink/LinkParams/Dyna1" 16 1 0 1 1 "" integer any r 1 +-- prminfo 183 "MIXER:Current/OutputChLink/SendParams/ToMtrx" 16 8 0 1 1 "" integer any r 1 +OK prminfo 184 "MIXER:Current/InCh/Fader/Level" 72 1 -32768 1000 -32768 "" integer any rw 1 +OK prminfo 185 "MIXER:Current/Mix/Fader/Level" 24 1 -32768 1000 0 "" integer any rw 1 +OK prminfo 186 "MIXER:Current/InCh/Fader/On" 72 1 0 1 1 "" integer any rw 1 +OK prminfo 187 "MIXER:Current/Mix/Fader/On" 24 1 0 1 1 "" integer any rw 1 +-- prminfo 188 "MIXER:Current/InCh/PanMode" 72 1 0 0 0 "" integer any r 1 +OK prminfo 189 "MIXER:Current/InCh/ToSt/Pan" 72 1 -63 63 0 "" integer any rw 1 +-- prminfo 190 "MIXER:Current/InCh/Role" 72 1 0 7 "Mono" "" string any r 1 +-- prminfo 191 "MIXER:Current/Mix/PanMode" 24 1 0 1 0 "" integer any r 1 +OK prminfo 192 "MIXER:Current/Mix/ToSt/Pan" 24 1 -63 63 0 "" integer any rw 1 +OK prminfo 193 "MIXER:Current/Mix/Out/Balance" 24 1 -63 63 0 "" integer any rw 1 +-- prminfo 194 "MIXER:Current/Mix/Role" 24 1 0 7 "Mono" "" string any r 1 +-- prminfo 195 "MIXER:Current/InCh/Surr/LRPan" 72 1 -63 63 0 "" integer any rw 1 +-- prminfo 196 "MIXER:Current/InCh/Surr/FRPan" 72 1 -63 63 0 "" integer any rw 1 +-- prminfo 197 "MIXER:Current/InCh/Surr/FRPanRev" 72 1 -63 63 0 "" integer any rw 1 +OK prminfo 198 "MIXER:Current/InCh/Surr/Div" 72 1 0 100 100 "" integer any rw 1 +-- prminfo 199 "MIXER:Current/InCh/Surr/LOn" 72 1 0 1 1 "" integer any rw 1 +-- prminfo 200 "MIXER:Current/InCh/Surr/ROn" 72 1 0 1 1 "" integer any rw 1 +-- prminfo 201 "MIXER:Current/InCh/Surr/COn" 72 1 0 1 1 "" integer any rw 1 +-- prminfo 202 "MIXER:Current/InCh/Surr/LFEOn" 72 1 0 1 1 "" integer any rw 1 +-- prminfo 203 "MIXER:Current/InCh/Surr/LsOn" 72 1 0 1 1 "" integer any rw 1 +-- prminfo 204 "MIXER:Current/InCh/Surr/RsOn" 72 1 0 1 1 "" integer any rw 1 +-- prminfo 205 "MIXER:Current/InCh/Surr/LFELevel" 72 1 -32768 1000 -32768 "" integer any rw 1 +OK prminfo 206 "MIXER:Current/InCh/Port/HA/Gain" 72 1 -600 6600 -600 "" integer any rw 1 +-- prminfo 207 "MIXER:Current/InCh/Dyna1/Type" 72 1 0 10 "Gate" "" string any rw 1 +OK prminfo 208 "MIXER:Current/InCh/Dyna1/Threshold" 72 1 -720 0 -260 "" integer any rw 1 +-- prminfo 209 "MIXER:Current/InCh/Dyna2/Type" 72 1 0 11 "Compressor" "" string any rw 1 +OK prminfo 210 "MIXER:Current/InCh/Dyna2/Threshold" 72 1 -540 0 -80 "" integer any rw 1 +-- prminfo 211 "MIXER:Current/Mix/Dyna1/Type" 24 1 0 11 "Compressor" "" string any rw 1 +OK prminfo 212 "MIXER:Current/Mix/Dyna1/Threshold" 24 1 -540 0 -80 "" integer any rw 1 +OK prminfo 213 "MIXER:Current/InCh/DCA/Assign" 72 16 0 1 0 "" integer any rw 1 +OK prminfo 214 "MIXER:Current/Mix/DCA/Assign" 24 16 0 1 0 "" integer any rw 1 +OK prminfo 215 "MIXER:Current/InCh/Label/Name" 72 1 0 8 "ch 1" "" string any rw 1 +OK prminfo 216 "MIXER:Current/Mix/Label/Name" 24 1 0 8 "MX 1" "" string any rw 1 +OK prminfo 217 "MIXER:Current/InCh/Label/Color" 72 1 0 7 "Blue" "" string any rw 1 +OK prminfo 218 "MIXER:Current/Mix/Label/Color" 24 1 0 7 "Orange" "" string any rw 1 +OK prminfo 219 "MIXER:Current/InCh/ToMix/Level" 72 24 -32768 1000 -32768 "" integer any rw 1 +OK prminfo 220 "MIXER:Current/InCh/ToMix/On" 72 24 0 1 1 "" integer any rw 1 +-- prminfo 221 "MIXER:Current/StIn/ToMix/Level" 16 24 -32768 1000 -32768 "" integer any rw 1 +-- prminfo 222 "MIXER:Current/StIn/ToMix/On" 16 24 0 1 1 "" integer any rw 1 +OK prminfo 223 "MIXER:Current/StInCh/ToMix/Level" 16 24 -32768 1000 -32768 "" integer any rw 1 +OK prminfo 224 "MIXER:Current/StInCh/ToMix/On" 16 24 0 1 1 "" integer any rw 1 +OK prminfo 225 "MIXER:Current/InCh/ToMtrx/Level" 72 8 -32768 1000 -32768 "" integer any rw 1 +OK prminfo 226 "MIXER:Current/InCh/ToMtrx/On" 72 8 0 1 1 "" integer any rw 1 +OK prminfo 227 "MIXER:Current/Mix/ToMtrx/Level" 24 8 -32768 1000 -32768 "" integer any rw 1 +OK prminfo 228 "MIXER:Current/Mix/ToMtrx/On" 24 8 0 1 1 "" integer any rw 1 +-- prminfo 229 "MIXER:Current/Monitor/St/SourceCh/Mix" 24 1 0 1 0 "" integer any rw 1 +OK prminfo 230 "MIXER:Current/Cue/InCh/On" 72 1 0 1 0 "" integer any rw 1 +OK prminfo 231 "MIXER:Current/Cue/Mix/On" 24 1 0 1 0 "" integer any rw 1 +OK prminfo 232 "MIXER:Current/InCh/Patch" 72 1 0 8 "DANTE1" "" string any rw 1 +OK prminfo 233 "MIXER:Current/DanteOutPort/Patch" 64 1 0 12 "MIX1" "" string any rw 1 +OK prminfo 234 "MIXER:Current/OmniOutPort/Patch" 8 1 0 12 "MIX1" "" string any rw 1 +OK prminfo 235 "MIXER:Current/SlotOut1Port/Patch" 1 16 0 12 "MIX1" "" string any rw 1 +OK prminfo 236 "MIXER:Current/SlotOut2Port/Patch" 1 16 0 12 "MIX17" "" string any rw 1 +OK prminfo 237 "MIXER:Current/SlotOut3Port/Patch" 1 16 0 12 "ST L" "" string any rw 1 +OK prminfo 238 "CL:Current/CustomFaderBank/A/SourceCh" 2 16 0 11 "NO ASSIGN" "" string any rw 1 +OK prminfo 239 "CL:Current/CustomFaderBank/B/CentraOut/SourceCh" 1 8 0 11 "NO ASSIGN" "" string any rw 1 +OK prminfo 240 "CL:Current/CustomFaderBank/C/SourceCh" 6 8 0 11 "NO ASSIGN" "" string any rw 1 +OK prminfo 241 "CL:Current/CustomFaderBank/Master/SourceCh" 1 2 0 11 "ST" "" string any rw 1 +OK prminfo 242 "CL:Current/FaderBank/A/Recall" 1 1 0 8 0 "" integer any rw 1 +OK prminfo 243 "CL:Current/FaderBank/B/Centralogic/Select" 1 1 0 1 0 "" integer any rw 1 +OK prminfo 244 "CL:Current/FaderBank/B/CentraIn/Recall" 1 1 0 8 0 "" integer any rw 1 +OK prminfo 245 "CL:Current/FaderBank/B/CentraOut/Recall" 1 1 0 8 0 "" integer any rw 1 +OK prminfo 246 "CL:Current/FaderBank/C/Recall" 1 1 0 8 0 "" integer any rw 1 +OK prminfo 247 "MIXER:Current/InCh/Label/Icon" 72 1 0 12 "DynamicMic" "" string any rw 1 +OK prminfo 248 "MIXER:Current/InCh/ToMix/Pan" 72 24 -63 63 0 "" integer any rw 1 +OK prminfo 249 "MIXER:Current/InCh/ToMix/PrePost" 72 24 0 1 0 "" integer any rw 1 +OK prminfo 250 "MIXER:Current/InCh/ToMtrx/Pan" 72 8 -63 63 0 "" integer any rw 1 +OK prminfo 251 "MIXER:Current/InCh/ToMtrx/PrePost" 72 8 0 1 0 "" integer any rw 1 +OK prminfo 252 "MIXER:Current/StInCh/ToMix/Pan" 16 24 -63 63 0 "" integer any rw 1 +OK prminfo 253 "MIXER:Current/StInCh/ToMix/PrePost" 16 24 0 1 0 "" integer any rw 1 +-- prminfo 254 "MIXER:Current/Mix/BusType" 24 1 0 5 "VARI" "" string any rw 1 +OK prminfo 255 "MIXER:Current/Mix/Label/Icon" 24 1 0 12 "Blank" "" string any rw 1 +-- prminfo 256 "MIXER:Current/Mix/PanLink" 24 1 0 1 0 "" integer any rw 1 +OK prminfo 257 "MIXER:Current/Mix/ToMtrx/Pan" 24 8 -63 63 0 "" integer any rw 1 +OK prminfo 258 "MIXER:Current/Mix/ToMtrx/PrePost" 24 8 0 1 0 "" integer any rw 1 +-- prminfo 259 "MIXER:Current/InputChLink/InCh/Assign" 72 1 0 40 0 "" integer any r 1 +-- prminfo 260 "MIXER:Current/InputChLink/SendParams/ToMix" 40 24 0 1 1 "" integer any r 1 +OK prminfo 261 "MIXER:Current/OutputChLink/Mix/Assign" 24 1 0 17 0 "" integer any r 1 +OK prminfo 262 "QL:Current/CustomFaderBank/SourceCh" 4 32 0 11 "NO ASSIGN" "" string any rw 1 +OK prminfo 263 "QL:Current/CustomFaderBank/Master/SourceCh" 4 2 0 11 "NO ASSIGN" "" string any rw 1 +OK prminfo 264 "QL:Current/FaderBank/Select" 1 1 0 1 0 "" integer any rw 1 +OK prminfo 265 "QL:Current/FaderBank/Bank/Recall" 1 3 0 8 0 "" integer any rw 1 +OK prminfo 266 "QL:Current/FaderBank/Bank/Toggle" 1 1 0 8 0 "" integer any rw 1 OK scninfo 1000 "MIXER:Lib/Scene" 300 1 0 0 0 "" scene any rw 1 \ No newline at end of file diff --git a/HELP.md b/HELP.md index 4f40de9e..4b0d4e52 100644 --- a/HELP.md +++ b/HELP.md @@ -1,4 +1,4 @@ -## Yamaha Simple Control Protocol - v1.4.1 +## Yamaha Remote Control Protocol - v1.6.0 Please visit http://www.checkcheckonetwo.com for help, discussions, suggestions, etc. @@ -8,31 +8,18 @@ Please visit http://www.checkcheckonetwo.com for help, discussions, suggestions, **Instructions** -"MY CHANNEL" +**"MY CHANNEL"** - This setting (in the settings tab - click Edit on the instance tab) allows you to select a channel that will - be updated in any actions that choose "My Channel" as the channel number instead of CH 1 CH 2 etc. Using - this means that you can create a layout that can have a specific channel on many buttons that can be changed - at any time. Useful when things move around from show to show, and then you don't have to change settings - on a bunch of buttons. +>This setting (in the settings tab - click Edit on the instance tab) allows you to select a channel that will be updated in any actions that choose "My Channel" as the channel number instead of CH 1 CH 2 etc. Using this means that you can create a layout that can have a specific channel on many buttons that can be changed at any time. Useful when things move around from show to show, and then you don't have to change settings on a bunch of buttons. -MACROS ("Learn" Function) - - This will only work while connected to a console. +**MACROS** ("Learn" Function) - Drag the "Record SCP Macro" Preset to your page, press it to start recording, do stuff, then press it again to - stop recording. Go back to your presets and there'll be a new "Macro x" preset that you can now drag to - your page. +>This will only work while connected to a console. - New Macros will disappear when you restart companion, so make sure you drag the ones you want to keep onto - a button! +>Drag the "Record RCP Macro" Preset to your page, press it to start recording, do stuff, then press it again to stop recording. All the actions you performed are now stored to that button. The button's name will change to **Macro x** (where x is the macro #) - Don't forget that you can create a macro by pressing a SD button (while recording) that already has actions - on it while a console is connected. - The new Macro will have those commands in it as well as any you added before you pressed the button or - after! +>Don't forget that you can create a macro by pressing a SD button (while recording) that already has actions on it while a console is connected.The new Macro will have those commands in it as well as any you added before you pressed the button or after! -DYNAMIC CHANNEL PARAMETERS +**DYNAMIC CHANNEL PARAMETERS** - If you add name or color feedback for a button, (e.g. InCh/Label/Name or DCA/Label/Color), the module - will pull the name or color from the matching channel and change the button text or color accordingly. \ No newline at end of file +>If you add name or color feedback for a button, (e.g. InCh/Label/Name or DCA/Label/Color), the module will pull the name or color from the matching channel and change the button text or color accordingly. \ No newline at end of file diff --git a/README.md b/README.md index ba58c72b..be23781a 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ -## Yamaha Simple Control Protocol +## Yamaha Remote Control Protocol **Available for the following Yamaha Pro Audio Devices** +* Rivage PM * CL1/3/5 * QL1/5 * TF1/3/5 @@ -9,11 +10,9 @@ **Available commands** -* All available SCP "set" commands +* Selected "set" commands * Recall Scenes -Looking to add other functions such as macros and USB playback and whatever else! - Many thanks to Jack Longden for starting this off and inspiring me to continue. Please visit http://www.checkcheckonetwo.com for help, discussions, suggestions, etc. @@ -24,75 +23,84 @@ Please visit http://www.checkcheckonetwo.com for help, discussions, suggestions, **REVISION HISTORY** -v1.1.0 Initial Commit +v1.6.0 Rename module, Change action names to be consistent across consoles + +v1.5.1 Added Toggle function and updated feedback to new format - To Do: QL/TF testing - -v1.1.1 Bug Fixes - - Fix: Custom Fader Bank values corrected - Enhancement: Custom Fader Bank dropdown for channel names - Enhancement: Dropdown for channel colors +v1.5.0 New Features -v1.1.2 Bug Fix + Added support for PM Rivage Series mixers + Changed Macro function to work the same as Yamaha-MIDI module - Fix: Crash on unknown command in QL - Enhancement: Add QL-specific commands +v1.4.1 Added "Div" commands -v1.1.3 Bug Fixes and Enhancements +v1.4.0 Additional dropdowns for patch & Icons, Rebuild of feedback code (thank you Keith!) - Fix: Values for certain parameters off by 1 - Feedback could get out of sync - Code fixups - Enhancements: Sorted actions so they're grouped together +v1.3.6 Additional "My Channels" -v1.1.4 Enhancements +v1.3.5 Bug Fixes - Polling for Feedback - More TF5 commands + Changed erroneous TF parameters in an effort to make the Dynamic Parameters work for the TF + Parsing improved on commands from console + Don't send commands for disabled instances + Color & scene message fixes for TF + Custom layer fix for QL + Default value for checkbox parsing fix + Enabled search for dropdowns -v1.2.1 Re-Write +v1.3.3 Dynamic Parameters - Re-Written in ES6 style (no self, use classes and inline functions) - Separated upgradeScripts to separate file - Fixed global variables - More accurate feedback tracking + Added the ability for buttons to have channel names and colors automatically pulled from the console + if desired. -v1.2.2 Bug Fixes +v1.3.2 Bug Fixes - Changed feedback to work more like other modules - Fixed Action names + Macros with negative values not played back correctly + Multiple Record Macro Buttons would appear in certain situations + +v1.3.1 Enhancement + + Macros! Add a Macro Button to record operations from the console or button presses on the SD v1.2.3 Enhancement Added "My Channel" to the config page to allow default channel selection without re-creating buttons -v1.3.1 Enhancement +v1.2.2 Bug Fixes - Macros! Add a Macro Button to record operations from the console or button presses on the SD + Changed feedback to work more like other modules + Fixed Action names -v1.3.2 Bug Fixes +v1.2.1 Re-Write - Macros with negative values not played back correctly - Multiple Record Macro Buttons would appear in certain situations + Re-Written in ES6 style (no self, use classes and inline functions) + Separated upgradeScripts to separate file + Fixed global variables + More accurate feedback tracking -v1.3.3 Dynamic Parameters +v1.1.4 Enhancements - Added the ability for buttons to have channel names and colors automatically pulled from the console - if desired. + Polling for Feedback + More TF5 commands -v1.3.5 Bug Fixes +v1.1.3 Bug Fixes and Enhancements - Changed erroneous TF parameters in an effort to make the Dynamic Parameters work for the TF - Parsing improved on commands from console - Don't send commands for disabled instances - Color & scene message fixes for TF - Custom layer fix for QL - Default value for checkbox parsing fix - Enabled search for dropdowns + Fix: Values for certain parameters off by 1 + Feedback could get out of sync + Code fixups + Enhancements: Sorted actions so they're grouped together -v1.3.6 Additional "My Channels" +v1.1.2 Bug Fix -v1.4.0 Additional dropdowns for patch & Icons, Rebuild of feedback code (thank you Keith!) + Fix: Crash on unknown command in QL + Enhancement: Add QL-specific commands -v1.4.1 Added "Div" commands +v1.1.1 Bug Fixes + + Fix: Custom Fader Bank values corrected + Enhancement: Custom Fader Bank dropdown for channel names + Enhancement: Dropdown for channel colors + +v1.1.0 Initial Commit + + To Do: QL/TF testing \ No newline at end of file diff --git a/Rivage Parameters-1.txt b/Rivage Parameters-1.txt new file mode 100644 index 00000000..815ce615 --- /dev/null +++ b/Rivage Parameters-1.txt @@ -0,0 +1,65 @@ +OK prminfo 0 "MIXER:Current/InCh/PatchSelect" 120 1 0 1 0 "" integer latchsw rw 1 +OK prminfo 1 "MIXER:Current/InCh/Label/Color" 120 1 0 0 "Blue" "" string list r 1 +OK prminfo 2 "MIXER:Current/InCh/Label/Icon" 120 1 0 0 "DynamicMic" "" string list r 1 +OK prminfo 3 "MIXER:Current/InCh/Label/Name" 120 1 0 0 "" "" string any r 1 +-- prminfo 4 "MIXER:Current/InCh/Role" 120 1 0 0 "Mono" "" string list r 1 +OK prminfo 5 "MIXER:Current/InCh/Delay/Time" 120 1 0 1000000 0 "ms" integer knob rw 1000 +OK prminfo 6 "MIXER:Current/InCh/Delay/On" 120 1 0 1 0 "" integer latchsw rw 1 +OK prminfo 7 "MIXER:Current/InCh/Fader/Level" 120 1 -32768 1000 -32768 "dB" integer fader rw 100 +OK prminfo 8 "MIXER:Current/InCh/Fader/On" 120 1 0 1 1 "" integer latchsw rw 1 +OK prminfo 9 "MIXER:Current/Mix/Label/Color" 48 1 0 0 "Orange" "" string list r 1 +OK prminfo 10 "MIXER:Current/Mix/Label/Icon" 48 1 0 0 "Blank" "" string list r 1 +OK prminfo 11 "MIXER:Current/Mix/Label/Name" 48 1 0 0 "" "" string any r 1 +-- prminfo 12 "MIXER:Current/Mix/Role" 48 1 0 0 "Mono" "" string list r 1 +-- prminfo 13 "MIXER:Current/Mix/BusType" 48 1 0 0 "VARI" "" string unlatchsw rw 1 +OK prminfo 14 "MIXER:Current/Mix/Delay/Time" 48 1 0 1000000 0 "ms" integer knob rw 1000 +OK prminfo 15 "MIXER:Current/Mix/Delay/On" 48 1 0 1 0 "" integer latchsw rw 1 +OK prminfo 16 "MIXER:Current/Mix/Fader/Level" 48 1 -32768 1000 0 "dB" integer fader rw 100 +OK prminfo 17 "MIXER:Current/Mix/Fader/On" 48 1 0 1 1 "" integer latchsw rw 1 +OK prminfo 18 "MIXER:Current/Mix/Out/Balance" 48 1 -63 63 0 "" integer knob rw 1 +-- prminfo 19 "MIXER:Current/Mix/PanLink" 48 1 0 1 0 "" integer latchsw rw 1 +-- prminfo 20 "MIXER:Current/Mix/MixMinus/Owner/InputChannel" 72 288 0 1 0 "" integer any r 1 +OK prminfo 21 "MIXER:Current/Mtrx/Label/Color" 24 1 0 0 "Orange" "" string list r 1 +OK prminfo 22 "MIXER:Current/Mtrx/Label/Icon" 24 1 0 0 "Blank" "" string list r 1 +OK prminfo 23 "MIXER:Current/Mtrx/Label/Name" 24 1 0 0 "" "" string any r 1 +-- prminfo 24 "MIXER:Current/Mtrx/Role" 24 1 0 0 "Mono" "" string list r 1 +OK prminfo 25 "MIXER:Current/Mtrx/Delay/Time" 24 1 0 1000000 0 "ms" integer knob rw 1000 +OK prminfo 26 "MIXER:Current/Mtrx/Delay/On" 24 1 0 1 0 "" integer latchsw rw 1 +OK prminfo 27 "MIXER:Current/Mtrx/Fader/Level" 24 1 -32768 1000 0 "dB" integer fader rw 100 +OK prminfo 28 "MIXER:Current/Mtrx/Fader/On" 24 1 0 1 1 "" integer latchsw rw 1 +OK prminfo 29 "MIXER:Current/Mtrx/Out/Balance" 24 1 -63 63 0 "" integer knob rw 1 +-- prminfo 30 "MIXER:Current/Mtrx/PanLink" 24 1 0 1 0 "" integer unlatchsw rw 1 +OK prminfo 31 "MIXER:Current/St/Label/Color" 4 1 0 0 "Orange" "" string list r 1 +OK prminfo 32 "MIXER:Current/St/Label/Icon" 4 1 0 0 "Blank" "" string list r 1 +OK prminfo 33 "MIXER:Current/St/Label/Name" 4 1 0 0 "" "" string any r 1 +-- prminfo 34 "MIXER:Current/St/Role" 4 1 0 0 "Mono" "" string list r 1 +OK prminfo 35 "MIXER:Current/St/Delay/Time" 4 1 0 1000000 0 "ms" integer knob rw 1000 +OK prminfo 36 "MIXER:Current/St/Delay/On" 4 1 0 1 0 "" integer latchsw rw 1 +OK prminfo 37 "MIXER:Current/St/Fader/On" 4 1 0 1 1 "" integer latchsw rw 1 +OK prminfo 38 "MIXER:Current/St/Out/Balance" 4 1 -63 63 0 "" integer knob rw 1 +OK prminfo 39 "MIXER:Current/DCA/Fader/Level" 24 1 -32768 1000 0 "dB" integer fader rw 100 +OK prminfo 40 "MIXER:Current/DCA/Fader/On" 24 1 0 1 1 "" integer latchsw rw 1 +OK prminfo 41 "MIXER:Current/MuteMaster/On" 12 1 0 1 0 "" integer latchsw rw 1 +OK prminfo 42 "MIXER:Current/InCh/ToMix/Level" 120 48 -32768 1000 -32768 "dB" integer fader rw 100 +OK prminfo 43 "MIXER:Current/InCh/ToMix/On" 120 48 0 1 1 "" integer latchsw rw 1 +OK prminfo 44 "MIXER:Current/InCh/ToMix/Pan" 120 48 -63 63 0 "" integer knob rw 1 +OK prminfo 45 "MIXER:Current/InCh/ToMtrx/Level" 120 24 -32768 1000 -32768 "dB" integer fader rw 100 +OK prminfo 46 "MIXER:Current/InCh/ToMtrx/On" 120 24 0 1 1 "" integer latchsw rw 1 +OK prminfo 47 "MIXER:Current/InCh/ToMtrx/Pan" 120 24 -63 63 0 "" integer knob rw 1 +OK prminfo 48 "MIXER:Current/Mix/ToMtrx/Level" 48 24 -32768 1000 -32768 "dB" integer fader rw 100 +OK prminfo 49 "MIXER:Current/Mix/ToMtrx/On" 48 24 0 1 1 "" integer latchsw rw 1 +OK prminfo 50 "MIXER:Current/Mix/ToMtrx/Pan" 48 24 -63 63 0 "" integer knob rw 1 +OK prminfo 51 "MIXER:Current/St/ToMtrx/Level" 4 24 -32768 1000 -32768 "dB" integer fader rw 100 +OK prminfo 52 "MIXER:Current/St/ToMtrx/On" 4 24 0 1 1 "" integer latchsw rw 1 +OK prminfo 53 "MIXER:Current/St/ToMtrx/Pan" 4 24 -63 63 0 "" integer knob rw 1 +-- prminfo 54 "MIXER:Current/InputChLink/InCh/Assign" 120 1 0 52 0 "" integer latchsw r 1 +-- prminfo 55 "MIXER:Current/InputChLink/LinkParams/MixSend" 53 1 0 1 1 "" integer latchsw r 1 +-- prminfo 56 "MIXER:Current/InputChLink/SendParams/ToMix" 53 48 0 1 1 "" integer latchsw r 1 +-- prminfo 57 "MIXER:Current/InputChLink/LinkParams/MatrixSend" 53 1 0 1 1 "" integer latchsw r 1 +-- prminfo 58 "MIXER:Current/InputChLink/SendParams/ToMtrx" 53 24 0 1 1 "" integer latchsw r 1 +-- prminfo 59 "MIXER:Current/OutputChLink/Mix/Assign" 48 1 0 52 0 "" integer latchsw r 1 +-- prminfo 60 "MIXER:Current/OutputChLink/LinkParams/MatrixSend" 53 1 0 1 1 "" integer latchsw r 1 +-- prminfo 61 "MIXER:Current/OutputChLink/SendParams/ToMtrx" 53 24 0 1 1 "" integer latchsw r 1 +-- prminfo 62 "MIXER:Setup/MonitorMix/Password" 1 1 0 0 "" "" string any r 1 +-- prminfo 63 "MIXER:Current/SurrMode" 1 1 0 1 0 "" integer any r 1 +OK scninfo 1000 "MIXER:Lib/Scene" 500 1 0 0 0 "" scene any rw 1 \ No newline at end of file diff --git a/TF5 SCP Parameters-1.txt b/TF5 Parameters-1.txt similarity index 95% rename from TF5 SCP Parameters-1.txt rename to TF5 Parameters-1.txt index 501e7907..fae82021 100644 --- a/TF5 SCP Parameters-1.txt +++ b/TF5 Parameters-1.txt @@ -47,17 +47,17 @@ OK prminfo 45 "MIXER:Current/FxRtnCh/ToMono/On" 4 1 0 1 1 "" integer any rw 1 OK prminfo 46 "MIXER:Current/FxRtnCh/ToSt/Pan" 4 0 -63 63 0 "" integer any rw 1 OK prminfo 47 "MIXER:Current/FxRtnCh/ToStereo/Pan" 4 0 -63 63 0 "" integer any rw 1 OK prminfo 48 "MIXER:Current/DCA/Fader/Level" 8 0 -32768 1000 0 "dB" integer any rw 100 -OK prminfo 49 "MIXER:Current/DcaCh/Fader/Level" 8 0 -32768 1000 0 "dB" integer any rw 100 +-- prminfo 49 "MIXER:Current/DcaCh/Fader/Level" 8 0 -32768 1000 0 "dB" integer any rw 100 OK prminfo 50 "MIXER:Current/DCA/Fader/On" 8 0 0 1 1 "" integer any rw 1 -OK prminfo 51 "MIXER:Current/DcaCh/Fader/On" 8 0 0 1 1 "" integer any rw 1 +-- prminfo 51 "MIXER:Current/DcaCh/Fader/On" 8 0 0 1 1 "" integer any rw 1 OK prminfo 52 "MIXER:Current/DCA/Label/Color" 8 0 0 8 0 "" string any rw 1 -OK prminfo 53 "MIXER:Current/DcaCh/Label/Color" 8 0 0 8 0 "" string any rw 1 +-- prminfo 53 "MIXER:Current/DcaCh/Label/Color" 8 0 0 8 0 "" string any rw 1 OK prminfo 54 "MIXER:Current/DCA/Label/Icon" 8 0 0 12 0 "" binary any rw 1 -OK prminfo 55 "MIXER:Current/DcaCh/Label/Icon" 8 0 0 12 0 "" binary any rw 1 +-- prminfo 55 "MIXER:Current/DcaCh/Label/Icon" 8 0 0 12 0 "" binary any rw 1 OK prminfo 56 "MIXER:Current/DCA/Label/Category" 8 0 0 16 0 "" binary any rw 1 -OK prminfo 57 "MIXER:Current/DcaCh/Label/Category" 8 0 0 16 0 "" binary any rw 1 +-- prminfo 57 "MIXER:Current/DcaCh/Label/Category" 8 0 0 16 0 "" binary any rw 1 OK prminfo 58 "MIXER:Current/DCA/Label/Name" 8 0 0 64 "DCA 1" "" string any rw 1 -OK prminfo 59 "MIXER:Current/DcaCh/Label/Name" 8 0 0 64 "DCA 1" "" string any rw 1 +-- prminfo 59 "MIXER:Current/DcaCh/Label/Name" 8 0 0 64 "DCA 1" "" string any rw 1 OK prminfo 60 "MIXER:Current/Mix/Fader/Level" 20 0 -32768 1000 0 "dB" integer any rw 100 OK prminfo 61 "MIXER:Current/Mix/Fader/On" 20 0 0 1 1 "" integer any rw 1 OK prminfo 62 "MIXER:Current/Mix/Label/Color" 20 0 0 8 0 "" string any rw 1 diff --git a/index.js b/index.js index 9c845297..44bd4bc0 100644 --- a/index.js +++ b/index.js @@ -1,668 +1,758 @@ -// Control module for Yamaha Pro Audio, using SCP communication +// Control module for Yamaha Pro Audio digital mixers // Jack Longden 2019 // updated by Andrew Broughton -// Apr 13, 2020 Version 1.4.1 +// Aug 15, 2021 Version 1.6.0 -var tcp = require('../../tcp'); -var instance_skel = require('../../instance_skel'); -var scpNames = require('./scpNames.json'); -var upgradeScripts = require('./upgrade'); - -const SCP_PARAMS = ['Ok', 'Command', 'Index', 'Address', 'X', 'Y', 'Min', 'Max', 'Default', 'Unit', 'Type', 'UI', 'RW', 'Scale']; -const SCP_VALS = ['Status', 'Command', 'Address', 'X', 'Y', 'Val', 'TxtVal']; +var tcp = require('../../tcp') +var instance_skel = require('../../instance_skel') +var shortid = require('shortid') +var rcpNames = require('./rcpNames.json') +var upgrade = require('./upgrade') +var paramFuncs = require('./paramFuncs') +const RCP_VALS = ['Status', 'Command', 'Address', 'X', 'Y', 'Val', 'TxtVal'] // Instance Setup class instance extends instance_skel { - constructor(system, id, config) { - super(system, id, config); - - this.scpCommands = []; - this.nameCommands = []; // Commands which have a name field - this.colorCommands = []; // Commands which have a color field - this.scpPresets = []; - this.productName = ''; - this.macroRec = false; - this.macroCount = 0; - this.dataStore = {}; - + super(system, id, config) + + this.rcpCommands = [] + this.nameCommands = [] // Commands which have a name field + this.colorCommands = [] // Commands which have a color field + this.rcpPresets = [] + this.productName = '' + this.macroRec = false + this.macroCount = 0 + this.macroMode = 'latch' + this.macro = {} + this.dataStore = {} } + static DEVELOPER_forceStartupUpgradeScript = 0 + static GetUpgradeScripts() { - return upgradeScripts + return [upgrade.upg111to112, upgrade.upg112to113, upgrade.upg113to160] } // Startup init() { - this.updateConfig(this.config); + this.updateConfig(this.config) } - // Module deletion destroy() { - if (this.socket !== undefined) { - this.socket.destroy(); + this.socket.destroy() } - this.log('debug', `destroyed ${this.id}`); + this.log('debug', `destroyed ${this.id}`) } - // Web config fields config_fields() { - let fields = [ { - type: 'textinput', - id: 'host', - label: 'IP Address of Console', - width: 6, - default: '192.168.0.128', - regex: this.REGEX_IP + type: 'textinput', + id: 'host', + label: 'IP Address of Console', + width: 6, + default: '192.168.0.128', + regex: this.REGEX_IP, }, { - type: 'dropdown', - id: 'model', - label: 'Console Type', - width: 6, - default: 'CL/QL', + type: 'dropdown', + id: 'model', + label: 'Console Type', + width: 6, + default: 'CL/QL', choices: [ - {id: 'CL/QL', label: 'CL/QL Console'}, - {id: 'TF', label: 'TF Console'} - ] - } - ] - for(let i = 1; i <= 4; i++){ - fields.push({ - type: 'textinput', - id: `myChName${i}`, - label: `My Channel #${i} Name`, - width: 6, - default: `My Channel ${i}`, + { id: 'CL/QL', label: 'CL/QL Console' }, + { id: 'TF', label: 'TF Console' }, + { id: 'PM', label: 'Rivage Console' }, + ], }, - { - type: 'number', - id: `myCh${i}`, - label: `Channel #${i}`, - width: 2, - min: 1, - max: 72, - default: 1, - required: false - }) + ] + for (let i = 1; i <= 4; i++) { + fields.push( + { + type: 'textinput', + id: `myChName${i}`, + label: `My Channel #${i} Name`, + width: 6, + default: `My Channel ${i}`, + }, + { + type: 'number', + id: `myCh${i}`, + label: `Channel #${i}`, + width: 2, + min: 1, + max: 72, + default: 1, + required: false, + } + ) } - return fields; + return fields } - // Change in Configuration updateConfig(config) { - - let fname = ''; - const FS = require("fs"); - - this.config = config; - - if (this.config.model == 'CL/QL') { - fname = 'CL5 SCP Parameters-1.txt'; - } - else { - fname = 'TF5 SCP Parameters-1.txt'; - } - - // Read the DataFile - let data = FS.readFileSync(`${__dirname}/${fname}`); - this.scpCommands = this.parseData(data, SCP_PARAMS); - - this.scpCommands.sort((a, b) => { - let acmd = a.Address.slice(a.Address.indexOf("/") + 1); - let bcmd = b.Address.slice(b.Address.indexOf("/") + 1); - return acmd.toLowerCase().localeCompare(bcmd.toLowerCase()); - }) - - for (let i = 0; i < 4; i++) { - scpNames.chNames[i] = {id: `-${i+1}`, label: this.config[`myChName${(i+1)}`]}; + this.config = config + if (this.config.model) { + this.rcpCommands = paramFuncs.getParams(this, config) + this.newConsole() } - - this.newConsole(); } - // Whenever the console type changes, update the info newConsole() { - - this.log('info', `Device model= ${this.config.model}`); - - this.actions(); // Re-do the actions once the console is chosen - this.presets(); - this.init_tcp(); - } - + this.log('info', `Device model= ${this.config.model}`) - // Make each command line into an object that can be used to create the commands - parseData(data, params) { - - let cmds = []; - let line = []; - const lines = data.toString().split("\x0A"); - - for (let i = 0; i < lines.length; i++){ - // I'm not going to even try to explain this next line, - // but it basically pulls out the space-separated values, except for spaces those that are inside quotes! - line = lines[i].match(/(?:[^\s"]+|"[^"]*")+/g) - if (line !== null && (['OK','NOTIFY'].indexOf(line[0].toUpperCase()) !== -1)) { - let scpCommand = {}; - - for (var j = 0; j < line.length; j++){ - scpCommand[params[j]] = line[j].replace(/"/g,''); // Get rid of any double quotes around the strings - } - if (['GET','SSCURRENT_EX'].indexOf(line[1].toUpperCase()) === -1) { - cmds.push(scpCommand); // Ignore the GET confirmations... - } + this.actions() // Re-do the actions once the console is chosen + this.presets() + this.init_tcp() - if (params === SCP_PARAMS) { - let cmdArr = undefined; - switch(scpCommand.Address.slice(-4)) { - case 'Name': - cmdArr = this.nameCommands; - break; - case 'olor': - cmdArr = this.colorCommands; - } - if (cmdArr !== undefined) cmdArr.push('scp_' + scpCommand.Index); - } - } - } - return cmds + //console.log(this.config); } - // Get info from a connected console getConsoleInfo() { - this.socket.send(`devinfo productname\n`); + this.socket.send(`devinfo productname\n`) } - // Initialize TCP init_tcp() { - - let receivebuffer = ''; - let receivedLines = []; - let receivedcmds = []; - let foundCmd = {}; - + let receivebuffer = '' + let receivedLines = [] + let receivedcmds = [] + let foundCmd = {} + if (this.socket !== undefined) { - this.socket.destroy(); - delete this.socket; + this.socket.destroy() + delete this.socket } if (this.config.host) { - this.socket = new tcp(this.config.host, 49280); + this.socket = new tcp(this.config.host, 49280) this.socket.on('status_change', (status, message) => { - this.status(status, message); - }); + this.status(status, message) + }) this.socket.on('error', (err) => { - this.status(this.STATUS_ERROR, err); - this.log('error', `Network error: ${err.message}`); - }); + this.status(this.STATUS_ERROR, err) + this.log('error', `Network error: ${err.message}`) + }) this.socket.on('connect', () => { - this.status(this.STATUS_OK); - this.log('info', `Connected!`); - this.getConsoleInfo(); - this.pollScp(); - }); + this.status(this.STATUS_OK) + this.log('info', `Connected!`) + this.getConsoleInfo() + this.pollrcp() + }) this.socket.on('data', (chunk) => { - receivebuffer += chunk; - - receivedLines = receivebuffer.split("\x0A"); // Split by line break + receivebuffer += chunk + + receivedLines = receivebuffer.split('\x0A') // Split by line break + if (receivedLines.length == 0) return // No messages + + //console.log(`Incoming:\n${receivebuffer}`); + + if (receivebuffer.slice(-1) != '\x0A') { + receivebuffer = receivedLines[receivedLines.length - 1] // Broken line, leave it for next time... + receivedLines.splice(receivedLines.length - 1) // Remove it. + } else { + receivebuffer = '' + } + //console.log(`Remaining: ${receivebuffer}`); - for(let line of receivedLines){ + for (let line of receivedLines) { if (line.length == 0) { - continue; - } + continue + } - this.log('debug', `Received from device: '${line}'`); + this.log('debug', `Received: '${line}'`) if (line.indexOf('OK devinfo productname') !== -1) { - - this.productName = line.slice(receivebuffer.lastIndexOf(" ")); - this.log('info', `Device found: ${this.productName}`); - + this.productName = line.slice(line.lastIndexOf(' ')) + this.log('info', `Device found: ${this.productName}`) } else { - - receivedcmds = this.parseData(line, SCP_VALS); // Break out the parameters - - for (let i=0; i < receivedcmds.length; i++) { - foundCmd = this.scpCommands.find(cmd => cmd.Address == receivedcmds[i].Address.slice(0,cmd.Address.length)); // Find which command + receivedcmds = paramFuncs.parseData(this, line, RCP_VALS) // Break out the parameters + //console.log(receivedcmds); + for (let i = 0; i < receivedcmds.length; i++) { + let cmdToFind = receivedcmds[i].Address + //console.log(cmdToFind); + foundCmd = this.rcpCommands.find((cmd) => cmd.Address == cmdToFind.slice(0, cmd.Address.length)) // Find which command if (foundCmd !== undefined) { - this.addToDataStore({scp: foundCmd, cmd: receivedcmds[i]}) - this.addMacro({scp: foundCmd, cmd: receivedcmds[i]}); - this.checkFeedbacks(); + if (foundCmd.Command == 'scninfo') { + this.pollrcp(); + } else { + this.addToDataStore({ rcp: foundCmd, cmd: receivedcmds[i] }) + this.addMacro({ rcp: foundCmd, cmd: receivedcmds[i] }) + this.checkFeedbacks() + } } else { - - this.log('debug', `Unknown command received: '${receivedcmds[i].Address}'`); - + this.log('debug', `Unknown command received: '${receivedcmds[i].Address}'`) } } } - } - - receivebuffer = ''; // Clear the buffer - - }); + } + }) } } - - // Create single Action/Feedback - createAction(scpCmd) { - - let newAction = {}; - let valParams = {}; - let scpLabel = ''; - - if (this.config.model == 'TF' && scpCmd.Type == 'scene') { - scpLabel = 'Scene/Bank' + createAction(rcpCmd) { + let newAction = {} + let valParams = {} + let rcpLabel = '' + + if (this.config.model == 'TF' && rcpCmd.Type == 'scene') { + rcpLabel = 'Scene/Bank' } else { - scpLabel = scpCmd.Address.slice(scpCmd.Address.indexOf("/") + 1); // String after "MIXER:Current/" + rcpLabel = rcpCmd.Address.slice(rcpCmd.Address.indexOf('/') + 1) // String after "MIXER:Current/" } - - // Add the commands from the data file. Action id's (action.action) are the SCP command number - let scpLabels = scpLabel.split("/"); - let scpLabelIdx = (scpLabel.startsWith("Cue")) ? 1 : 0; - - newAction = {label: scpLabel, options: []}; - if (scpCmd.X > 1) { - if (scpLabel.startsWith("InCh") || scpLabel.startsWith("Cue/InCh")) { + + // Add the commands from the data file. Action id's (action.action) are the rcp command number + let rcpLabels = rcpLabel.split('/') + let rcpLabelIdx = rcpLabel.startsWith('Cue') ? 1 : 0 + + newAction = { label: rcpLabel, options: [] } + if (rcpCmd.X > 1) { + if (rcpLabel.startsWith('InCh') || rcpLabel.startsWith('Cue/InCh')) { newAction.options = [ - {type: 'dropdown', label: scpLabels[scpLabelIdx], id: 'X', default: 1, minChoicesForSearch: 0, choices: scpNames.chNames} + { + type: 'dropdown', + label: rcpLabels[rcpLabelIdx], + id: 'X', + default: 1, + minChoicesForSearch: 0, + choices: rcpNames.chNames.slice(0, parseInt(rcpCmd.X) + 4), + }, ] } else { newAction.options = [ - {type: 'number', label: scpLabels[scpLabelIdx], id: 'X', min: 1, max: scpCmd.X, default: 1, required: true, range: false} + { + type: 'number', + label: rcpLabels[rcpLabelIdx], + id: 'X', + min: 1, + max: rcpCmd.X, + default: 1, + required: true, + range: false, + }, ] } - scpLabelIdx++; + rcpLabelIdx++ } - if (scpCmd.Y > 1) { - if (this.config.model == "TF" && scpCmd.Type == 'scene') { - valParams = {type: 'dropdown', label: scpLabels[scpLabelIdx], id: 'Y', default: 'a', choices:[ - {id: 'a', label: 'A'}, - {id: 'b', label: 'B'} - ]} + if (rcpCmd.Y > 1) { + if (this.config.model == 'TF' && rcpCmd.Type == 'scene') { + valParams = { + type: 'dropdown', + label: rcpLabels[rcpLabelIdx], + id: 'Y', + default: 'a', + choices: [ + { id: 'a', label: 'A' }, + { id: 'b', label: 'B' }, + ], + } } else { - valParams = {type: 'number', label: scpLabels[scpLabelIdx], id: 'Y', min: 1, max: scpCmd.Y, default: 1, required: true, range: false} + valParams = { + type: 'number', + label: rcpLabels[rcpLabelIdx], + id: 'Y', + min: 1, + max: rcpCmd.Y, + default: 1, + required: true, + range: false, + } } - newAction.options.push(valParams); + newAction.options.push(valParams) } - - if (scpLabelIdx < scpLabels.length - 1) { - scpLabelIdx++; + + if (rcpLabelIdx < rcpLabels.length - 1) { + rcpLabelIdx++ } - switch(scpCmd.Type) { + switch (rcpCmd.Type) { case 'integer': - if (scpCmd.Max == 1) { - valParams = {type: 'checkbox', label: 'On', id: 'Val', default: (scpCmd.Default == 1) ? true : false} + if (rcpCmd.Max == 1) { + // Boolean? + valParams = { + type: 'dropdown', + label: 'State', + id: 'Val', + default: rcpCmd.Default, + minChoicesForSearch: 0, + choices: [ + { label: 'On', id: 1 }, + { label: 'Off', id: 0 }, + { label: 'Toggle', id: 'Toggle' }, + ], + } } else { valParams = { - type: 'number', label: scpLabels[scpLabelIdx], id: 'Val', min: scpCmd.Min, max: scpCmd.Max, default: parseInt(scpCmd.Default), required: true, range: false + type: 'number', + label: rcpLabels[rcpLabelIdx], + id: 'Val', + min: rcpCmd.Min, + max: rcpCmd.Max, + default: parseInt(rcpCmd.Default), + required: true, + range: false, } } - break; + break case 'string': case 'binary': - if (scpLabel.startsWith("CustomFaderBank")) { - valParams = {type: 'dropdown', label: scpLabels[scpLabelIdx], id: 'Val', default: scpCmd.Default, minChoicesForSearch: 0, choices: scpNames.customChNames} - } else if (scpLabel.endsWith("Color")) { - valParams = {type: 'dropdown', label: scpLabels[scpLabelIdx], id: 'Val', default: scpCmd.Default, minChoicesForSearch: 0, - choices: this.config.model == "TF" ? scpNames.chColorsTF : scpNames.chColors} - } else if (scpLabel.endsWith("Icon")) { - valParams = {type: 'dropdown', label: scpLabels[scpLabelIdx], id: 'Val', default: scpCmd.Default, minChoicesForSearch: 0, - choices: scpNames.chIcons} - } else if (scpLabel == "DanteOutPort/Patch") { - valParams = {type: 'dropdown', label: scpLabels[scpLabelIdx], id: 'Val', default: scpCmd.Default, minChoicesForSearch: 0, - choices: scpNames.danteOutPatch} - } else if (scpLabel == "OmniOutPort/Patch") { - valParams = {type: 'dropdown', label: scpLabels[scpLabelIdx], id: 'Val', default: scpCmd.Default, minChoicesForSearch: 0, - choices: scpNames.omniOutPatch} - + if (rcpLabel.startsWith('CustomFaderBank')) { + valParams = { + type: 'dropdown', + label: rcpLabels[rcpLabelIdx], + id: 'Val', + default: rcpCmd.Default, + minChoicesForSearch: 0, + choices: rcpNames.customChNames, + } + } else if (rcpLabel.endsWith('Color')) { + valParams = { + type: 'dropdown', + label: rcpLabels[rcpLabelIdx], + id: 'Val', + default: rcpCmd.Default, + minChoicesForSearch: 0, + choices: this.config.model == 'TF' ? rcpNames.chColorsTF : rcpNames.chColors, + } + } else if (rcpLabel.endsWith('Icon')) { + valParams = { + type: 'dropdown', + label: rcpLabels[rcpLabelIdx], + id: 'Val', + default: rcpCmd.Default, + minChoicesForSearch: 0, + choices: rcpNames.chIcons, + } + } else if (rcpLabel == 'DanteOutPort/Patch') { + valParams = { + type: 'dropdown', + label: rcpLabels[rcpLabelIdx], + id: 'Val', + default: rcpCmd.Default, + minChoicesForSearch: 0, + choices: rcpNames.danteOutPatch, + } + } else if (rcpLabel == 'OmniOutPort/Patch') { + valParams = { + type: 'dropdown', + label: rcpLabels[rcpLabelIdx], + id: 'Val', + default: rcpCmd.Default, + minChoicesForSearch: 0, + choices: rcpNames.omniOutPatch, + } } else { - valParams = {type: 'textinput', label: scpLabels[scpLabelIdx], id: 'Val', default: scpCmd.Default, regex: ''} + valParams = { + type: 'textinput', + label: rcpLabels[rcpLabelIdx], + id: 'Val', + default: rcpCmd.Default, + regex: '', + } } - break; + break default: - return newAction; + return newAction } - - newAction.options.push(valParams); - return newAction; - + + newAction.options.push(valParams) + return newAction } - // Create the Actions & Feedbacks actions(system) { - - let commands = {}; - let feedbacks = {}; - let command = {}; - let scpAction = ''; - - for (let i = 0; i < this.scpCommands.length; i++) { - command = this.scpCommands[i] - scpAction = 'scp_' + command.Index; - - commands[scpAction] = this.createAction(command); - feedbacks[scpAction] = JSON.parse(JSON.stringify(commands[scpAction])); // Clone the Action to a matching feedback - - if (this.nameCommands.includes(scpAction) || this.colorCommands.includes(scpAction)) { - feedbacks[scpAction].options.pop(); + let commands = {} + let feedbacks = {} + let command = {} + let rcpAction = '' + + for (let i = 0; i < this.rcpCommands.length; i++) { + command = this.rcpCommands[i] + rcpAction = command.Address.replace(/:/g, '_') + + commands[rcpAction] = this.createAction(command) + feedbacks[rcpAction] = JSON.parse(JSON.stringify(commands[rcpAction])) // Clone the Action to a matching feedback + + if (this.nameCommands.includes(rcpAction) || this.colorCommands.includes(rcpAction)) { + feedbacks[rcpAction].type = 'advanced' // New feedback style + feedbacks[rcpAction].options.pop() } else { - feedbacks[scpAction].options.push( - {type: 'colorpicker', label: 'Color', id: 'fg', default: this.rgb(0,0,0)}, - {type: 'colorpicker', label: 'Background', id: 'bg', default: this.rgb(255,0,0)} - ) + feedbacks[rcpAction].type = 'boolean' // New feedback style + + if (feedbacks[rcpAction].options.length > 0) { + let lastOptions = feedbacks[rcpAction].options[feedbacks[rcpAction].options.length - 1] + if (lastOptions.label == 'State') { + lastOptions.choices.pop() // Get rid of the Toggle setting for Feedbacks + } + } + + feedbacks[rcpAction].style = { color: this.rgb(0, 0, 0), bgcolor: this.rgb(255, 0, 0) } } } - commands['macroRecStart'] = {label: 'Record SCP Macro'}; - commands['macroRecStop'] = {label: 'Stop Recording'}; - - feedbacks['macroRecStart'] = {label: 'Macro is Recording', options: [ - {type: 'checkbox', label: 'ON', id: 'on', default: true}, - {type: 'colorpicker', label: 'Color', id: 'fg', default: this.rgb(0,0,0)}, - {type: 'colorpicker', label: 'Background', id: 'bg', default: this.rgb(255,0,0)} - ]}; + commands['macroRecStart'] = { label: 'Record RCP Macro' } + commands['macroRecLatch'] = { label: 'Record RCP Macro (latched)' } + commands['macroUnLatch'] = { label: 'Unlatch RCP Macro' } + feedbacks['macro'] = { + label: 'Macro Feedback', + type: 'advanced', + options: [ + { + type: 'dropdown', + label: 'Mode', + id: 'mode', + choices: [ + { id: 'r', label: 'Record' }, + { id: 'rl', label: 'Record Latch' }, + { id: 's', label: 'Stop' }, + ], + }, + { type: 'colorpicker', label: 'Color', id: 'fg', default: this.rgb(0, 0, 0) }, + { type: 'colorpicker', label: 'Background', id: 'bg', default: this.rgb(255, 0, 0) }, + ], + } -/* -this.log('info','******** COMMAND LIST *********'); -Object.entries(commands).forEach(([key, value]) => this.log('info',`${value.label.padEnd(36, '\u00A0')} ${key}`)); -this.log('info','***** END OF COMMAND LIST *****') -*/ + // this.log('info','******** COMMAND LIST *********'); + // Object.entries(commands).forEach(([key, value]) => this.log('info',`${value.label.padEnd(36, '\u00A0')} ${key}`)); + // this.log('info','***** END OF COMMAND LIST *****') - this.setActions(commands); - this.setFeedbackDefinitions(feedbacks); + this.setActions(commands) + this.setFeedbackDefinitions(feedbacks) } - // Create the proper command string for an action or poll - parseCmd(prefix, scpCmd, opt) { - - if (scpCmd == undefined || opt == undefined) return; + parseCmd(prefix, rcpCmd, opt) { + if (rcpCmd == undefined || opt == undefined) return - let scnPrefix = ''; - let optX = (opt.X === undefined) ? 1 : (opt.X > 0) ? opt.X : this.config[`myCh${-opt.X}`]; - let optY = (opt.Y === undefined) ? 0 : opt.Y - 1; + let scnPrefix = '' + let optX = opt.X === undefined ? 1 : opt.X > 0 ? opt.X : this.config[`myCh${-opt.X}`] + let optY = opt.Y === undefined ? 0 : opt.Y - 1 let optVal - let scpCommand = this.scpCommands.find(cmd => 'scp_' + cmd.Index == scpCmd); - if (scpCommand == undefined) { - this.log('debug',`PARSECMD: Unrecognized command. '${scpCmd}'`) - return; - } - let cmdName = scpCommand.Address; - - switch(scpCommand.Type) { + let rcpCommand = this.rcpCommands.find((cmd) => cmd.Address.replace(/:/g, '_') == rcpCmd) + + if (rcpCommand == undefined) { + this.log('debug', `PARSECMD: Unrecognized command. '${rcpCmd}'`) + return + } + let cmdName = rcpCommand.Address + + switch (rcpCommand.Type) { case 'integer': case 'binary': cmdName = `${prefix} ${cmdName}` - optX--; // ch #'s are 1 higher than the parameter - optVal = ((prefix == 'set') ? 0 + opt.Val : ''); // Changes true/false to 1 0 - break; - + if (opt.Val == 'Toggle') { + if (this.dataStore[rcpCmd] !== undefined && this.dataStore[rcpCmd][optX] !== undefined) { + optVal = prefix == 'set' ? 1 - parseInt(this.dataStore[rcpCmd][optX][optY + 1]) : '' + } + } else { + optVal = prefix == 'set' ? opt.Val : '' // if it's not "set" then it's a "get" which doesn't have a Value + } + optX-- // ch #'s are 1 higher than the parameter + break + case 'string': cmdName = `${prefix} ${cmdName}` - optX--; // ch #'s are 1 higher than the parameter except with Custom Banks - optVal = ((prefix == 'set') ? `"${opt.Val}"` : ''); // quotes around the string - break; - + optVal = prefix == 'set' ? `"${opt.Val}"` : '' // quotes around the string + optX-- // ch #'s are 1 higher than the parameter except with Custom Banks + break + case 'scene': - optY = ''; - optVal = ''; - + optY = '' + optVal = '' + if (prefix == 'set') { - scnPrefix = 'ssrecall_ex'; - this.pollScp(); // so buttons with feedback reflect any changes + scnPrefix = 'ssrecall_ex' + this.pollrcp() // so buttons with feedback reflect any changes } else { - scnPrefix = 'sscurrent_ex'; - optX = ''; + scnPrefix = 'sscurrent_ex' + optX = '' } - + if (this.config.model == 'CL/QL') { - cmdName = `${scnPrefix} ${cmdName}`; // Recall Scene for CL/QL + cmdName = `${scnPrefix} ${cmdName}` // Recall Scene for CL/QL } else { - cmdName = `${scnPrefix} ${cmdName}${opt.Y}`; // Recall Scene for TF + cmdName = `${scnPrefix} ${cmdName}${opt.Y}` // Recall Scene for TF } - } - - return `${cmdName} ${optX} ${optY} ${optVal}`.trim(); // Command string to send to console + } + + return `${cmdName} ${optX} ${optY} ${optVal}`.trim() // Command string to send to console } - // Create the preset definitions presets() { - this.scpPresets = [{ - category: 'Macros', - label: 'Create SCP Macro', - bank: { - style: 'text', - text: 'Record SCP Macro', - latch: true, - size: 'auto', - color: this.rgb(255,255,255), - bgcolor: this.rgb(0,0,0) + this.rcpPresets = [ + { + category: 'Macros', + label: 'Create RCP Macro', + bank: { + style: 'png', + text: 'Record rcp Macro', + png64: this.ICON_REC_INACTIVE, + pngalignment: 'center:center', + latch: false, + size: 'auto', + color: this.rgb(255, 255, 255), + bgcolor: this.rgb(0, 0, 0), + }, + actions: [{ action: 'macroRecStart' }, { action: 'macroRecLatch', delay: 500 }], + release_actions: [{ action: 'macroUnLatch' }], + feedbacks: [ + { type: 'macro', options: { mode: 'r', fg: this.rgb(0, 0, 0), bg: this.rgb(255, 0, 0) } }, + { type: 'macro', options: { mode: 'rl', fg: this.rgb(0, 0, 0), bg: this.rgb(255, 255, 0) } }, //, + ], }, - actions: [{action: 'macroRecStart'}], - release_actions: [{action: 'macroRecStop'}], - feedbacks: [{type: 'macroRecStart', options: {on: true}}] - }]; - - this.setPresetDefinitions(this.scpPresets); + ] + + this.setPresetDefinitions(this.rcpPresets) } - // Add a command to a Macro Preset addMacro(c) { - - let foundActionIdx = -1; + let foundActionIdx = -1 if (this.macroRec) { - let cX = parseInt(c.cmd.X); - let cY = parseInt(c.cmd.Y); + let cX = parseInt(c.cmd.X) + let cY = parseInt(c.cmd.Y) let cV - switch(c.scp.Type) { + switch (c.rcp.Type) { case 'integer': case 'binary': - cX++; - cY++; - if (c.scp.Max == 1) { - cV = ((c.cmd.Val == 0) ? false : true) - } else { - cV = parseInt(c.cmd.Val); - } - break; + cX++ + cY++ + cV = parseInt(c.cmd.Val) + break case 'string': - cX++; - cY++; - cV = c.cmd.Val; - break; + cX++ + cY++ + cV = c.cmd.Val } - + // Check for new value on existing action - let scpActions = this.scpPresets[this.scpPresets.length - 1].actions; - if (scpActions !== undefined) { - foundActionIdx = scpActions.findIndex(cmd => ( - cmd.action == 'scp_' + c.scp.Index && - cmd.options.X == cX && - cmd.options.Y == cY - )); + let rcpActions = this.macro.actions + if (rcpActions !== undefined) { + foundActionIdx = rcpActions.findIndex( + (cmd) => cmd.action == c.rcp.Address.replace(/:/g, '_') && cmd.options.X == cX && cmd.options.Y == cY + ) } - + if (foundActionIdx == -1) { - scpActions.push([]); - foundActionIdx = scpActions.length - 1; + rcpActions.push([]) + foundActionIdx = rcpActions.length - 1 } - scpActions[foundActionIdx] = {action: 'scp_' + c.scp.Index, options: {X: cX, Y: cY, Val: cV}}; + rcpActions[foundActionIdx] = { action: c.rcp.Address.replace(/:/g, '_'), options: { X: cX, Y: cY, Val: cV } } + } + } + dropMacro(preset, button) { + if (preset.actions == undefined) { + return } + + preset.release_actions = [] + preset.feedbacks = [] + + for (var i = 0; i < preset.actions.length; ++i) { + preset.actions[i].id = shortid.generate() + preset.actions[i].instance = this.id + preset.actions[i].label = this.id + ':' + preset.actions[i].action + + preset.feedbacks.push({ + id: shortid.generate(), + instance_id: this.id, + type: preset.actions[i].action, + options: { ...preset.actions[i].options }, + style: { color: this.rgb(0, 0, 0), bgcolor: this.rgb(255, 0, 0) }, + }) + + let rcpCommand = this.rcpCommands.find((cmd) => cmd.Address.replace(/:/g, '_') == preset.actions[i].action) + + if (rcpCommand != undefined && rcpCommand.Type == 'integer' && rcpCommand.Max == 1) { + preset.actions[i].options.Val = 'Toggle' + } + } + + bank_actions[button.page][button.bank].pop() // For some reason this is necessary... + preset.config = preset.bank + delete preset.bank + this.system.emit('import_bank', button.page, button.bank, preset) } - // Handle the Actions - action(action) { + action(action, button) { + //console.log(action); if (!action.action.startsWith('macro')) { - let cmd = this.parseCmd('set', action.action, action.options); + // Regular action + let cmd = this.parseCmd('set', action.action, action.options) if (cmd !== undefined) { - this.log('debug', `sending '${cmd}' to ${this.config.host}`); + this.log('debug', `Sending : '${cmd}' to ${this.config.host}`) if (this.socket !== undefined && this.socket.connected) { - this.socket.send(`${cmd}\n`); // send it, but add a CR to the end - } - else { - this.log('info', 'Socket not connected :('); - } - } - } else { - if (action.action == 'macroRecStart' && this.macroRec == false) { - this.macroCount++; - this.scpPresets.push({ - category: 'Macros', - label: `Macro ${this.macroCount}`, - bank: { - style: 'text', - text: `Macro ${this.macroCount}`, - size: 'auto', - color: this.rgb(255,255,255), - bgcolor: this.rgb(0,0,0) - }, - actions: [] - }); - this.macroRec = true; - - } else if (action.action == 'macroRecStop') { - this.macroRec = false; - if (this.scpPresets[this.scpPresets.length - 1].actions.length > 0) { - this.setPresetDefinitions(this.scpPresets); + this.socket.send(`${cmd}\n`) // send it, but add a CR to the end } else { - this.scpPresets.pop(); - this.macroCount = 0; + this.log('info', 'Socket not connected :(') } } - this.checkFeedbacks('macroRecStart'); + } else { + // Macro + switch (action.action) { + case 'macroRecStart': + if (!this.macroRec) { + this.macroRec = true + this.macroMode = '' + this.macroCount++ + this.macro = { + label: `Macro ${this.macroCount}`, + bank: { + style: 'text', + text: `Macro ${this.macroCount}`, + size: 'auto', + color: this.rgb(255, 255, 255), + bgcolor: this.rgb(0, 0, 0), + }, + actions: [], + } + } else { + //console.log('Stopped.'); + this.macroRec = false + if (this.macro.actions.length > 0) { + this.dropMacro(this.macro, button) + } else { + this.macroCount-- + } + this.macroMode = 'stopped' + } + break + + case 'macroRecLatch': + if (this.macroMode == '') { + this.macroMode = 'latch' + } + break + + case 'macroUnLatch': + if (this.macroMode == '') { + this.macro.bank.latch = false + this.macroMode = 'one-shot' + } + } } + this.checkFeedbacks('macro') } - // Handle the Feedbacks feedback(feedback, bank) { + let options = feedback.options + let rcpCommand = this.rcpCommands.find((cmd) => cmd.Address.replace(/:/g, '_') == feedback.type) + let retOptions = {} - let options = feedback.options; - let scpCommand = this.scpCommands.find(cmd => 'scp_' + cmd.Index == feedback.type); - let retOptions = {}; + if (rcpCommand !== undefined) { + let optVal = options.Val == undefined ? options.X : options.Val + let optX = options.X > 0 ? options.X : this.config[`myCh${-options.X}`] + let optY = options.Y == undefined ? 1 : options.Y - if (scpCommand !== undefined) { - let optVal = (options.Val == undefined ? options.X : (scpCommand.Type == 'integer') ? 0 + options.Val : `${options.Val}`); // 0 + value turns true/false into 1 0 - let optX = (options.X > 0) ? options.X : this.config[`myCh${-options.X}`]; - let optY = (options.Y == undefined) ? 1 : options.Y; - - // console.log(`\nFeedback: '${feedback.id}' from bank '${bank.text}' is ${feedback.type} (${scpCommand.Address})`); - // console.log(`X: ${optX}, Y: ${optY}, Val: ${optVal}`); + //console.log(`\nFeedback: '${feedback.id}' from bank '${bank.text}' is ${feedback.type} (${rcpCommand.Address})`); + //console.log(`X: ${optX}, Y: ${optY}, Val: ${optVal}`); if (this.dataStore[feedback.type] !== undefined && this.dataStore[feedback.type][optX] !== undefined) { - - retOptions = {text: bank.text, color: bank.color, bgcolor: bank.bgcolor}; if (this.dataStore[feedback.type][optX][optY] == optVal) { - - retOptions = {text: (options.text == undefined) ? bank.text : options.text, color: options.fg, bgcolor: options.bg} - // console.log(` *** Match *** ${JSON.stringify(retOptions)}\n`); - return retOptions; - + //console.log(' *** Match ***'); + return true } else { - if (this.colorCommands.includes(feedback.type)) { - let c = scpNames.chColorRGB[this.dataStore[feedback.type][optX][optY]] - retOptions.color = c.color; - retOptions.bgcolor = c.bgcolor; - return retOptions; + let c = rcpNames.chColorRGB[this.dataStore[feedback.type][optX][optY]] + retOptions.color = c.color + retOptions.bgcolor = c.bgcolor + //console.log(` *** Match *** (Color) ${JSON.stringify(retOptions)}\n`); + return retOptions } if (this.nameCommands.includes(feedback.type)) { - retOptions.text = this.dataStore[feedback.type][optX][optY]; - return retOptions; + retOptions.text = this.dataStore[feedback.type][optX][optY] + //console.log(` *** Match *** (Text) ${JSON.stringify(retOptions)}\n`); + return retOptions } } } - return - + return false } - - if (feedback.type == 'macroRecStart' && options.on == this.macroRec) { - return {color: options.fg, bgcolor: options.bg}; + //console.log(`macroMode: ${this.macroMode}, macroRec: ${this.macroRec}`); + if (feedback.type == 'macro' && this.macroRec) { + if (this.macroMode == 'latch') { + return { color: this.rgb(0, 0, 0), bgcolor: this.rgb(255, 255, 0), text: 'REC' } + } else { + return { color: this.rgb(0, 0, 0), bgcolor: this.rgb(255, 0, 0), text: 'REC' } + } } - return; + return } - // Poll the console for it's status to update buttons via feedback - pollScp() { - let allFeedbacks = this.getAllFeedbacks(); + pollrcp() { + let allFeedbacks = this.getAllFeedbacks() for (let fb in allFeedbacks) { - let cmd = this.parseCmd('get', allFeedbacks[fb].type, allFeedbacks[fb].options); + let cmd = this.parseCmd('get', allFeedbacks[fb].type, allFeedbacks[fb].options) if (cmd !== undefined && this.id == allFeedbacks[fb].instance_id) { - this.log('debug', `sending '${cmd}' to ${this.config.host}`); + this.log('debug', `Sending : '${cmd}' to ${this.config.host}`) this.socket.send(`${cmd}\n`) - } + } } } - addToDataStore(cmd) { - let idx = cmd.scp.Index; - let iY; - + let idx = cmd.rcp.Index + let dsAddr = cmd.rcp.Address.replace(/:/g, '_') + let iY + if (cmd.cmd.Val == undefined) { - cmd.cmd.Val = parseInt(cmd.cmd.X); - cmd.cmd.X = undefined; + cmd.cmd.Val = parseInt(cmd.cmd.X) + cmd.cmd.X = undefined } - - cmd.cmd.X = (cmd.cmd.X == undefined) ? 0 : cmd.cmd.X; - let iX = parseInt(cmd.cmd.X) + 1; - + + cmd.cmd.X = cmd.cmd.X == undefined ? 0 : cmd.cmd.X + let iX = parseInt(cmd.cmd.X) + 1 + if (this.config.model == 'TF' && idx == 1000) { iY = cmd.cmd.Address.slice(-1) } else { - cmd.cmd.Y = (cmd.cmd.Y == undefined) ? 0 : cmd.cmd.Y; - iY = parseInt(cmd.cmd.Y) + 1; + cmd.cmd.Y = cmd.cmd.Y == undefined ? 0 : cmd.cmd.Y + iY = parseInt(cmd.cmd.Y) + 1 } - if (this.dataStore['scp_' + idx] == undefined) { - this.dataStore['scp_' + idx] = {}; + if (this.dataStore[dsAddr] == undefined) { + this.dataStore[dsAddr] = {} } - if (this.dataStore['scp_' + idx][iX] == undefined) { - this.dataStore['scp_' + idx][iX] = {}; + if (this.dataStore[dsAddr][iX] == undefined) { + this.dataStore[dsAddr][iX] = {} } - this.dataStore['scp_' + idx][iX][iY] = cmd.cmd.Val; - - } - + this.dataStore[dsAddr][iX][iY] = cmd.cmd.Val + //console.log(this.dataStore) + } } -exports = module.exports = instance; \ No newline at end of file +exports = module.exports = instance diff --git a/package.json b/package.json index fdfaa655..3d7f30dd 100644 --- a/package.json +++ b/package.json @@ -1,24 +1,27 @@ { - "name": "yamaha-scp", - "version": "1.4.2", + "name": "yamaha-rcp", + "legacy": [ + "yamaha-scp" + ], + "version": "1.6.0", "api_version": "1.0.0", - "description": "Control module for Yamaha Pro Audio equipment via SCP", + "description": "Control module for Yamaha Pro Audio equipment via Yamaha Remote Control Protocol", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, - "keywords": ["Audio","SCP","Mixer"], + "keywords": ["Audio","Mixer","Yamaha","RCP"], "manufacturer": "Yamaha", - "product": ["TF (SCP)","QL/CL (SCP)"], - "shortname": "yamaha-scp", - "homepage": "https://github.com/bitfocus/companion-module-yamaha-scp#readme", + "product": ["TF (RCP)","QL/CL (RCP)","Rivage (RCP)"], + "shortname": "yamaha-RCP", + "homepage": "https://github.com/bitfocus/companion-module-yamaha-rcp#readme", "repository": { "type": "git", - "url": "git+https://github.com/bitfocus/companion-module-yamaha-scp.git" + "url": "git+https://github.com/bitfocus/companion-module-yamaha-rcp.git" }, "author": "Andrew Broughton ", "license": "MIT", "bugs": { - "url": "https://github.com/bitfocus/companion-module-yamaha-scp/issues" + "url": "https://github.com/bitfocus/companion-module-yamaha-rcp/issues" } } diff --git a/paramFuncs.js b/paramFuncs.js new file mode 100644 index 00000000..61a0ee21 --- /dev/null +++ b/paramFuncs.js @@ -0,0 +1,88 @@ +module.exports = { + getParams: (instance, config) => { + const RCP_PARAMS = [ + 'Ok', + 'Command', + 'Index', + 'Address', + 'X', + 'Y', + 'Min', + 'Max', + 'Default', + 'Unit', + 'Type', + 'UI', + 'RW', + 'Scale', + ] + var rcpNames = require('./rcpNames.json') + + let fname = '' + let rcpCommands + const FS = require('fs') + + switch (config.model) { + case 'CL/QL': + fname = 'CL5 Parameters-1.txt' + break + case 'TF': + fname = 'TF5 Parameters-1.txt' + break + case 'PM': + fname = 'Rivage Parameters-1.txt' + } + + // Read the DataFile + if (fname !== '') { + let data = FS.readFileSync(`${__dirname}/${fname}`) + rcpCommands = module.exports.parseData(instance, data, RCP_PARAMS) + + rcpCommands.sort((a, b) => { + // Sort the commands + let acmd = a.Address.slice(a.Address.indexOf('/') + 1) + let bcmd = b.Address.slice(b.Address.indexOf('/') + 1) + return acmd.toLowerCase().localeCompare(bcmd.toLowerCase()) + }) + + for (let i = 0; i < 4; i++) { + rcpNames.chNames[i] = { id: `-${i + 1}`, label: config[`myChName${i + 1}`] } + } + } + + return rcpCommands + }, + + parseData: (instance, data, params) => { + let cmds = [] + let line = [] + const lines = data.toString().split('\x0A') + + for (let i = 0; i < lines.length; i++) { + // I'm not going to even try to explain this next line, + // but it basically pulls out the space-separated values, except for spaces that are inside quotes! + line = lines[i].match(/(?:[^\s"]+|"[^"]*")+/g) + + if (line !== null && ['OK', 'NOTIFY'].indexOf(line[0].toUpperCase()) !== -1) { + let rcpCommand = {} + + for (var j = 0; j < line.length; j++) { + rcpCommand[params[j]] = line[j].replace(/"/g, '') // Get rid of any double quotes around the strings + } + + cmds.push(rcpCommand) + + if (params[0] == 'Ok') { + switch (rcpCommand.Address.slice(-4)) { + case 'Name': + instance.nameCommands.push(rcpCommand.Address.replace(/:/g, '_')) + break + case 'olor': + instance.colorCommands.push(rcpCommand.Address.replace(/:/g, '_')) + } + } + } + } + return cmds + }, +} diff --git a/scpNames.json b/rcpNames.json similarity index 96% rename from scpNames.json rename to rcpNames.json index 3293f23f..d0c5b6fe 100644 --- a/scpNames.json +++ b/rcpNames.json @@ -74,7 +74,55 @@ {"id": 69, "label": "CH69"}, {"id": 70, "label": "CH70"}, {"id": 71, "label": "CH71"}, - {"id": 72, "label": "CH72"} + {"id": 72, "label": "CH72"}, + {"id": 73, "label": "CH73"}, + {"id": 74, "label": "CH74"}, + {"id": 75, "label": "CH75"}, + {"id": 76, "label": "CH76"}, + {"id": 77, "label": "CH77"}, + {"id": 78, "label": "CH78"}, + {"id": 79, "label": "CH79"}, + {"id": 80, "label": "CH80"}, + {"id": 81, "label": "CH81"}, + {"id": 82, "label": "CH82"}, + {"id": 83, "label": "CH83"}, + {"id": 84, "label": "CH84"}, + {"id": 85, "label": "CH85"}, + {"id": 86, "label": "CH86"}, + {"id": 87, "label": "CH87"}, + {"id": 88, "label": "CH88"}, + {"id": 89, "label": "CH89"}, + {"id": 90, "label": "CH90"}, + {"id": 91, "label": "CH91"}, + {"id": 92, "label": "CH92"}, + {"id": 93, "label": "CH93"}, + {"id": 94, "label": "CH94"}, + {"id": 95, "label": "CH95"}, + {"id": 96, "label": "CH96"}, + {"id": 97, "label": "CH97"}, + {"id": 98, "label": "CH98"}, + {"id": 99, "label": "CH99"}, + {"id": 100, "label": "CH100"}, + {"id": 101, "label": "CH101"}, + {"id": 102, "label": "CH102"}, + {"id": 103, "label": "CH103"}, + {"id": 104, "label": "CH104"}, + {"id": 105, "label": "CH105"}, + {"id": 106, "label": "CH106"}, + {"id": 107, "label": "CH107"}, + {"id": 108, "label": "CH108"}, + {"id": 109, "label": "CH109"}, + {"id": 110, "label": "CH110"}, + {"id": 111, "label": "CH111"}, + {"id": 112, "label": "CH112"}, + {"id": 113, "label": "CH113"}, + {"id": 114, "label": "CH114"}, + {"id": 115, "label": "CH115"}, + {"id": 116, "label": "CH116"}, + {"id": 117, "label": "CH117"}, + {"id": 118, "label": "CH118"}, + {"id": 119, "label": "CH119"}, + {"id": 120, "label": "CH120"} ], "customChNames": [ {"id": "NO ASSIGN", "label": "NO ASSIGN"}, diff --git a/upgrade.js b/upgrade.js index 0fc1b17e..80590a4b 100644 --- a/upgrade.js +++ b/upgrade.js @@ -2,129 +2,173 @@ // Do the upgrades of actions, release actions and feedback */ -module.exports = [ - // Upgrade 1.0.x > 1.1.0 - function (context, config, actions, feedbacks) { - var changed = false; - console.log('Running 1.1.1 -> 1.1.2 Upgrade.') - - let checkUpgrade = function(action, changed) { - let newAction = ''; - - switch (action.action) { - case 'InChOn': - // cmd = 'set MIXER:Current/InCh/Fader/On '+ opt.Ch + ' 0 1'; - newAction = 186; - action.options.X = actions.options.Ch; - action.options.Val = 1; - break; - case 'InChOff': - // cmd = 'set MIXER:Current/InCh/Fader/On '+ opt.Ch + ' 0 0'; - newAction = 186; - action.options.X = actions.options.Ch; - action.options.Val = 0; - break; - case 'InChLevel': - // cmd = 'set MIXER:Current/InCh/Fader/Level ' + opt.Ch + ' 0 ' + opt.ChAct; - newAction = 184; - action.options.X = action.options.Ch; - action.options.Val = action.options.ChAct; - break; - case 'AuxOn', 'MixOn': - // cmd = 'set MIXER:Current/Mix/Fader/On '+ opt.Ch + ' 0 1'; - newAction = 187; - action.options.X = action.options.Ch; - action.options.Val = 1; - break; - case 'AuxOff', 'MixOff': - // cmd = 'set MIXER:Current/Mix/Fader/On '+ opt.Ch + ' 0 0'; - newAction = 187; - action.options.X = action.options.Ch; - action.options.Val = 0; - break; - case 'AuxLevel', 'MixLevel': - // cmd = 'set MIXER:Current/Mix/Fader/Level ' + opt.Ch + ' 0 ' + opt.ChAct; - newAction = 185; - action.options.X = action.options.Ch; - action.options.Val = action.options.ChAct; - break; - case 'MtrxOn': - // cmd = 'set MIXER:Current/Mtrx/Fader/On '+ opt.Ch + ' 0 1'; - newAction = 7; - action.options.X = action.options.Ch; - action.options.Val = 1; - break; - case 'MtrxOff': - // cmd = 'set MIXER:Current/Mtrx/Fader/On '+ opt.Ch + ' 0 0'; - newAction = 7; - action.options.X = action.options.Ch; - action.options.Val = 0; - break; - case 'MtrxLevel': - // cmd = 'set MIXER:Current/Mtrx/Fader/Level ' + opt.Ch + ' 0 ' + opt.ChAct; - newAction = 2; - action.options.X = action.options.Ch; - action.options.Val = action.options.ChAct; - break; - case 'TFRecall': - // cmd = 'ssrecall_ex scene_'+ opt.Bank + ' ' + opt.Scene; - newAction = 1000; - action.options.X = action.options.Scene; - action.options.Y = action.options.Bank; - break; - case 'CLQLRecall': - // cmd = 'ssrecall_ex MIXER:Lib/Scene ' + opt.Scene; - newAction = 1000; - action.options.X = action.options.Scene; - break; - } - - if(newAction != '') { - console.log(`Action ${action.action} => scp_${newAction}`); - action.action = 'scp_' + newAction; - changed = true; - } - - return changed; - } - - for (let k in actions) { - changed = checkUpgrade(actions[k], changed); - } - - return changed; - }, - - // Upgrade 1.1.2 > 1.1.3 - function (context, config, actions, feedbacks) { - console.log('Running 1.1.2 -> 1.1.3 Upgrade.') - var changed = false; - - let checkUpgrade = function(action, changed) { - let newAction = ''; - - if(action.action.substring(0, 4) != 'scp_') { - newAction = action.action; - } - - if(newAction != '') { - console.log(`Action ${action.action} => scp_${newAction}`); - action.action = 'scp_' + newAction; - changed = true; - } - - return changed; - } - - for (let k in actions) { - changed = checkUpgrade(actions[k], changed); - } - - - for (let k in feedbacks) { - changed = checkUpgrade(feedbacks[k], changed); - } - - return changed; - }, -] +module.exports = { + // Upgrade 1.0.x > 1.1.0 + upg111to112: (context, config, actions, feedbacks) => { + var changed = false + console.log('Running 1.1.1 -> 1.1.2 Upgrade.') + + let checkUpgrade = (action, changed) => { + let newAction = '' + + switch (action.action) { + case 'InChOn': + // cmd = 'set MIXER:Current/InCh/Fader/On '+ opt.Ch + ' 0 1'; + newAction = 186 + action.options.X = actions.options.Ch + action.options.Val = 1 + break + case 'InChOff': + // cmd = 'set MIXER:Current/InCh/Fader/On '+ opt.Ch + ' 0 0'; + newAction = 186 + action.options.X = actions.options.Ch + action.options.Val = 0 + break + case 'InChLevel': + // cmd = 'set MIXER:Current/InCh/Fader/Level ' + opt.Ch + ' 0 ' + opt.ChAct; + newAction = 184 + action.options.X = action.options.Ch + action.options.Val = action.options.ChAct + break + case ('AuxOn', 'MixOn'): + // cmd = 'set MIXER:Current/Mix/Fader/On '+ opt.Ch + ' 0 1'; + newAction = 187 + action.options.X = action.options.Ch + action.options.Val = 1 + break + case ('AuxOff', 'MixOff'): + // cmd = 'set MIXER:Current/Mix/Fader/On '+ opt.Ch + ' 0 0'; + newAction = 187 + action.options.X = action.options.Ch + action.options.Val = 0 + break + case ('AuxLevel', 'MixLevel'): + // cmd = 'set MIXER:Current/Mix/Fader/Level ' + opt.Ch + ' 0 ' + opt.ChAct; + newAction = 185 + action.options.X = action.options.Ch + action.options.Val = action.options.ChAct + break + case 'MtrxOn': + // cmd = 'set MIXER:Current/Mtrx/Fader/On '+ opt.Ch + ' 0 1'; + newAction = 7 + action.options.X = action.options.Ch + action.options.Val = 1 + break + case 'MtrxOff': + // cmd = 'set MIXER:Current/Mtrx/Fader/On '+ opt.Ch + ' 0 0'; + newAction = 7 + action.options.X = action.options.Ch + action.options.Val = 0 + break + case 'MtrxLevel': + // cmd = 'set MIXER:Current/Mtrx/Fader/Level ' + opt.Ch + ' 0 ' + opt.ChAct; + newAction = 2 + action.options.X = action.options.Ch + action.options.Val = action.options.ChAct + break + case 'TFRecall': + // cmd = 'ssrecall_ex scene_'+ opt.Bank + ' ' + opt.Scene; + newAction = 1000 + action.options.X = action.options.Scene + action.options.Y = action.options.Bank + break + case 'CLQLRecall': + // cmd = 'ssrecall_ex MIXER:Lib/Scene ' + opt.Scene; + newAction = 1000 + action.options.X = action.options.Scene + break + } + + if (newAction != '') { + console.log(`Action ${action.action} => scp_${newAction}`) + action.action = 'scp_' + newAction + action.label = this.id + ':' + action.action + changed = true + } + + return changed + } + + for (let k in actions) { + changed = checkUpgrade(actions[k], changed) + } + + return changed + }, + + // Upgrade 1.1.2 > 1.1.3, adds "scp_" in front of action names (for no real reason...) + upg112to113: (context, config, actions, feedbacks) => { + console.log('Running 1.1.2 -> 1.1.3 Upgrade.') + var changed = false + + let checkUpgrade = (action, changed) => { + let newAction = '' + + if (action.action != undefined && action.action.slice(0, 4) != 'scp_' && action.action.slice(0, 6) != 'MIXER_') { + newAction = action.action + } + + if (newAction != '') { + console.log(`Action ${action.action} => scp_${newAction}`) + action.action = 'scp_' + newAction + action.label = this.id + ':' + action.action + changed = true + } + + return changed + } + + for (let k in actions) { + changed = checkUpgrade(actions[k], changed) + } + + for (let k in feedbacks) { + changed = checkUpgrade(feedbacks[k], changed) + } + + return changed + }, + + // Upgrade 1.1.3 > 1.6.0, changes action names to actual RCP names + upg113to160: (context, config, actions, feedbacks) => { + var paramFuncs = require('./paramFuncs') + + console.log('Running 1.1.3 -> 1.6.0 Upgrade.') + var changed = false + + if (config != null) { + var rcpCommands = paramFuncs.getParams(this, config) + } + + let checkUpgrade = (action, isAction, changed) => { + let newAction = undefined + + let name = isAction ? action.action : action.type + + if (name !== undefined && name.slice(0, 4) == 'scp_') { + newAction = rcpCommands.find((i) => i.Index == name.slice(4)) + + if (newAction !== undefined) { + newName = newAction.Address.replace(/:/g, '_') + console.log(`Action ${name} => ${newName}`) + isAction ? (action.action = newName) : (action.type = newName) + action.label = this.id + ':' + newName + changed = true + } else { + console.log(`Action ${name} not found in list!`) + } + } + return changed + } + + for (let k in actions) { + changed = checkUpgrade(actions[k], true, changed) + } + + for (let k in feedbacks) { + changed = checkUpgrade(feedbacks[k], false, changed) + } + + return changed + }, +}