set cut_paste_input [stack 0] push $cut_paste_input Group { name rgbDRT_PrimaryDistance addUserKnob {20 Params} addUserKnob {41 Lp T ToneScale.Lp} addUserKnob {41 su l surround T ToneScale.su} addUserKnob {26 ""} addUserKnob {41 eotf T InverseEOTF.eotf} addUserKnob {41 display_gamut l "display gamut" -STARTLINE T XYZ_to_DisplayGamut.gamut} addUserKnob {6 clamp -STARTLINE} addUserKnob {4 direction M {forward inverse}} addUserKnob {20 RenderGamut} addUserKnob {26 directions l " " T "Directions
\n1. Choose a starting gamut from the presets
\n2. Specify distance and rotation for each primary
\n
\nMore distance means more desaturation
\nRotation determines direction of hue skew\n\n"} addUserKnob {26 ""} addUserKnob {26 gamut_chromaticities_label l " " T "SRC Gamut Chromaticity Coordinates"} addUserKnob {35 src_presets l preset M {gamut/ACES "knobs this \{nrxy \{0.73470 0.26530\} ngxy \{0.00000 1.00000\} nbxy \{0.00010 -0.07700\} nwxy \{0.32168 0.33767\} src_colorspace_name \{ACES\}\}" gamut/ACEScg "knobs this \{nrxy \{0.713 0.293\} ngxy \{0.165 0.830\} nbxy \{0.128 0.044\} nwxy \{0.32168 0.33767\} src_colorspace_name \{ACEScg\}\}" "gamut/Filmlight E-Gamut" "knobs this \{ nrxy \{0.8 0.3177\} ngxy \{0.18 0.9\} nbxy \{0.065 -0.0805\} nwxy \{0.3127 0.329\} src_colorspace_name \{Filmlight E-Gamut\}\}" "gamut/DaVinci WG" "knobs this \{ nrxy \{0.8 0.3130\} ngxy \{0.1682 0.9877\} nbxy \{0.079 -0.1155\} nwxy \{0.3127 0.329\} src_colorspace_name \{DaVinci WG\}\}" gamut/Rec709 "knobs this \{nrxy \{0.64000 0.33000\} ngxy \{0.30000 0.60000\} nbxy \{0.15000 0.06000\} nwxy \{0.3127 0.329\} src_colorspace_name \{Rec709\}\}" gamut/Rec2020 "knobs this \{nrxy \{0.70800 0.29200\} ngxy \{0.17000 0.79700\} nbxy \{0.13100 0.04600\} nwxy \{0.3127 0.329\} src_colorspace_name \{Rec2020\}\}" gamut/P3D60 "knobs this \{nrxy \{0.68000 0.32000\} ngxy \{0.26500 0.69000\} nbxy \{0.15000 0.06000\} nwxy \{0.32168 0.33767\} src_colorspace_name \{P3D60\}\}" gamut/P3D65 "knobs this \{nrxy \{0.68000 0.32000\} ngxy \{0.26500 0.69000\} nbxy \{0.15000 0.06000\} nwxy \{0.3127 0.329\} src_colorspace_name \{P3D65\}\}" gamut/P3DCI "knobs this \{nrxy \{0.68000 0.32000\} ngxy \{0.26500 0.69000\} nbxy \{0.15000 0.06000\} nwxy \{0.314 0.351\} src_colorspace_name \{P3DCI\}\}" "gamut/Arri AlexaWideGamut" "knobs this \{nrxy \{0.68400 0.31300\} ngxy \{0.22100 0.84800\} nbxy \{0.08610 -0.10200\} nwxy \{0.3127 0.329\} src_colorspace_name \{Arri AlexaWideGamut\}\}" gamut/REDDRAGONcolor "knobs this \{nrxy \{0.753044222785 0.327830576682\} ngxy \{0.299570228481 0.700699321956\} nbxy \{0.079642066735 -0.0549379510888\} nwxy \{0.321683187724 0.337673316035\} src_colorspace_name \{REDDRAGONcolor\}\}" gamut/REDDRAGONcolor2 "knobs this \{nrxy \{0.753044491143 0.327831029513\} ngxy \{0.299570490451 0.700699415614\} nbxy \{0.145011584278 0.0510971250879\} nwxy \{0.321683210353 0.337673610062\} src_colorspace_name \{REDDRAGONcolor2\}\}" gamut/REDcolor "knobs this \{nrxy \{0.699747001291 0.329046930313\} ngxy \{0.304264039024 0.623641145129\} nbxy \{0.134913961296 0.0347174412813\} nwxy \{0.321683289449 0.337673447208\} src_colorspace_name \{REDcolor\}\}" gamut/REDcolor2 "knobs this \{nrxy \{0.878682510476 0.32496400741\} ngxy \{0.300888714367 0.679054755791\} nbxy \{0.0953986946056 -0.0293793268343\} nwxy \{0.321683289449 0.337673447208\} src_colorspace_name \{REDcolor2\}\}" gamut/REDcolor3 "knobs this \{nrxy \{0.701181035906 0.329014155583\} ngxy \{0.300600304652 0.683788834269\} nbxy \{0.108154455624 -0.00868817578666\} nwxy \{0.321683210353 0.337673610062\} src_colorspace_name \{REDcolor3\}\}" gamut/REDcolor4 "knobs this \{nrxy \{0.701180591892 0.329013699116\} ngxy \{0.300600395529 0.683788824257\} nbxy \{0.145331946229 0.0516168036226\} nwxy \{0.321683289449 0.337673447208\} src_colorspace_name \{REDcolor4\}\}" gamut/REDWideGamutRGB "knobs this \{nrxy \{0.780308 0.304253\} ngxy \{0.121595 1.493994\} nbxy \{0.095612 -0.084589\} nwxy \{0.3127 0.329\} src_colorspace_name \{REDWideGamutRGB\}\}" "gamut/GoPro Protune Native" "knobs this \{nrxy \{0.69848046 0.19302645\} ngxy \{0.32955538 1.02459662\} nbxy \{0.10844263 -0.03467857\} nwxy \{0.3127 0.329\} src_colorspace_name \{GoPro Protune Native\}\}" gamut/CanonCinemaGamut "knobs this \{nrxy \{0.74 0.27\} ngxy \{0.17 1.14\} nbxy \{0.08 -0.1\} nwxy \{0.3127 0.329\} src_colorspace_name \{CanonCinemaGamut\}\}" gamut/SonySGamut "knobs this \{nrxy \{0.73 0.28\} ngxy \{0.14 0.855\} nbxy \{0.1 -0.05\} nwxy \{0.3127 0.329\} src_colorspace_name \{SonySGamut\}\}" gamut/SonySGamut3Cine "knobs this \{nrxy \{0.766 0.275\} ngxy \{0.225 0.8\} nbxy \{0.089 -0.087\} nwxy \{0.3127 0.329\} src_colorspace_name \{SonySGamut3Cine\}\}" gamut/PanasonicVGamut "knobs this \{nrxy \{0.730 0.280\} ngxy \{0.165 0.840\} nbxy \{0.100 -0.030\} nwxy \{0.3127 0.329\} src_colorspace_name \{PanasonicVGamut\}\}" "gamut/DJI D-Gamut" "knobs this \{nrxy \{0.71 0.31\} ngxy \{0.21 0.88\} nbxy \{0.09 -0.08\} nwxy \{0.3127 0.329\} src_colorspace_name \{DJI D-Gamut\}\}" "gamut/Fujifilm F-Gamut" "knobs this \{nrxy \{0.70800 0.29200\} ngxy \{0.17000 0.79700\} nbxy \{0.13100 0.04600\} nwxy \{0.3127 0.329\} src_colorspace_name \{Fujifilm F-Gamut\}\}" gamut/BMDFilmV1 "knobs this \{nrxy \{0.9173 0.2502\} ngxy \{0.2833 1.7072\} nbxy \{0.0856 -0.0708\} nwxy \{0.3135 0.3305\} src_colorspace_name \{BMDFilmV1\}\}" gamut/BMD4kFilmV1 "knobs this \{nrxy \{0.7422 0.2859\} ngxy \{0.4140 1.3035\} nbxy \{0.0342 -0.0833\} nwxy \{0.3135 0.3305\} src_colorspace_name \{BMD4kFilmV1\}\}" gamut/BMD4kFilmV3 "knobs this \{nrxy \{1.0625 0.3948\} ngxy \{0.3689 0.7775\} nbxy \{0.0956 -0.0332\} nwxy \{0.3135 0.3305\} src_colorspace_name \{BMD4kFilmV3\}\}" gamut/BMD46kFilmV1 "knobs this \{nrxy \{0.9175 0.2983\} ngxy \{0.2983 1.2835\} nbxy \{0.0756 -0.0860\} nwxy \{0.3127 0.329\} src_colorspace_name \{BMD46kFilmV1\}\}" gamut/BMD46kFilmV3 "knobs this \{nrxy \{0.8608 0.3689\} ngxy \{0.3282 0.6156\} nbxy \{0.0783 -0.0233\} nwxy \{0.3127 0.329\} src_colorspace_name \{BMD46kFilmV3\}\}" gamut/BMDWideGamutV4 "knobs this \{nrxy \{0.7177 0.3171\} ngxy \{0.2280 0.8616\} nbxy \{0.1006 -0.0820\} nwxy \{0.3127 0.329\} src_colorspace_name \{BMDWideGamutV4\}\}" "gamut/Blackmagic Wide Gamut" "knobs this \{nrxy \{0.7177215 0.3171181\} ngxy \{0.2280410 0.8615690\} nbxy \{0.1005841 -0.0820452\} nwxy \{0.3127 0.329\} src_colorspace_name \{Blackmagic Wide Gamut\}\}" "gamut/AdobeRGB " "knobs this \{nrxy \{0.6400 0.3300\} ngxy \{0.2100 0.7100\} nbxy \{0.1500 0.0600\} nwxy \{0.3127 0.329\} src_colorspace_name \{AdobeRGB\}\}" gamut/AdobeWideGamutRGB "knobs this \{nrxy \{0.7347 0.2653\} ngxy \{0.1152 0.8264\} nbxy \{0.1566 0.0177\} nwxy \{0.3457 0.3585\} src_colorspace_name \{AdobeWideGamutRGB\}\}" gamut/ROMM "knobs this \{nrxy \{7.34700000e-01 2.65300000e-01\} ngxy \{1.59600000e-01 8.40400000e-01\} nbxy \{3.66000000e-02 1.00000000e-04\} nwxy \{0.3457 0.3585\} src_colorspace_name \{ROMM\}\}" gamut/RIMM "knobs this \{nrxy \{7.34700000e-01 2.65300000e-01\} ngxy \{1.59600000e-01 8.40400000e-01\} nbxy \{3.66000000e-02 1.00000000e-04\} nwxy \{0.3457 0.3585\} src_colorspace_name \{RIMM\}\}" gamut/ERIMM "knobs this \{nrxy \{7.34700000e-01 2.65300000e-01\} ngxy \{1.59600000e-01 8.40400000e-01\} nbxy \{3.66000000e-02 1.00000000e-04\} nwxy \{0.3457 0.3585\} src_colorspace_name \{ERIMM\}\}" gamut/ProPhotoRGB "knobs this \{nrxy \{0.734699 0.265301\} ngxy \{0.159597 0.840403\} nbxy \{0.036598 0.000105\} nwxy \{0.345704 0.358540\} src_colorspace_name \{ProPhotoRGB\}\}" gamut/RusselRGB "knobs this \{nrxy \{0.6900 0.3100\} ngxy \{0.1800 0.7700\} nbxy \{0.1000 0.0200\} nwxy \{0.33243 0.34744\} src_colorspace_name \{RusselRGB\}\}" gamut/SharpRGB "knobs this \{nrxy \{0.6898 0.3206\} ngxy \{0.0736 0.9003\} nbxy \{0.1166 0.0374\} nwxy \{0.33333333 0.33333333\} src_colorspace_name \{SharpRGB\}\}" gamut/AppleRGB "knobs this \{nrxy \{0.6250 0.3400\} ngxy \{0.2800 0.5950\} nbxy \{0.1550 0.0700\} nwxy \{0.3127 0.329\} src_colorspace_name \{AppleRGB\}\}" gamut/BestRGB "knobs this \{nrxy \{0.735191637630662 0.264808362369338\} ngxy \{0.215336134453781 0.774159663865546\} nbxy \{0.130122950819672 0.034836065573770\} nwxy \{0.3457 0.3585\} src_colorspace_name \{BestRGB\}\}" "gamutn/XYZ D60" "knobs this \{nrxy \{1 0\} ngxy \{0 1\} nbxy \{0 0\} nwxy \{0.32162624 0.337737\} src_colorspace_name n\{XYZ D60\}\}" "gamutn/XYZ D65" "knobs this \{nrxy \{1 0\} ngxy \{0 1\} nbxy \{0 0\} nwxy \{0.3127 0.329\} src_colorspace_name n\{XYZ D65\}\}" "gamutn/XYZ E" "knobs this \{nrxy \{1 0\} ngxy \{0 1\} nbxy \{0 0\} nwxy \{0.333333333333 0.333333333333\} src_colorspace_name n\{XYZ E\}\}" "" ""}} addUserKnob {12 nrxy l r t "Red xy chromaticity coordinates in CIE 1931 colorspace."} nrxy {0.68 0.32} addUserKnob {12 ngxy l g t "Green xy chromaticity coordinates in CIE 1931 colorspace."} ngxy {0.265 0.69} addUserKnob {12 nbxy l b t "Blue xy chromaticity coordinates in CIE 1931 colorspace."} nbxy {0.15 0.06} addUserKnob {12 nwxy l w t "Whitepoint xy chromaticity coordinates in CIE 1931 colorspace."} nwxy {0.3127 0.329} addUserKnob {1 src_colorspace_name l src +DISABLED} src_colorspace_name P3D65 addUserKnob {26 ""} addUserKnob {41 rd l "r dist" T _knobchanged_.rd} addUserKnob {41 rr l "r rot" T _knobchanged_.rr} addUserKnob {41 gd l "g dist" T _knobchanged_.gd} addUserKnob {41 gr l "g rot" T _knobchanged_.gr} addUserKnob {41 bd l "b dist" T _knobchanged_.bd} addUserKnob {41 br l "b rot" T _knobchanged_.br} addUserKnob {41 sl T _knobchanged_.sl} addUserKnob {26 ""} addUserKnob {41 rxy l r T _knobchanged_.rxy} addUserKnob {41 gxy l g T _knobchanged_.gxy} addUserKnob {41 bxy l b T _knobchanged_.bxy} addUserKnob {41 wxy l w T _knobchanged_.wxy} addUserKnob {26 ""} addUserKnob {41 invert T _knobchanged_.invert} addUserKnob {22 create_matrix_node l "Create Matrix" t "Create ColorMatrix node with the current values." T "node = nuke.thisNode()\n\nnuke.root().begin()\n_ = \[n.setSelected(False) for n in nuke.allNodes(recurseGroups=True)]\nm = nuke.createNode('ColorMatrix')\nm\['matrix'].setValue(node\['matrix'].getValue())\nm.setXYpos(node.xpos()-120, node.ypos())\nsrc_name = node\['src_colorspace_name'].getValue()\ndst_name = 'XYZ'\nif node\['invert'].getValue():\n label = '\{1\} to \{0\}'.format(src_name, dst_name)\nelse:\n label = '\{0\} to \{1\}'.format(src_name, dst_name)\n\nm\['label'].setValue(label)" +STARTLINE} addUserKnob {41 matrix T ColorMatrix.matrix} addUserKnob {22 clear l Clear T "n = nuke.thisNode()\nn\['matrix'].setValue(\[1,0,0,0,1,0,0,0,1])\nn\['label'].setValue('')" +STARTLINE} addUserKnob {22 show_matrix l Show t "Show matrix values in a popup window for copying." T "node = nuke.thisNode()\nshow_4x4 = node\['show_matrix_4x4'].getValue()\nshow_commas = node\['show_matrix_commas'].getValue()\n\nif show_commas:\n sep = ', '\nelse:\n sep = ' '\n\nmtx = \[format(i, '.8f') for i in node\['matrix'].getValue()]\n\nif show_4x4:\n z = \['0']\n mtx = mtx\[0:3] + z + mtx\[3:6] + z + mtx\[6:9] + z*4 + \['1']\n\nnuke.message(sep.join(mtx))" +STARTLINE} addUserKnob {6 show_matrix_4x4 l "show 4x4" t "present values in a 4x4 matrix (useful for ocio)" -STARTLINE} addUserKnob {6 show_matrix_commas l "show comma sep" t "show matrix comma separated." -STARTLINE} addUserKnob {22 save_spimtx l "Save spimtx" T "# inspired by ColorMatrixPlus by hpd\ndef write_spimtx(mtx_node, spimtx_file):\n mtx_vals = mtx_node\['matrix'].getValue()\n with open(spimtx_file, \"w\") as f:\n f.write( \"%3.6f %3.6f %3.6f 0.0\\n\" % (\n mtx_vals\[0], mtx_vals\[1], mtx_vals\[2]) )\n f.write( \"%3.6f %3.6f %3.6f 0.0\\n\" % (\n mtx_vals\[3], mtx_vals\[4], mtx_vals\[5]) )\n f.write( \"%3.6f %3.6f %3.6f 0.0\\n\" % (\n mtx_vals\[6], mtx_vals\[7], mtx_vals\[8]) )\n\nnode = nuke.thisNode()\nfilepath = nuke.getFilename('Save Matrix', '*.spimtx')\n\nif filepath:\n if not filepath.endswith('.spimtx'):\n filepath = filepath + '.spimtx'\n write_spimtx(node, filepath)" +STARTLINE} addUserKnob {22 load_spimtx l "Load spimtx" -STARTLINE T "# Inspired by ColorMatrixPlus by hpd\ndef load_spimtx(spimtx, mtx_node):\n with open( spimtx, 'r') as file:\n lines = file.readlines()\n matrix_values = list()\n for line in lines:\n matrix_values.extend( map(float, line.strip().split(' ')\[0:3]) )\n mtx_node\['matrix'].setValue(matrix_values)\n\nspimtx = nuke.getFilename('Load SPIMTX', '*.spimtx')\nif spimtx:\n load_spimtx( spimtx, nuke.thisNode() )\n"} } Input { inputs 0 name Input xpos -40 ypos -226 } set Nf0689600 [stack 0] Group { name EOTF xpos 180 ypos -154 addUserKnob {20 EOTF_tab l EOTF} addUserKnob {4 eotf l EOTF t "Choose the inverse EOTF to apply for the target display device." M {None "sRGB Display" BT.1886 "Gamma 2.6" PQ HLG ""}} eotf {{parent.InverseEOTF.eotf}} } Input { inputs 0 name Input xpos 400 ypos -130 } set Nf0688800 [stack 0] Expression { expr0 r<=0.5?r*r/3:(exp((r-_c)/_a)+_b)/12 expr1 g<=0.5?g*g/3:(exp((g-_c)/_a)+_b)/12 expr2 b<=0.5?b*b/3:(exp((b-_c)/_a)+_b)/12 name HLG_InverseOETF xpos 620 ypos -58 addUserKnob {20 CONSTANTS_tab l CONSTANTS} addUserKnob {7 _a t alpha} _a 0.17883277 addUserKnob {7 _b t beta} _b {{1-4*_a}} addUserKnob {7 _c} _c {{0.5-_a*log(4*_a)}} } Expression { temp_name0 Ys temp_expr0 0.2627*r+0.6780*g+0.0593*b expr0 pow(Ys,_g-1)*r expr1 pow(Ys,_g-1)*g expr2 pow(Ys,_g-1)*b name HLG_OOTF xpos 620 ypos -34 addUserKnob {20 CONSTANTS_tab l CONSTANTS} addUserKnob {7 _g t "Gamma: Extended model for gamma variation according to peak display luminance and surround luminance: BT.2390-8 p32" R 0 2} _g {{1.2*pow(1.111,log(Lp/1000)/log(2))*pow(0.98,log(max(1e-6,Lamb)/5)/log(2))}} addUserKnob {7 Lp R 600 4000} Lp 1000 addUserKnob {7 Lb} addUserKnob {7 Lamb t "ambient luminance level in nits" R 0 200} Lamb 5 } push $Nf0688800 Expression { temp_name0 rp temp_expr0 pow(r,1/m_2) temp_name1 gp temp_expr1 pow(g,1/m_2) temp_name2 bp temp_expr2 pow(b,1/m_2) expr0 pow((rp-c_1)/(c_2-c_3*rp),1/m_1) expr1 pow((gp-c_1)/(c_2-c_3*gp),1/m_1) expr2 pow((bp-c_1)/(c_2-c_3*bp),1/m_1) name ST2084_EOTF xpos 510 ypos -58 addUserKnob {20 CONSTANTS_tab l CONSTANTS} addUserKnob {7 m_1} m_1 {{2610/4096*(1/4)}} addUserKnob {7 m_2} m_2 {{2523/4096*128}} addUserKnob {7 c_1} c_1 {{107/128}} addUserKnob {7 c_2} c_2 {{2413/128}} addUserKnob {7 c_3} c_3 {{2392/128}} } push $Nf0688800 Expression { expr0 sign(r)*pow(fabs(r),p) expr1 sign(g)*pow(fabs(g),p) expr2 sign(b)*pow(fabs(b),p) name Power xpos 400 ypos -58 addUserKnob {20 Params_tab l Params} addUserKnob {7 p l power R 0.2 2} p {{eotf?2+eotf*0.2:1}} } Switch { inputs 3 which {{eotf-3}} name SwitchInverseEOTF xpos 400 ypos -10 } Output { name Output xpos 400 ypos 62 } end_group Expression { temp_name3 L temp_expr3 w.0*r+w.1*g+w.2*b expr0 L*(1-sa)+r*sa expr1 L*(1-sa)+g*sa expr2 L*(1-sa)+b*sa name InvSaturation xpos 180 ypos -106 addUserKnob {20 Params} addUserKnob {7 sa l saturation R 0 2} sa {{1/parent.Saturation.sa}} addUserKnob {78 w l weights t "luminance weights for selected gamut" n 3} w {{parent.XYZ_to_DisplayGamut.ColorMatrix.matrix.3 0.272229 0.2627 0.228975 0.212639} {parent.XYZ_to_DisplayGamut.ColorMatrix.matrix.4 0.674082 0.677998 0.691739 0.715169} {parent.XYZ_to_DisplayGamut.ColorMatrix.matrix.5 0.0536895 0.0593017 0.0792869 0.0721923}} } ColorMatrix { matrix { {{parent.XYZ_to_DisplayGamut.ColorMatrix.matrix} {parent.XYZ_to_DisplayGamut.ColorMatrix.matrix} {parent.XYZ_to_DisplayGamut.ColorMatrix.matrix}} {{parent.XYZ_to_DisplayGamut.ColorMatrix.matrix} {parent.XYZ_to_DisplayGamut.ColorMatrix.matrix} {parent.XYZ_to_DisplayGamut.ColorMatrix.matrix}} {{parent.XYZ_to_DisplayGamut.ColorMatrix.matrix} {parent.XYZ_to_DisplayGamut.ColorMatrix.matrix} {parent.XYZ_to_DisplayGamut.ColorMatrix.matrix}} } invert true name DisplayGamut_to_XYZ xpos 180 ypos -82 } ColorMatrix { matrix { {{parent.ColorMatrix.matrix} {parent.ColorMatrix.matrix} {parent.ColorMatrix.matrix}} {{parent.ColorMatrix.matrix} {parent.ColorMatrix.matrix} {parent.ColorMatrix.matrix}} {{parent.ColorMatrix.matrix} {parent.ColorMatrix.matrix} {parent.ColorMatrix.matrix}} } name ColorMatrix2 label "XYZ to GAMUT" note_font Helvetica xpos 180 ypos -63 } Expression { expr0 r*sc expr1 g*sc expr2 b*sc name InvDisplayScale xpos 180 ypos -10 addUserKnob {20 Params} addUserKnob {7 sc} sc {{parent.DisplayScale.sc}} } Expression { temp_name0 rt temp_expr0 (r+sqrt(r*(4*fl+r)))/2 temp_name1 gt temp_expr1 (g+sqrt(g*(4*fl+g)))/2 temp_name2 bt temp_expr2 (b+sqrt(b*(4*fl+b)))/2 expr0 (pow(rt/sy,1/p)/(1-pow(rt/sy,1/p)))*sx expr1 (pow(gt/sy,1/p)/(1-pow(gt/sy,1/p)))*sx expr2 (pow(bt/sy,1/p)/(1-pow(bt/sy,1/p)))*sx name InvToneScale xpos 180 ypos 14 addUserKnob {20 Params} addUserKnob {7 p R 1 2} p {{parent.ToneScale.p}} addUserKnob {7 fl l flare R 0 0.01} fl {{parent.ToneScale.fl}} addUserKnob {7 sx R 0 10} sx {{parent.ToneScale.sx}} addUserKnob {7 sy R 0 4} sy {{parent.ToneScale.sy}} } Expression { expr0 r