From b20cb39c66bf2c0d1d69be4f2e160e55f54008ec Mon Sep 17 00:00:00 2001 From: mwinter Date: Thu, 7 Mar 2024 18:28:56 -0600 Subject: [PATCH] reconciling coda of rise 3 with edited material for playback and adding first draft of description --- latex/seeds_and_ledgers_1_to_3.log | 794 ++++++-------- latex/seeds_and_ledgers_1_to_3.pdf | Bin 653149 -> 656396 bytes latex/seeds_and_ledgers_1_to_3.synctex.gz | Bin 20355 -> 25298 bytes latex/seeds_and_ledgers_1_to_3.tex | 33 +- resources/string_quartet_3.json | 21 - resources/string_quartet_3.json_bak | 20 - .../45fa07e8/45fa07e8_code.scd | 966 ----------------- .../45fa07e8/45fa07e8_mus_model.json | 443 -------- .../4ff624b0/4ff624b0_mus_model.json | 552 ---------- .../5201b8af/5201b8af_code.scd | 945 ----------------- .../5201b8af/5201b8af_mus_model.json | 58 -- .../5201b8af/lilypond/part_I.ly | 16 - .../5201b8af/lilypond/part_II.ly | 16 - .../5201b8af/lilypond/part_III.ly | 16 - .../5201b8af/lilypond/part_IV.ly | 16 - .../5488f7e9/5488f7e9_code.scd | 945 ----------------- .../5488f7e9/5488f7e9_mus_model.json | 163 --- .../55bd25a1/55bd25a1_code.scd | 973 ----------------- .../55bd25a1/55bd25a1_mus_model.json | 548 ---------- .../55f9b81e/55f9b81e_code.scd | 958 ----------------- .../55f9b81e/55f9b81e_mus_model.json | 443 -------- .../577cf188/577cf188_code.scd | 945 ----------------- .../577cf188/577cf188_mus_model.json | 198 ---- .../5ec14635/5ec14635_code.scd | 946 ----------------- .../5ec14635/5ec14635_mus_model.json | 163 --- .../69c568c6/69c568c6_code.scd | 973 ----------------- .../69c568c6/69c568c6_mus_model.json | 535 ---------- .../6a9928d6/6a9928d6_code.scd | 973 ----------------- .../6a9928d6/6a9928d6_mus_model.json | 554 ---------- .../6f0f638f/6f0f638f_code.scd | 945 ----------------- .../6f0f638f/6f0f638f_mus_model.json | 105 -- .../726a40c7/726a40c7_code.scd | 946 ----------------- .../726a40c7/726a40c7_mus_model.json | 163 --- .../75316bf0/75316bf0_code.scd | 973 ----------------- .../75316bf0/75316bf0_mus_model.json | 550 ---------- .../781442dc/781442dc_code.scd | 945 ----------------- .../781442dc/781442dc_mus_model.json | 117 --- .../7c2de94c/7c2de94c_code.scd | 945 ----------------- .../7c2de94c/7c2de94c_mus_model.json | 163 --- .../7e230015/7e230015_code.scd | 975 ------------------ .../7e230015/7e230015_mus_model.json | 532 ---------- .../string_quartet_3/tmp/tmp_mus_model.json | 532 ---------- resources/string_quartet_3_rise.json | 2 +- .../4dd2a130/4dd2a130_mus_model.json | 34 +- .../4dd2a130/lilypond/part_I.ly | 5 +- .../4dd2a130/lilypond/part_II.ly | 5 +- .../4dd2a130/lilypond/part_III.ly | 5 +- .../4dd2a130/lilypond/part_IV.ly | 6 +- .../4f53a446/lilypond/part_I.ly | 3 +- .../4f53a446/lilypond/part_II.ly | 4 +- .../4f53a446/lilypond/part_III.ly | 4 +- .../4f53a446/lilypond/part_IV.ly | 5 +- .../50c2b0ad/50c2b0ad_mus_model.json | 40 +- .../50c2b0ad/lilypond/part_I.ly | 8 +- .../50c2b0ad/lilypond/part_II.ly | 6 +- .../50c2b0ad/lilypond/part_III.ly | 6 +- .../50c2b0ad/lilypond/part_IV.ly | 6 +- .../536cac90/536cac90_mus_model.json | 46 +- .../536cac90/lilypond/part_I.ly | 14 +- .../536cac90/lilypond/part_II.ly | 10 +- .../536cac90/lilypond/part_III.ly | 10 +- .../536cac90/lilypond/part_IV.ly | 8 +- .../567a9375/lilypond/part_I.ly | 6 +- .../567a9375/lilypond/part_II.ly | 4 +- .../567a9375/lilypond/part_III.ly | 5 +- .../567a9375/lilypond/part_IV.ly | 5 +- .../5ededd80/5ededd80_code.scd} | 37 +- .../5ededd80/5ededd80_mus_model.json | 54 + .../5ededd80/lilypond/part_I.ly | 5 + .../5ededd80/lilypond/part_II.ly | 4 + .../5ededd80/lilypond/part_III.ly | 4 + .../5ededd80/lilypond/part_IV.ly | 4 + .../5ef20586/5ef20586_mus_model.json | 34 +- .../5ef20586/lilypond/part_I.ly | 6 +- .../5ef20586/lilypond/part_II.ly | 5 +- .../5ef20586/lilypond/part_III.ly | 6 +- .../5ef20586/lilypond/part_IV.ly | 6 +- .../5f0075ab/5f0075ab_mus_model.json | 2 +- .../5f0075ab/lilypond/part_I.ly | 5 +- .../5f0075ab/lilypond/part_II.ly | 4 +- .../5f0075ab/lilypond/part_III.ly | 6 +- .../5f0075ab/lilypond/part_IV.ly | 5 +- .../61207e49/61207e49_mus_model.json | 126 +-- .../61207e49/lilypond/part_I.ly | 15 +- .../61207e49/lilypond/part_II.ly | 12 +- .../61207e49/lilypond/part_III.ly | 12 +- .../61207e49/lilypond/part_IV.ly | 11 +- .../624f7439/624f7439_mus_model.json | 70 +- .../624f7439/lilypond/part_I.ly | 11 +- .../624f7439/lilypond/part_II.ly | 13 +- .../624f7439/lilypond/part_III.ly | 10 +- .../624f7439/lilypond/part_IV.ly | 10 +- .../65120e88/65120e88_mus_model.json | 34 +- .../65120e88/lilypond/part_I.ly | 5 +- .../65120e88/lilypond/part_II.ly | 5 +- .../65120e88/lilypond/part_III.ly | 5 +- .../65120e88/lilypond/part_IV.ly | 5 +- .../66b20499/66b20499_mus_model.json | 30 +- .../66b20499/lilypond/part_I.ly | 5 +- .../66b20499/lilypond/part_II.ly | 6 +- .../66b20499/lilypond/part_III.ly | 8 +- .../66b20499/lilypond/part_IV.ly | 9 +- .../736745da/736745da_mus_model.json | 34 +- .../736745da/lilypond/part_I.ly | 5 +- .../736745da/lilypond/part_II.ly | 6 +- .../736745da/lilypond/part_III.ly | 6 +- .../736745da/lilypond/part_IV.ly | 6 +- .../767e70f0/767e70f0_mus_model.json | 32 +- .../767e70f0/lilypond/part_I.ly | 9 +- .../767e70f0/lilypond/part_II.ly | 5 +- .../767e70f0/lilypond/part_III.ly | 6 +- .../767e70f0/lilypond/part_IV.ly | 6 +- .../4f53a446/lilypond/part_IV.pdf | Bin 47841 -> 0 bytes supercollider/seeds_and_ledgers_main.scd | 4 +- 114 files changed, 858 insertions(+), 21201 deletions(-) delete mode 100644 resources/string_quartet_3.json delete mode 100644 resources/string_quartet_3.json_bak delete mode 100644 resources/string_quartet_3/45fa07e8/45fa07e8_code.scd delete mode 100644 resources/string_quartet_3/45fa07e8/45fa07e8_mus_model.json delete mode 100644 resources/string_quartet_3/4ff624b0/4ff624b0_mus_model.json delete mode 100644 resources/string_quartet_3/5201b8af/5201b8af_code.scd delete mode 100644 resources/string_quartet_3/5201b8af/5201b8af_mus_model.json delete mode 100644 resources/string_quartet_3/5201b8af/lilypond/part_I.ly delete mode 100644 resources/string_quartet_3/5201b8af/lilypond/part_II.ly delete mode 100644 resources/string_quartet_3/5201b8af/lilypond/part_III.ly delete mode 100644 resources/string_quartet_3/5201b8af/lilypond/part_IV.ly delete mode 100644 resources/string_quartet_3/5488f7e9/5488f7e9_code.scd delete mode 100644 resources/string_quartet_3/5488f7e9/5488f7e9_mus_model.json delete mode 100644 resources/string_quartet_3/55bd25a1/55bd25a1_code.scd delete mode 100644 resources/string_quartet_3/55bd25a1/55bd25a1_mus_model.json delete mode 100644 resources/string_quartet_3/55f9b81e/55f9b81e_code.scd delete mode 100644 resources/string_quartet_3/55f9b81e/55f9b81e_mus_model.json delete mode 100644 resources/string_quartet_3/577cf188/577cf188_code.scd delete mode 100644 resources/string_quartet_3/577cf188/577cf188_mus_model.json delete mode 100644 resources/string_quartet_3/5ec14635/5ec14635_code.scd delete mode 100644 resources/string_quartet_3/5ec14635/5ec14635_mus_model.json delete mode 100644 resources/string_quartet_3/69c568c6/69c568c6_code.scd delete mode 100644 resources/string_quartet_3/69c568c6/69c568c6_mus_model.json delete mode 100644 resources/string_quartet_3/6a9928d6/6a9928d6_code.scd delete mode 100644 resources/string_quartet_3/6a9928d6/6a9928d6_mus_model.json delete mode 100644 resources/string_quartet_3/6f0f638f/6f0f638f_code.scd delete mode 100644 resources/string_quartet_3/6f0f638f/6f0f638f_mus_model.json delete mode 100644 resources/string_quartet_3/726a40c7/726a40c7_code.scd delete mode 100644 resources/string_quartet_3/726a40c7/726a40c7_mus_model.json delete mode 100644 resources/string_quartet_3/75316bf0/75316bf0_code.scd delete mode 100644 resources/string_quartet_3/75316bf0/75316bf0_mus_model.json delete mode 100644 resources/string_quartet_3/781442dc/781442dc_code.scd delete mode 100644 resources/string_quartet_3/781442dc/781442dc_mus_model.json delete mode 100644 resources/string_quartet_3/7c2de94c/7c2de94c_code.scd delete mode 100644 resources/string_quartet_3/7c2de94c/7c2de94c_mus_model.json delete mode 100644 resources/string_quartet_3/7e230015/7e230015_code.scd delete mode 100644 resources/string_quartet_3/7e230015/7e230015_mus_model.json delete mode 100644 resources/string_quartet_3/tmp/tmp_mus_model.json rename resources/{string_quartet_3/4ff624b0/4ff624b0_code.scd => string_quartet_3_rise/5ededd80/5ededd80_code.scd} (96%) create mode 100644 resources/string_quartet_3_rise/5ededd80/5ededd80_mus_model.json create mode 100644 resources/string_quartet_3_rise/5ededd80/lilypond/part_I.ly create mode 100644 resources/string_quartet_3_rise/5ededd80/lilypond/part_II.ly create mode 100644 resources/string_quartet_3_rise/5ededd80/lilypond/part_III.ly create mode 100644 resources/string_quartet_3_rise/5ededd80/lilypond/part_IV.ly delete mode 100644 resources/string_quartet_3_rise_coda_only/4f53a446/lilypond/part_IV.pdf diff --git a/latex/seeds_and_ledgers_1_to_3.log b/latex/seeds_and_ledgers_1_to_3.log index afbdb5b..f106e01 100644 --- a/latex/seeds_and_ledgers_1_to_3.log +++ b/latex/seeds_and_ledgers_1_to_3.log @@ -1,4 +1,4 @@ -This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023/Arch Linux) (preloaded format=pdflatex 2024.2.5) 7 MAR 2024 16:22 +This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023/Arch Linux) (preloaded format=pdflatex 2024.2.5) 7 MAR 2024 17:58 entering extended mode \write18 enabled. %&-line parsing enabled. @@ -148,152 +148,6 @@ LaTeX Info: Redefining \] on input line 2954. \xmathstrut@box=\box53 \xmathstrut@dim=\dimen167 ) -(/usr/share/texmf-dist/tex/latex/minted/minted.sty -Package: minted 2022/12/12 v2.7 Yet another Pygments shim for LaTeX - -(/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty -Package: kvoptions 2022-06-15 v3.15 Key value format for package options (HO) - -(/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty -Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO) -) -(/usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty -Package: kvsetkeys 2022-10-05 v1.19 Key value parser (HO) -)) -(/usr/share/texmf-dist/tex/latex/fvextra/fvextra.sty -Package: fvextra 2022/11/30 v1.5 fvextra - extensions and patches for fancyvrb - -(/usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty -Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW) -\etb@tempcnta=\count278 -) -(/usr/share/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty -Package: fancyvrb 2023/01/19 4.5a verbatim text (tvz,hv) -\FV@CodeLineNo=\count279 -\FV@InFile=\read2 -\FV@TabBox=\box54 -\c@FancyVerbLine=\count280 -\FV@StepNumber=\count281 -\FV@OutFile=\write3 -) -(/usr/share/texmf-dist/tex/latex/upquote/upquote.sty -Package: upquote 2012/04/19 v1.3 upright-quote and grave-accent glyphs in verba -tim -) -(/usr/share/texmf-dist/tex/latex/lineno/lineno.sty -Package: lineno 2023/01/19 line numbers on paragraphs v5.1 -\linenopenalty=\count282 -\output=\toks23 -\linenoprevgraf=\count283 -\linenumbersep=\dimen168 -\linenumberwidth=\dimen169 -\c@linenumber=\count284 -\c@pagewiselinenumber=\count285 -\c@LN@truepage=\count286 -\c@internallinenumber=\count287 -\c@internallinenumbers=\count288 -\quotelinenumbersep=\dimen170 -\bframerule=\dimen171 -\bframesep=\dimen172 -\bframebox=\box55 -\linenoamsmath@ams@eqpen=\count289 -LaTeX Info: Redefining \\ on input line 3131. -) -\c@FV@TrueTabGroupLevel=\count290 -\c@FV@TrueTabCounter=\count291 -\FV@TabBox@Group=\box56 -\FV@TmpLength=\skip57 -\c@FV@HighlightLinesStart=\count292 -\c@FV@HighlightLinesStop=\count293 -\FV@LoopCount=\count294 -\FV@NCharsBox=\box57 -\FV@BreakIndent=\dimen173 -\FV@BreakIndentNChars=\count295 -\FV@BreakSymbolSepLeft=\dimen174 -\FV@BreakSymbolSepLeftNChars=\count296 -\FV@BreakSymbolSepRight=\dimen175 -\FV@BreakSymbolSepRightNChars=\count297 -\FV@BreakSymbolIndentLeft=\dimen176 -\FV@BreakSymbolIndentLeftNChars=\count298 -\FV@BreakSymbolIndentRight=\dimen177 -\FV@BreakSymbolIndentRightNChars=\count299 -\c@FancyVerbLineBreakLast=\count300 -\FV@LineBox=\box58 -\FV@LineIndentBox=\box59 -\c@FV@BreakBufferDepth=\count301 -\FV@LineWidth=\dimen178 -) -(/usr/share/texmf-dist/tex/latex/base/ifthen.sty -Package: ifthen 2022/04/13 v1.1d Standard LaTeX ifthen package (DPC) -) -(/usr/share/texmf-dist/tex/latex/tools/shellesc.sty -Package: shellesc 2019/11/08 v1.0c unified shell escape interface for LaTeX -Package shellesc Info: Unrestricted shell escape enabled on input line 75. -) -(/usr/share/texmf-dist/tex/latex/ifplatform/ifplatform.sty -Package: ifplatform 2017/10/13 v0.4a Testing for the operating system - -(/usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty -Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO -) - -(/usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty -Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) -) -Package pdftexcmds Info: \pdf@primitive is available. -Package pdftexcmds Info: \pdf@ifprimitive is available. -Package pdftexcmds Info: \pdfdraftmode found. -) -(/usr/share/texmf-dist/tex/generic/catchfile/catchfile.sty -Package: catchfile 2019/12/09 v1.8 Catch the contents of a file (HO) - -(/usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty -Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) -)) -(/usr/share/texmf-dist/tex/generic/iftex/ifluatex.sty -Package: ifluatex 2019/10/25 v1.5 ifluatex legacy package. Use iftex instead. -) -runsystem(uname -s > "seeds_and_ledgers_1_to_3.w18")...executed. - - -(./seeds_and_ledgers_1_to_3.w18) -runsystem(rm -- "seeds_and_ledgers_1_to_3.w18")...executed. - -) -(/usr/share/texmf-dist/tex/generic/xstring/xstring.sty -(/usr/share/texmf-dist/tex/generic/xstring/xstring.tex -\integerpart=\count302 -\decimalpart=\count303 -) -Package: xstring 2023/01/14 v1.85 String manipulations (CT) -) -(/usr/share/texmf-dist/tex/latex/framed/framed.sty -Package: framed 2011/10/22 v 0.96: framed or shaded text with page breaks -\OuterFrameSep=\skip58 -\fb@frw=\dimen179 -\fb@frh=\dimen180 -\FrameRule=\dimen181 -\FrameSep=\dimen182 -) -(/usr/share/texmf-dist/tex/latex/float/float.sty -Package: float 2001/11/08 v1.3d Float enhancements (AL) -\c@float@type=\count304 -\float@exts=\toks24 -\float@box=\box60 -\@float@everytoks=\toks25 -\@floatcapt=\box61 -) -\minted@appexistsfile=\read3 -\minted@bgbox=\box62 -\minted@code=\write4 -\c@minted@FancyVerbLineTemp=\count305 -\c@minted@pygmentizecounter=\count306 -\@float@every@listing=\toks26 -\c@listing=\count307 -) -runsystem(mkdir -p _minted-seeds_and_ledgers_1_to_3)...executed. - - (/usr/share/texmf-dist/tex/latex/wasysym/wasysym.sty Package: wasysym 2020/01/19 v2.4 Wasy-2 symbol support package \symwasy=\mathgroup4 @@ -302,27 +156,36 @@ LaTeX Font Info: Overwriting symbol font `wasy' in version `bold' ) (/usr/share/texmf-dist/tex/latex/tools/multicol.sty Package: multicol 2021/11/30 v1.9d multicolumn formatting (FMi) -\c@tracingmulticols=\count308 -\mult@box=\box63 -\multicol@leftmargin=\dimen183 -\c@unbalance=\count309 -\c@collectmore=\count310 -\doublecol@number=\count311 -\multicoltolerance=\count312 -\multicolpretolerance=\count313 -\full@width=\dimen184 -\page@free=\dimen185 -\premulticols=\dimen186 -\postmulticols=\dimen187 -\multicolsep=\skip59 -\multicolbaselineskip=\skip60 -\partial@page=\box64 -\last@line=\box65 -\maxbalancingoverflow=\dimen188 -\mult@rightbox=\box66 -\mult@grightbox=\box67 -\mult@firstbox=\box68 -\mult@gfirstbox=\box69 +\c@tracingmulticols=\count278 +\mult@box=\box54 +\multicol@leftmargin=\dimen168 +\c@unbalance=\count279 +\c@collectmore=\count280 +\doublecol@number=\count281 +\multicoltolerance=\count282 +\multicolpretolerance=\count283 +\full@width=\dimen169 +\page@free=\dimen170 +\premulticols=\dimen171 +\postmulticols=\dimen172 +\multicolsep=\skip57 +\multicolbaselineskip=\skip58 +\partial@page=\box55 +\last@line=\box56 +\maxbalancingoverflow=\dimen173 +\mult@rightbox=\box57 +\mult@grightbox=\box58 +\mult@firstbox=\box59 +\mult@gfirstbox=\box60 +\@tempa=\box61 +\@tempa=\box62 +\@tempa=\box63 +\@tempa=\box64 +\@tempa=\box65 +\@tempa=\box66 +\@tempa=\box67 +\@tempa=\box68 +\@tempa=\box69 \@tempa=\box70 \@tempa=\box71 \@tempa=\box72 @@ -350,44 +213,35 @@ Package: multicol 2021/11/30 v1.9d multicolumn formatting (FMi) \@tempa=\box94 \@tempa=\box95 \@tempa=\box96 -\@tempa=\box97 -\@tempa=\box98 -\@tempa=\box99 -\@tempa=\box100 -\@tempa=\box101 -\@tempa=\box102 -\@tempa=\box103 -\@tempa=\box104 -\@tempa=\box105 -\c@minrows=\count314 -\c@columnbadness=\count315 -\c@finalcolumnbadness=\count316 -\last@try=\dimen189 -\multicolovershoot=\dimen190 -\multicolundershoot=\dimen191 -\mult@nat@firstbox=\box106 -\colbreak@box=\box107 -\mc@col@check@num=\count317 +\c@minrows=\count284 +\c@columnbadness=\count285 +\c@finalcolumnbadness=\count286 +\last@try=\dimen174 +\multicolovershoot=\dimen175 +\multicolundershoot=\dimen176 +\mult@nat@firstbox=\box97 +\colbreak@box=\box98 +\mc@col@check@num=\count287 ) (/usr/share/texmf-dist/tex/generic/dirtree/dirtree.sty Package: dirtree 2012/12/11 v0.32 package wrapper for dirtree (/usr/share/texmf-dist/tex/generic/dirtree/dirtree.tex `dirtree' v0.32, 2012/12/11 (jcc) -\DT@offset=\dimen192 -\DT@width=\dimen193 -\DT@sep=\dimen194 -\DT@all=\dimen195 -\DT@rulewidth=\dimen196 -\DT@dotwidth=\dimen197 -\DTbaselineskip=\dimen198 -\DT@counti=\count318 -\DT@countii=\count319 -\DT@countiii=\count320 -\DT@countiv=\count321 -\DT@indent=\dimen199 -\DT@parskip=\dimen256 -\DT@baselineskip=\dimen257 +\DT@offset=\dimen177 +\DT@width=\dimen178 +\DT@sep=\dimen179 +\DT@all=\dimen180 +\DT@rulewidth=\dimen181 +\DT@dotwidth=\dimen182 +\DTbaselineskip=\dimen183 +\DT@counti=\count288 +\DT@countii=\count289 +\DT@countiii=\count290 +\DT@countiv=\count291 +\DT@indent=\dimen184 +\DT@parskip=\dimen185 +\DT@baselineskip=\dimen186 ) File: dirtree.tex 2012/12/11 v0.32 `dirtree' (jcc) ) @@ -398,10 +252,13 @@ LaTeX Info: Redefining \_ on input line 42. (/usr/share/texmf-dist/tex/latex/pdfpages/pdfpages.sty Package: pdfpages 2022/12/19 v0.5x Insert pages of external PDF documents (AM) +(/usr/share/texmf-dist/tex/latex/base/ifthen.sty +Package: ifthen 2022/04/13 v1.1d Standard LaTeX ifthen package (DPC) +) (/usr/share/texmf-dist/tex/latex/eso-pic/eso-pic.sty Package: eso-pic 2020/10/14 v3.0a eso-pic (RN) -\ESO@tempdima=\dimen258 -\ESO@tempdimb=\dimen259 +\ESO@tempdima=\dimen187 +\ESO@tempdimb=\dimen188 (/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty Package: xcolor 2022/06/12 v2.14 LaTeX color extensions (UK) @@ -439,69 +296,69 @@ File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration ) Package graphics Info: Driver file: pdftex.def on input line 107. ) -\Gin@req@height=\dimen260 -\Gin@req@width=\dimen261 +\Gin@req@height=\dimen189 +\Gin@req@width=\dimen190 ) -\AM@pagewidth=\dimen262 -\AM@pageheight=\dimen263 -\AM@fboxrule=\dimen264 +\AM@pagewidth=\dimen191 +\AM@pageheight=\dimen192 +\AM@fboxrule=\dimen193 (/usr/share/texmf-dist/tex/latex/pdfpages/pppdftex.def File: pppdftex.def 2022/12/19 v0.5x Pdfpages driver for pdfTeX (AM) ) -\pdfpages@includegraphics@status=\count322 -\AM@pagebox=\box108 -\AM@global@opts=\toks27 -\AM@pagecnt=\count323 -\AM@toc@title=\toks28 -\AM@lof@heading=\toks29 -\c@AM@survey=\count324 -\AM@templatesizebox=\box109 +\pdfpages@includegraphics@status=\count292 +\AM@pagebox=\box99 +\AM@global@opts=\toks23 +\AM@pagecnt=\count293 +\AM@toc@title=\toks24 +\AM@lof@heading=\toks25 +\c@AM@survey=\count294 +\AM@templatesizebox=\box100 ) (/usr/share/texmf-dist/tex/latex/wrapfig/wrapfig.sty -\wrapoverhang=\dimen265 -\WF@size=\dimen266 -\c@WF@wrappedlines=\count325 -\WF@box=\box110 -\WF@everypar=\toks30 +\wrapoverhang=\dimen194 +\WF@size=\dimen195 +\c@WF@wrappedlines=\count295 +\WF@box=\box101 +\WF@everypar=\toks26 Package: wrapfig 2003/01/31 v 3.6 ) (/usr/share/texmf-dist/tex/latex/tocloft/tocloft.sty Package: tocloft 2017/08/31 v2.3i parameterised ToC, etc., typesetting Package tocloft Info: The document has section divisions on input line 51. -\cftparskip=\skip61 -\cftbeforetoctitleskip=\skip62 -\cftaftertoctitleskip=\skip63 -\cftbeforepartskip=\skip64 -\cftpartnumwidth=\skip65 -\cftpartindent=\skip66 -\cftbeforesecskip=\skip67 -\cftsecindent=\skip68 -\cftsecnumwidth=\skip69 -\cftbeforesubsecskip=\skip70 -\cftsubsecindent=\skip71 -\cftsubsecnumwidth=\skip72 -\cftbeforesubsubsecskip=\skip73 -\cftsubsubsecindent=\skip74 -\cftsubsubsecnumwidth=\skip75 -\cftbeforeparaskip=\skip76 -\cftparaindent=\skip77 -\cftparanumwidth=\skip78 -\cftbeforesubparaskip=\skip79 -\cftsubparaindent=\skip80 -\cftsubparanumwidth=\skip81 -\cftbeforeloftitleskip=\skip82 -\cftafterloftitleskip=\skip83 -\cftbeforefigskip=\skip84 -\cftfigindent=\skip85 -\cftfignumwidth=\skip86 -\c@lofdepth=\count326 -\c@lotdepth=\count327 -\cftbeforelottitleskip=\skip87 -\cftafterlottitleskip=\skip88 -\cftbeforetabskip=\skip89 -\cfttabindent=\skip90 -\cfttabnumwidth=\skip91 +\cftparskip=\skip59 +\cftbeforetoctitleskip=\skip60 +\cftaftertoctitleskip=\skip61 +\cftbeforepartskip=\skip62 +\cftpartnumwidth=\skip63 +\cftpartindent=\skip64 +\cftbeforesecskip=\skip65 +\cftsecindent=\skip66 +\cftsecnumwidth=\skip67 +\cftbeforesubsecskip=\skip68 +\cftsubsecindent=\skip69 +\cftsubsecnumwidth=\skip70 +\cftbeforesubsubsecskip=\skip71 +\cftsubsubsecindent=\skip72 +\cftsubsubsecnumwidth=\skip73 +\cftbeforeparaskip=\skip74 +\cftparaindent=\skip75 +\cftparanumwidth=\skip76 +\cftbeforesubparaskip=\skip77 +\cftsubparaindent=\skip78 +\cftsubparanumwidth=\skip79 +\cftbeforeloftitleskip=\skip80 +\cftafterloftitleskip=\skip81 +\cftbeforefigskip=\skip82 +\cftfigindent=\skip83 +\cftfignumwidth=\skip84 +\c@lofdepth=\count296 +\c@lotdepth=\count297 +\cftbeforelottitleskip=\skip85 +\cftafterlottitleskip=\skip86 +\cftbeforetabskip=\skip87 +\cfttabindent=\skip88 +\cfttabnumwidth=\skip89 ) (/usr/share/texmf-dist/tex/latex/blindtext/blindtext.sty Package: blindtext 2012/01/06 V2.0 blindtext-Package @@ -509,24 +366,24 @@ Package: blindtext 2012/01/06 V2.0 blindtext-Package (/usr/share/texmf-dist/tex/latex/tools/xspace.sty Package: xspace 2014/10/28 v1.13 Space after command names (DPC,MH) ) -\c@blindtext=\count328 -\c@Blindtext=\count329 -\c@blind@countparstart=\count330 -\blind@countxx=\count331 -\blindtext@numBlindtext=\count332 -\blind@countyy=\count333 -\c@blindlist=\count334 -\c@blindlistlevel=\count335 -\c@blindlist@level=\count336 -\blind@listitem=\count337 -\c@blind@listcount=\count338 -\c@blind@levelcount=\count339 -\blind@mathformula=\count340 -\blind@Mathformula=\count341 -\c@blind@randomcount=\count342 -\c@blind@randommax=\count343 -\c@blind@pangramcount=\count344 -\c@blind@pangrammax=\count345 +\c@blindtext=\count298 +\c@Blindtext=\count299 +\c@blind@countparstart=\count300 +\blind@countxx=\count301 +\blindtext@numBlindtext=\count302 +\blind@countyy=\count303 +\c@blindlist=\count304 +\c@blindlistlevel=\count305 +\c@blindlist@level=\count306 +\blind@listitem=\count307 +\c@blind@listcount=\count308 +\c@blind@levelcount=\count309 +\blind@mathformula=\count310 +\blind@Mathformula=\count311 +\c@blind@randomcount=\count312 +\c@blind@randommax=\count313 +\c@blind@pangramcount=\count314 +\c@blind@pangrammax=\count315 ) (/usr/share/texmf-dist/tex/latex/etaremune/etaremune.sty Package: etaremune 2005/06/01 v1.2 Reversed enumerate (HA) @@ -536,14 +393,14 @@ Package: xkeyval 2022/06/16 v2.9 package option processing (HA) (/usr/share/texmf-dist/tex/generic/xkeyval/xkeyval.tex (/usr/share/texmf-dist/tex/generic/xkeyval/xkvutils.tex -\XKV@toks=\toks31 -\XKV@tempa@toks=\toks32 +\XKV@toks=\toks27 +\XKV@tempa@toks=\toks28 ) -\XKV@depth=\count346 +\XKV@depth=\count316 File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA) )) -\c@EM@itemctr=\count347 -\c@EM@etaremunectr=\count348 +\c@EM@itemctr=\count317 +\c@EM@etaremunectr=\count318 ) (/usr/share/texmf-dist/tex/latex/sclang-prettifier/sclang-prettifier.sty Package: sclang-prettifier 2014/06/14 v0.1 A package for prettyprinting SuperCo @@ -553,35 +410,52 @@ llider source code Package: textcomp 2020/02/02 v2.0n Standard LaTeX package ) (/usr/share/texmf-dist/tex/latex/listings/listings.sty -\lst@mode=\count349 -\lst@gtempboxa=\box111 -\lst@token=\toks33 -\lst@length=\count350 -\lst@currlwidth=\dimen267 -\lst@column=\count351 -\lst@pos=\count352 -\lst@lostspace=\dimen268 -\lst@width=\dimen269 -\lst@newlines=\count353 -\lst@lineno=\count354 -\lst@maxwidth=\dimen270 +\lst@mode=\count319 +\lst@gtempboxa=\box102 +\lst@token=\toks29 +\lst@length=\count320 +\lst@currlwidth=\dimen196 +\lst@column=\count321 +\lst@pos=\count322 +\lst@lostspace=\dimen197 +\lst@width=\dimen198 +\lst@newlines=\count323 +\lst@lineno=\count324 +\lst@maxwidth=\dimen199 (/usr/share/texmf-dist/tex/latex/listings/lstmisc.sty File: lstmisc.sty 2023/02/27 1.9 (Carsten Heinz) -\c@lstnumber=\count355 -\lst@skipnumbers=\count356 -\lst@framebox=\box112 +\c@lstnumber=\count325 +\lst@skipnumbers=\count326 +\lst@framebox=\box103 ) (/usr/share/texmf-dist/tex/latex/listings/listings.cfg File: listings.cfg 2023/02/27 1.9 listings configuration )) Package: listings 2023/02/27 1.9 (Carsten Heinz) -\currentchar@scpr=\count357 -\toks@scpr=\toks34 +\currentchar@scpr=\count327 +\toks@scpr=\toks30 ) (/usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty Package: hyperref 2023-02-07 v7.00v Hypertext links for LaTeX +(/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO) +) +(/usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO +) + +(/usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +(/usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2022-10-05 v1.19 Key value parser (HO) +) (/usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) ) @@ -605,12 +479,15 @@ Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) ) (/usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) + +(/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2022-06-15 v3.15 Key value format for package options (HO) +)) +\c@section@level=\count328 ) -\c@section@level=\count358 -) -\@linkdim=\dimen271 -\Hy@linkcounter=\count359 -\Hy@pagecounter=\count360 +\@linkdim=\dimen256 +\Hy@linkcounter=\count329 +\Hy@pagecounter=\count330 (/usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def File: pd1enc.def 2023-02-07 v7.00v Hyperref: PDFDocEncoding definition (HO) @@ -620,7 +497,10 @@ Now handling font encoding PD1 ... (/usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) ) -\Hy@SavedSpaceFactor=\count361 +(/usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty +Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) +) +\Hy@SavedSpaceFactor=\count331 (/usr/share/texmf-dist/tex/latex/hyperref/puenc.def File: puenc.def 2023-02-07 v7.00v Hyperref: PDF Unicode definition (HO) @@ -634,14 +514,14 @@ Package hyperref Info: Plain pages OFF on input line 4192. Package hyperref Info: Backreferencing OFF on input line 4197. Package hyperref Info: Implicit mode ON; LaTeX internals redefined. Package hyperref Info: Bookmarks ON on input line 4425. -\c@Hy@tempcnt=\count362 +\c@Hy@tempcnt=\count332 (/usr/share/texmf-dist/tex/latex/url/url.sty \Urlmuskip=\muskip17 Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. ) LaTeX Info: Redefining \url on input line 4763. -\XeTeXLinkMargin=\dimen272 +\XeTeXLinkMargin=\dimen257 (/usr/share/texmf-dist/tex/generic/bitset/bitset.sty Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) @@ -650,9 +530,9 @@ Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO ) )) -\Fld@menulength=\count363 -\Field@Width=\dimen273 -\Fld@charsize=\dimen274 +\Fld@menulength=\count333 +\Field@Width=\dimen258 +\Fld@charsize=\dimen259 Package hyperref Info: Hyper figures OFF on input line 6042. Package hyperref Info: Link nesting OFF on input line 6047. Package hyperref Info: Hyper index ON on input line 6050. @@ -665,9 +545,9 @@ Package hyperref Info: PDF/A mode OFF on input line 6072. Package: atbegshi-ltx 2021/01/10 v1.0c Emulation of the original atbegshi package with kernel methods ) -\Hy@abspage=\count364 -\c@Item=\count365 -\c@Hfootnote=\count366 +\Hy@abspage=\count334 +\c@Item=\count335 +\c@Hfootnote=\count336 ) Package hyperref Info: Driver (autodetected): hpdftex. @@ -679,8 +559,8 @@ Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atveryend pac kage with kernel methods ) -\Fld@listcount=\count367 -\c@bookmark@seq@number=\count368 +\Fld@listcount=\count337 +\c@bookmark@seq@number=\count338 (/usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty Package: rerunfilecheck 2022-07-10 v1.10 Rerun checks for auxiliary files (HO) @@ -691,7 +571,7 @@ Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 85. ) -\Hy@SectionHShift=\skip92 +\Hy@SectionHShift=\skip90 ) (/usr/share/texmf-dist/tex/latex/lipsum/lipsum.sty (/usr/share/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty @@ -700,15 +580,15 @@ Package: expl3 2023-02-22 L3 programming layer (loader) (/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def File: l3backend-pdftex.def 2023-01-16 L3 backend support: PDF output (pdfTeX) -\l__color_backend_stack_int=\count369 -\l__pdf_internal_box=\box113 +\l__color_backend_stack_int=\count339 +\l__pdf_internal_box=\box104 )) Package: l3keys2e 2023-02-02 LaTeX2e option processing using LaTeX3 keys ) Package: lipsum 2021-09-20 v2.7 150 paragraphs of Lorem Ipsum dummy text -\g__lipsum_par_int=\count370 -\l__lipsum_a_int=\count371 -\l__lipsum_b_int=\count372 +\g__lipsum_par_int=\count340 +\l__lipsum_a_int=\count341 +\l__lipsum_b_int=\count342 (/usr/share/texmf-dist/tex/latex/lipsum/lipsum.ltd.tex)) (/usr/share/texmf-dist/tex/latex/datetime2/datetime2.sty @@ -717,12 +597,16 @@ Package: datetime2 2021/03/21 v1.5.7 (NLCT) date and time formats (/usr/share/texmf-dist/tex/latex/tracklang/tracklang.sty Package: tracklang 2022/12/13 v1.6.1 (NLCT) Track Languages -(/usr/share/texmf-dist/tex/generic/tracklang/tracklang.tex))) +(/usr/share/texmf-dist/tex/generic/tracklang/tracklang.tex)) +(/usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count343 +)) (/usr/share/texmf-dist/tex/latex/tools/verbatim.sty Package: verbatim 2022-07-02 v1.5u LaTeX2e package for verbatim enhancements -\every@verbatim=\toks35 -\verbatim@line=\toks36 -\verbatim@in@stream=\read4 +\every@verbatim=\toks31 +\verbatim@line=\toks32 +\verbatim@in@stream=\read2 ) (/usr/share/texmf-dist/tex/latex/lm/lmodern.sty Package: lmodern 2015/05/01 v1.6.1 Latin Modern Fonts @@ -759,36 +643,32 @@ LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold' LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold' (Font) OT1/cmtt/m/n --> OT1/lmtt/m/n on input line 38. ) -runsystem(which pygmentize && touch seeds_and_ledgers_1_to_3.aex)...executed. - -runsystem(rm seeds_and_ledgers_1_to_3.aex)...executed. - LaTeX Font Info: Trying to load font information for OT1+lmr on input line 5 -7. +6. (/usr/share/texmf-dist/tex/latex/lm/ot1lmr.fd File: ot1lmr.fd 2015/05/01 v1.6.1 Font defs for Latin Modern ) (./seeds_and_ledgers_1_to_3.aux) \openout1 = `seeds_and_ledgers_1_to_3.aux'. -LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 57. -LaTeX Font Info: ... okay on input line 57. -LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 57. -LaTeX Font Info: ... okay on input line 57. -LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 57. -LaTeX Font Info: ... okay on input line 57. -LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 57. -LaTeX Font Info: ... okay on input line 57. -LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 57. -LaTeX Font Info: ... okay on input line 57. -LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 57. -LaTeX Font Info: ... okay on input line 57. -LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 57. -LaTeX Font Info: ... okay on input line 57. -LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 57. -LaTeX Font Info: ... okay on input line 57. -LaTeX Font Info: Checking defaults for PU/pdf/m/n on input line 57. -LaTeX Font Info: ... okay on input line 57. +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 56. +LaTeX Font Info: ... okay on input line 56. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 56. +LaTeX Font Info: ... okay on input line 56. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 56. +LaTeX Font Info: ... okay on input line 56. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 56. +LaTeX Font Info: ... okay on input line 56. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 56. +LaTeX Font Info: ... okay on input line 56. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 56. +LaTeX Font Info: ... okay on input line 56. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 56. +LaTeX Font Info: ... okay on input line 56. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 56. +LaTeX Font Info: ... okay on input line 56. +LaTeX Font Info: Checking defaults for PU/pdf/m/n on input line 56. +LaTeX Font Info: ... okay on input line 56. *geometry* driver: auto-detecting *geometry* detected driver: pdftex *geometry* verbose mode - [ preamble ] result: @@ -825,17 +705,17 @@ LaTeX Font Info: ... okay on input line 57. (/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii [Loading MPS to PDF converter (version 2006.09.02).] -\scratchcounter=\count373 -\scratchdimen=\dimen275 -\scratchbox=\box114 -\nofMPsegments=\count374 -\nofMParguments=\count375 -\everyMPshowfont=\toks37 -\MPscratchCnt=\count376 -\MPscratchDim=\dimen276 -\MPnumerator=\count377 -\makeMPintoPDFobject=\count378 -\everyMPtoPDFconversion=\toks38 +\scratchcounter=\count344 +\scratchdimen=\dimen260 +\scratchbox=\box105 +\nofMPsegments=\count345 +\nofMParguments=\count346 +\everyMPshowfont=\toks33 +\MPscratchCnt=\count347 +\MPscratchDim=\dimen261 +\MPnumerator=\count348 +\makeMPintoPDFobject=\count349 +\everyMPtoPDFconversion=\toks34 ) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 @@ -857,12 +737,12 @@ Package: lscape 2020/05/28 v3.02 Landscape Pages (DPC) ) Package pdflscape Info: Auto-detected driver: pdftex on input line 81. )) -\c@lstlisting=\count379 -Package hyperref Info: Link coloring OFF on input line 57. +\c@lstlisting=\count350 +Package hyperref Info: Link coloring OFF on input line 56. (./seeds_and_ledgers_1_to_3.out) (./seeds_and_ledgers_1_to_3.out) -\@outlinefile=\write5 -\openout5 = `seeds_and_ledgers_1_to_3.out'. +\@outlinefile=\write3 +\openout3 = `seeds_and_ledgers_1_to_3.out'. (./seeds_and_ledgers_1_to_3.toc @@ -895,11 +775,11 @@ LaTeX Font Info: Trying to load font information for U+wasy on input line 1. (/usr/share/texmf-dist/tex/latex/wasysym/uwasy.fd File: uwasy.fd 2020/01/19 v2.4 Wasy-2 symbol font definitions )) -\tf@toc=\write6 -\openout6 = `seeds_and_ledgers_1_to_3.toc'. +\tf@toc=\write4 +\openout4 = `seeds_and_ledgers_1_to_3.toc'. LaTeX Font Info: Trying to load font information for OT1+lmtt on input line -106. +113. (/usr/share/texmf-dist/tex/latex/lm/ot1lmtt.fd File: ot1lmtt.fd 2015/05/01 v1.6.1 Font defs for Latin Modern @@ -914,13 +794,13 @@ File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf used on input line 152. +1.pdf used on input line 161. (pdftex.def) Requested size: 597.51086pt x 845.04504pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf used on input line 152. +1.pdf used on input line 161. (pdftex.def) Requested size: 597.51086pt x 845.04504pt. <../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf, id=42, page=1, 59 7.51233pt x 845.0471pt> @@ -928,31 +808,31 @@ File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page1 used on input line 152. +1.pdf , page1 used on input line 161. (pdftex.def) Requested size: 597.51086pt x 845.04504pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page1 used on input line 152. +1.pdf , page1 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page1 used on input line 152. +1.pdf , page1 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page1 used on input line 152. +1.pdf , page1 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page1 used on input line 152. +1.pdf , page1 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [3 @@ -963,19 +843,19 @@ File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page2 used on input line 152. +1.pdf , page2 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page2 used on input line 152. +1.pdf , page2 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page2 used on input line 152. +1.pdf , page2 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [4 <../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf>] <../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf, id=68, page=3, 59 @@ -984,19 +864,19 @@ File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page3 used on input line 152. +1.pdf , page3 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page3 used on input line 152. +1.pdf , page3 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page3 used on input line 152. +1.pdf , page3 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [5 <../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf>] <../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf, id=73, page=4, 59 @@ -1005,19 +885,19 @@ File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page4 used on input line 152. +1.pdf , page4 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page4 used on input line 152. +1.pdf , page4 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page4 used on input line 152. +1.pdf , page4 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [6 <../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf>] <../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf, id=78, page=5, 59 @@ -1026,19 +906,19 @@ File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page5 used on input line 152. +1.pdf , page5 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page5 used on input line 152. +1.pdf , page5 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page5 used on input line 152. +1.pdf , page5 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [7 <../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf>] <../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf, id=84, page=6, 59 @@ -1047,19 +927,19 @@ File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page6 used on input line 152. +1.pdf , page6 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page6 used on input line 152. +1.pdf , page6 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page6 used on input line 152. +1.pdf , page6 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [8 <../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf>] <../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf, id=89, page=7, 59 @@ -1068,19 +948,19 @@ File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page7 used on input line 152. +1.pdf , page7 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page7 used on input line 152. +1.pdf , page7 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page7 used on input line 152. +1.pdf , page7 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [9 <../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf>] <../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf, id=94, page=8, 59 @@ -1089,19 +969,19 @@ File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page8 used on input line 152. +1.pdf , page8 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page8 used on input line 152. +1.pdf , page8 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page8 used on input line 152. +1.pdf , page8 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [10 <../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf>] <../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf, id=99, page=9, 59 @@ -1110,19 +990,19 @@ File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page9 used on input line 152. +1.pdf , page9 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page9 used on input line 152. +1.pdf , page9 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page9 used on input line 152. +1.pdf , page9 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [11 <../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf>] <../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf, id=104, page=10, @@ -1131,19 +1011,19 @@ File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page10 used on input line 152. +1.pdf , page10 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page10 used on input line 152. +1.pdf , page10 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page10 used on input line 152. +1.pdf , page10 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [12 <../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf>] <../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf, id=109, page=11, @@ -1152,19 +1032,19 @@ File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page11 used on input line 152. +1.pdf , page11 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page11 used on input line 152. +1.pdf , page11 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_1/edited/seeds_and_ledgers_ -1.pdf , page11 used on input line 152. +1.pdf , page11 used on input line 161. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [13 <../lilypond/string_quartet_1/edited/seeds_and_ledgers_1.pdf>] <../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf, id=115, 597.51233 @@ -1173,13 +1053,13 @@ File: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_ -2.pdf used on input line 156. +2.pdf used on input line 165. (pdftex.def) Requested size: 597.51086pt x 845.04504pt. File: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_ -2.pdf used on input line 156. +2.pdf used on input line 165. (pdftex.def) Requested size: 597.51086pt x 845.04504pt. <../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf, id=118, page=1, 5 97.51233pt x 845.0471pt> @@ -1187,31 +1067,31 @@ File: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_ -2.pdf , page1 used on input line 156. +2.pdf , page1 used on input line 165. (pdftex.def) Requested size: 597.51086pt x 845.04504pt. File: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_ -2.pdf , page1 used on input line 156. +2.pdf , page1 used on input line 165. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_ -2.pdf , page1 used on input line 156. +2.pdf , page1 used on input line 165. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_ -2.pdf , page1 used on input line 156. +2.pdf , page1 used on input line 165. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_ -2.pdf , page1 used on input line 156. +2.pdf , page1 used on input line 165. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [14 @@ -1223,19 +1103,19 @@ File: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_ -2.pdf , page2 used on input line 156. +2.pdf , page2 used on input line 165. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_ -2.pdf , page2 used on input line 156. +2.pdf , page2 used on input line 165. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_ -2.pdf , page2 used on input line 156. +2.pdf , page2 used on input line 165. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [15 <../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf>] <../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf, id=144, page=3, 5 @@ -1244,19 +1124,19 @@ File: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_ -2.pdf , page3 used on input line 156. +2.pdf , page3 used on input line 165. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_ -2.pdf , page3 used on input line 156. +2.pdf , page3 used on input line 165. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_ -2.pdf , page3 used on input line 156. +2.pdf , page3 used on input line 165. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [16 <../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf>] <../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf, id=149, page=4, 5 @@ -1265,19 +1145,19 @@ File: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_ -2.pdf , page4 used on input line 156. +2.pdf , page4 used on input line 165. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_ -2.pdf , page4 used on input line 156. +2.pdf , page4 used on input line 165. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_ -2.pdf , page4 used on input line 156. +2.pdf , page4 used on input line 165. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [17 <../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf>] <../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf, id=154, page=5, 5 @@ -1286,19 +1166,19 @@ File: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_ -2.pdf , page5 used on input line 156. +2.pdf , page5 used on input line 165. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_ -2.pdf , page5 used on input line 156. +2.pdf , page5 used on input line 165. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_ -2.pdf , page5 used on input line 156. +2.pdf , page5 used on input line 165. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [18 <../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf>] <../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf, id=159, page=6, 5 @@ -1307,19 +1187,19 @@ File: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_ -2.pdf , page6 used on input line 156. +2.pdf , page6 used on input line 165. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_ -2.pdf , page6 used on input line 156. +2.pdf , page6 used on input line 165. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_2/edited/seeds_and_ledgers_ -2.pdf , page6 used on input line 156. +2.pdf , page6 used on input line 165. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [19 <../lilypond/string_quartet_2/edited/seeds_and_ledgers_2.pdf>] <../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf, id=165, 597. @@ -1328,13 +1208,13 @@ File: ../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/main/edited/seeds_and_led -gers_3.pdf used on input line 160. +gers_3.pdf used on input line 169. (pdftex.def) Requested size: 597.51086pt x 845.04504pt. File: ../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/main/edited/seeds_and_led -gers_3.pdf used on input line 160. +gers_3.pdf used on input line 169. (pdftex.def) Requested size: 597.51086pt x 845.04504pt. <../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf, id=168, page =1, 597.51233pt x 845.0471pt> @@ -1342,31 +1222,31 @@ File: ../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/main/edited/seeds_and_led -gers_3.pdf , page1 used on input line 160. +gers_3.pdf , page1 used on input line 169. (pdftex.def) Requested size: 597.51086pt x 845.04504pt. File: ../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/main/edited/seeds_and_led -gers_3.pdf , page1 used on input line 160. +gers_3.pdf , page1 used on input line 169. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/main/edited/seeds_and_led -gers_3.pdf , page1 used on input line 160. +gers_3.pdf , page1 used on input line 169. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/main/edited/seeds_and_led -gers_3.pdf , page1 used on input line 160. +gers_3.pdf , page1 used on input line 169. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/main/edited/seeds_and_led -gers_3.pdf , page1 used on input line 160. +gers_3.pdf , page1 used on input line 169. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [20 @@ -1377,19 +1257,19 @@ File: ../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/main/edited/seeds_and_led -gers_3.pdf , page2 used on input line 160. +gers_3.pdf , page2 used on input line 169. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/main/edited/seeds_and_led -gers_3.pdf , page2 used on input line 160. +gers_3.pdf , page2 used on input line 169. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/main/edited/seeds_and_led -gers_3.pdf , page2 used on input line 160. +gers_3.pdf , page2 used on input line 169. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [21 <../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf>] @@ -1399,19 +1279,19 @@ File: ../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/main/edited/seeds_and_led -gers_3.pdf , page3 used on input line 160. +gers_3.pdf , page3 used on input line 169. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/main/edited/seeds_and_led -gers_3.pdf , page3 used on input line 160. +gers_3.pdf , page3 used on input line 169. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/main/edited/seeds_and_led -gers_3.pdf , page3 used on input line 160. +gers_3.pdf , page3 used on input line 169. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [22 <../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf>] @@ -1421,19 +1301,19 @@ File: ../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/main/edited/seeds_and_led -gers_3.pdf , page4 used on input line 160. +gers_3.pdf , page4 used on input line 169. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/main/edited/seeds_and_led -gers_3.pdf , page4 used on input line 160. +gers_3.pdf , page4 used on input line 169. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/main/edited/seeds_and_led -gers_3.pdf , page4 used on input line 160. +gers_3.pdf , page4 used on input line 169. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [23 <../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf>] @@ -1443,19 +1323,19 @@ File: ../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/main/edited/seeds_and_led -gers_3.pdf , page5 used on input line 160. +gers_3.pdf , page5 used on input line 169. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/main/edited/seeds_and_led -gers_3.pdf , page5 used on input line 160. +gers_3.pdf , page5 used on input line 169. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf Graphic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/main/edited/seeds_and_led -gers_3.pdf , page5 used on input line 160. +gers_3.pdf , page5 used on input line 169. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [24 <../lilypond/string_quartet_3/main/edited/seeds_and_ledgers_3.pdf>] @@ -1465,13 +1345,13 @@ File: ../lilypond/string_quartet_3/coda/edited/seeds_and_ledgers_3_coda.pdf Gra phic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/coda/edited/seeds_and_led -gers_3_coda.pdf used on input line 162. +gers_3_coda.pdf used on input line 171. (pdftex.def) Requested size: 597.51086pt x 845.04504pt. File: ../lilypond/string_quartet_3/coda/edited/seeds_and_ledgers_3_coda.pdf Gra phic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/coda/edited/seeds_and_led -gers_3_coda.pdf used on input line 162. +gers_3_coda.pdf used on input line 171. (pdftex.def) Requested size: 597.51086pt x 845.04504pt. <../lilypond/string_quartet_3/coda/edited/seeds_and_ledgers_3_coda.pdf, id=213, page=1, 597.51233pt x 845.0471pt> @@ -1480,35 +1360,35 @@ phic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/coda/edited/seeds_and_led -gers_3_coda.pdf , page1 used on input line 162. +gers_3_coda.pdf , page1 used on input line 171. (pdftex.def) Requested size: 597.51086pt x 845.04504pt. File: ../lilypond/string_quartet_3/coda/edited/seeds_and_ledgers_3_coda.pdf Gra phic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/coda/edited/seeds_and_led -gers_3_coda.pdf , page1 used on input line 162. +gers_3_coda.pdf , page1 used on input line 171. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_3/coda/edited/seeds_and_ledgers_3_coda.pdf Gra phic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/coda/edited/seeds_and_led -gers_3_coda.pdf , page1 used on input line 162. +gers_3_coda.pdf , page1 used on input line 171. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_3/coda/edited/seeds_and_ledgers_3_coda.pdf Gra phic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/coda/edited/seeds_and_led -gers_3_coda.pdf , page1 used on input line 162. +gers_3_coda.pdf , page1 used on input line 171. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_3/coda/edited/seeds_and_ledgers_3_coda.pdf Gra phic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/coda/edited/seeds_and_led -gers_3_coda.pdf , page1 used on input line 162. +gers_3_coda.pdf , page1 used on input line 171. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [25 <../lilypond/string_quartet_3/coda/edited/seeds_and_ledgers_3_coda.pdf>] @@ -1519,21 +1399,21 @@ phic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/coda/edited/seeds_and_led -gers_3_coda.pdf , page2 used on input line 162. +gers_3_coda.pdf , page2 used on input line 171. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_3/coda/edited/seeds_and_ledgers_3_coda.pdf Gra phic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/coda/edited/seeds_and_led -gers_3_coda.pdf , page2 used on input line 162. +gers_3_coda.pdf , page2 used on input line 171. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_3/coda/edited/seeds_and_ledgers_3_coda.pdf Gra phic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/coda/edited/seeds_and_led -gers_3_coda.pdf , page2 used on input line 162. +gers_3_coda.pdf , page2 used on input line 171. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [26 <../lilypond/string_quartet_3/coda/edited/seeds_and_ledgers_3_coda.pdf>] @@ -1544,21 +1424,21 @@ phic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/coda/edited/seeds_and_led -gers_3_coda.pdf , page3 used on input line 162. +gers_3_coda.pdf , page3 used on input line 171. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_3/coda/edited/seeds_and_ledgers_3_coda.pdf Gra phic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/coda/edited/seeds_and_led -gers_3_coda.pdf , page3 used on input line 162. +gers_3_coda.pdf , page3 used on input line 171. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. File: ../lilypond/string_quartet_3/coda/edited/seeds_and_ledgers_3_coda.pdf Gra phic file (type pdf) Package pdftex.def Info: ../lilypond/string_quartet_3/coda/edited/seeds_and_led -gers_3_coda.pdf , page3 used on input line 162. +gers_3_coda.pdf , page3 used on input line 171. (pdftex.def) Requested size: 597.53821pt x 845.08372pt. [27 <../lilypond/string_quartet_3/coda/edited/seeds_and_ledgers_3_coda.pdf>] @@ -1568,18 +1448,18 @@ d. (rerunfilecheck) Checksum: 54A0E65D9B6770A892BA4A0FD61297F1;513. ) Here is how much of TeX's memory you used: - 20241 strings out of 477985 - 368764 string characters out of 5840059 - 1868388 words of memory out of 5000000 - 40078 multiletter control sequences out of 15000+600000 + 17495 strings out of 477985 + 306455 string characters out of 5840059 + 1869388 words of memory out of 5000000 + 37384 multiletter control sequences out of 15000+600000 552942 words of font info for 54 fonts, out of 8000000 for 9000 14 hyphenation exceptions out of 8191 - 77i,17n,77p,1002b,634s stack positions out of 10000i,1000n,20000p,200000b,200000s + 75i,17n,77p,1002b,608s stack positions out of 10000i,1000n,20000p,200000b,200000s -Output written on seeds_and_ledgers_1_to_3.pdf (27 pages, 653149 bytes). +Output written on seeds_and_ledgers_1_to_3.pdf (27 pages, 656396 bytes). PDF statistics: 276 PDF objects out of 1000 (max. 8388607) 183 compressed objects within 2 object streams diff --git a/latex/seeds_and_ledgers_1_to_3.pdf b/latex/seeds_and_ledgers_1_to_3.pdf index 3b1203c8abf2130b3aa31cfe9811da02e2fa2dd1..924792c8501b739705975f25b5e4f16939f890c8 100644 GIT binary patch delta 89153 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

B8`5D>>D)d02610yPkSgGa27hf~EXj55z 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 diff --git a/latex/seeds_and_ledgers_1_to_3.synctex.gz b/latex/seeds_and_ledgers_1_to_3.synctex.gz index 65181faf5a9be0e6c1f5cf2a932265edadcb653d..99c23eacf6ce06e77e9a4624cd335c7ff72d6094 100644 GIT binary patch literal 25298 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 z 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 RA^)B1@lRJ`Idv?I{{hI%d@BF| literal 20355 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 F{2R{= min) && (cents <= max) -}; -*/ - -spacingScore = { - arg hsArrays, min; - var centsArray; - centsArray = hsArrays.collect({arg hsArray; hsArrayToCents.value(hsArray)}).sort({arg a, b; a < b}); - centsArray.differentiate.drop(1).collect({arg pDistance; if(pDistance >= min, {1}, {0.01})}).sum; -}; - -rangeScore = { - arg hsArray1, hsArray2, min, max, low, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - if((pDistance >= min) && (pDistance <= max), {1}, {low}); -}; - -/* -intervalScore = { - arg hsArray1, hsArray2, mean, sd, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - //pDistance.gaussCurve(1, mean, sd) - stepFunc.value(pDistance) -}; -*/ - -intervalScore = { - arg hsArray1, hsArray2, mean, sd, signed = true; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - //pDistance.gaussCurve(1, mean, sd) - if(pDistance < 0, {stepFunc.value(abs(pDistance))}, {0.001}); - //stepFunc.value(pDistance) -}; - -inclusionScore = { - arg array, test, min = 0.01; - if(array.collect({arg v; v.hash}).includes(test.hash), {min}, {1}); -}; - - -//------subroutines - -genTuples = { - var tuples; - tuples = dims.collect({[-1, 0, 1]}).allTuples.select({arg tuple; (abs(tuple.drop(1)).sum <= 1) && (tuple[0] == 0)}); - //tuples = dims.collect({[0, 1]}).allTuples.select({arg tuple; (abs(tuple.drop(1)).sum <= 1) && (tuple[0] == 0)}); - tuples = tuples ++ tuples.collect({arg tuple; [-3, -2, -1, 1, 2, 3].collect({arg octTrans; tuple.deepCopy.put(0, octTrans)})}).flatten; -}; - -initVoices = { - var init, voicesInit; - voicesInit = popSize.collect({dims.collect({0})}); - /* - voicesInit = [dims.collect({0})]; - (popSize - 1).do({ - arg rep, new; - rep = dims.rand; - new = voicesInit.last.deepCopy; - new[rep] = new[rep] + [-1, 1].choose(); - voicesInit = voicesInit.add(new); - }); - */ - voicesInit.deepCopy; -}; - -genDurFunc = {arg chordProb, minPad, maxPad, minDur, maxDur, envData, seed; - var env, pTable, durFunc; - env = Env.pairs([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).asSignal(256).asList.asArray; - pTable = env.asRandomTable; - [chordProb, minPad, maxPad, minDur, maxDur, envData].postln; - durFunc = {arg allowChord, pad = false; - var res; - res = if(allowChord.not, { - pTable.tableRand * (maxDur - minDur) + minDur - }, { - if(1.0.rand < chordProb, {0}, {pTable.tableRand * (maxDur - minDur) + minDur}); - }).round(0.125); - if(pad, {res = res + rrand(minPad.asFloat, maxPad.asFloat).round(0.125)}); - if(res.asInteger == res, {res = res.asInteger}); - res - }; - seedFunc.value(durFunc, seed); -}; - -genStepFunc = {arg minStep, maxStep, envData, seed; - var envDataNorm, env, pTable, stepFunc; - [minStep, maxStep, envData].postln; - envDataNorm = ([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).flop; - envDataNorm = [envDataNorm[0].normalize(minStep, maxStep), envDataNorm[1]].flop; - env = Env.pairs(envDataNorm); - stepFunc = {arg pDist; - env.at(pDist).clip(0.001, 1); - }; - seedFunc.value(stepFunc, seed); -}; - -genOrders = {arg minMotifLength = 1, maxMotifLength = 5, minProgLength = 0, maxProgLength = 5; - ((maxMotifLength.asInteger - minMotifLength.asInteger).rand + minMotifLength.asInteger).collect({ - var noProgIns, noSusIns, noSilentIns, prog, sus, silent, order; - noSusIns = [1, 2, 3].wchoose(susWeights.normalizeSum); - //noProgIns = (popSize - noSusIns).rand + 1; - noProgIns = (popSize - noSusIns); - noSilentIns = popSize - noSusIns - noProgIns; - - # prog, sus, silent = (0..(popSize-1)).scramble.clumps([noProgIns, noSusIns, noSilentIns]); - - prog = (prog.scramble ++ ((maxProgLength.asInteger - minProgLength.asInteger).rand + minProgLength.asInteger).collect({prog.choose}).scramble); - if(silent == nil, {silent = []}); - [sus.scramble, prog, silent.scramble] - }); -}; - -updateVoices = {arg ins, sus; - var voices, candidates, nWeights, nProbs, sel; - - voices = lastXChanges.deepCopy.last; - - candidates = sus.collect({arg v; tuples.collect({arg t; voices[v] + t})}).flatten; - candidates = difference(candidates.asSet, voices.asSet).asList; - nProbs = candidates.collect({arg candidate; - var stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore; - - //stepScore = intervalScore.value(voices[ins], candidate, 30, 400, 0.1); - stepScore = intervalScore.value(voices[ins], candidate, 100, 100); - recentlySoundedScore = inclusionScore.value(lastXChanges.flop[ins], candidate, 0); - - - if(rangeScore.value(candidate, [0, 0, 0, 0, 0, 0], ranges[ins][1] - 500, ranges[ins][1], 0, true) == 1, { - isInRangeScore = 1 - rangeScore.value(candidate, candidate.collect({0}), ranges[ins][0] + 500, ranges[ins][1] - 500, 0, true); - }, { - isInRangeScore = rangeScore.value(candidate, candidate.collect({0}), ranges[ins][0], ranges[ins][1], 0, true); - }); - - - regScore = spacingScore.value(voices.deepCopy.put(ins, candidate), 300); - hdScore = pow(hdSum.value(voices.deepCopy.put(ins, candidate)), hdExp); - if(hdInvert == 0, {hdScore = 1/hdScore}); - //maybe what you want here is a vector to another root and then favoring movement towards it. - //distScore = pow(hsChordalDistance.value(voices, voices.put(ins, candidate)), 2); - - [stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore] - }); - - nWeights = passagesWeights; - - //this handles nWeights of 0; mainly for testing - nProbs = nProbs.flop.select({arg scores, s; nWeights[s] != 0}).flop; - nWeights = nWeights.select({arg weight; weight != 0}); - nProbs = nProbs.flop.collect({arg scores, s; - if(scores.sum == 0, {scores}, {scores.normalizeSum * nWeights[s]}) - }); - nProbs = nProbs.flop.collect({arg scores, s; scores.product}).normalizeSum; - - sel = candidates.wchoose(nProbs); - - voices[ins] = sel; - lastXChanges = lastXChanges.add(voices).keep(-5); -}; - -genSubMotif = {arg order, orderIndex, lastState, repeatLast = false, startFromLast = false, isLastOrder = false; - var sus, prog, silent, flatOrder, res, isInChord, allowChord, pad, lastXChangesHold, voices, adder; - # sus, prog, silent = order; - flatOrder = silent ++ sus ++ prog; - lastXChangesHold = lastXChanges.deepCopy; - voices = lastState.deepCopy; - isInChord = popSize.collect({false}); - allowChord = false; - pad = false; - res = []; - "------generating motif".postln; - //need to figure out here if voices move between motifs - flatOrder.do({arg ins, i; - - if(prog.includes(ins) && repeatLast.not, {updateVoices.value(ins, sus)}); - adder = if(silent.includes(ins), {["Rest"]}, {lastXChanges.last.deepCopy[ins]}); - - if(voices[ins] != adder, { - var dur; - - if((sus ++ silent).includes(ins), { - allowChord = (ins != sus.last); - pad = (ins == sus.last); - }, { - if(i < (flatOrder.size - 1), { - allowChord = (isInChord[flatOrder[i + 1]] || (ins == flatOrder[i + 1])).not; - pad = false; - }, { - allowChord = false; - pad = true - }); - }); - if((orderIndex == 0) && sus.includes(ins), { - dur = entrancesDurFunc.value(allowChord, pad); - }, { - dur = passagesDurFunc.value(allowChord, pad); - }); - if(dur == 0, {isInChord[ins] = true}, {isInChord = popSize.collect({false})}); - - voices[ins] = adder; - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - - // pad ending - if(orderIndex == (orders.size - 1), { - (0..(popSize-1)).scramble.do({arg ins; - if(res.last.first[ins] != ["Rest"], { - var dur; - voices[ins] = ["Rest"]; - allowChord = (voices != popSize.collect({["Rest"]})); - pad = allowChord.not; - dur = exitsDurFunc.value(allowChord, pad); - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - }); - - //format and return - if(startFromLast, {lastXChanges = lastXChangesHold.deepCopy}); - res; -}; - - -//------primary routines - -genMotif = { - var repeats, fSeq, fDur, durAdd; - - repeats = 1; - fSeq = []; - - repeats.do({arg index; - var motif; - - motif = []; - - orders.do({arg order, o; - var lastState, subMotif; - lastState = if(o == 0, {popSize.collect({["Rest"]})}, {motif.last.last.first}); - subMotif = genSubMotif.value(order, o, lastState, isLastOrder: o == (orders.size - 1)); - motif = motif.add(subMotif); - - }); - - sanityCheck.value(motif, index); - - fSeq = fSeq.add(motif); - }); - - //round last duration to measure - fDur = fSeq.flatten.flatten.slice(nil, 1).sum; - durAdd = fDur.round(4) - fDur; - if(durAdd < 0, {durAdd = 4 - durAdd}); - fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] = fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] + durAdd; - - fSeq -}; - -genSecondarySeq = {arg seq; - var curdles, fSeq; - curdles = []; - while({curdles.sum < seq.size}, {curdles = curdles ++ [3.rand + 1]}); - - fSeq = seq.clumps(curdles).collect({arg clump, m; - var repeats, paddedSeq; - - //add rest - paddedSeq = clump.add([[[popSize.collect({["Rest"]}), 0.5.rand]]]); - - //implement repeats - repeats = [0.rand + 1, 1].wchoose([1, 0].normalizeSum); - repeats.collect({paddedSeq}); - }); - fSeq -}; - - -//------audition funcs - -/* -Event.addEventType(\osc, { - if (~addr.postln.notNil) { - ~addr.sendMsg(~indexPath, ~indexMsg); - ~addr.sendMsg(~seqPath, stringifyToDepth.value(~seqMsg, 3)); - //~addr.sendMsg("/STATE/OPEN", (dir.replace("supercollider", "resources") +/+ ~idMsg +/+ ~idMsg ++ "_gui_state" ++ ".state").standardizePath.postln); - }; -}); -*/ - -Event.addEventType(\osc, { - if (~addr.notNil) { - ~msg; - ~addr.sendMsg(~path, *~msg); - }; -}); - -genPatterns = {arg inSeq, addr, oneShot = false; - var voices, durs, pbinds, res, indices, sectionDurs, msg, ids, seq; - seq = inSeq.collect({arg mSeq; mSeq[0]}); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - pbinds = voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs, attacks, rels, amps; - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - //attacks = 2.collect({rrand(1, 3)}) ++ freqs.drop(2).collect({rrand(0.3, 0.5)}); - attacks = fDurs.collect({arg dur; dur * rrand(0.2, 0.4)}); - //rels = freqs.drop(2).collect({rrand(0.3, 0.5)}) ++ 2.collect({rrand(1, 3)}); - rels = (clumps.size - 1).collect({arg c; - if(clumps[c + 1][0] == ["Rest"], {rrand(1.0, 3.0)}, {rrand(0.3, 0.5)}); - }); - rels = rels.add(rrand(1.0, 3.0)); - amps = freqs.collect({rrand(0.6, 0.99)}); - - [ - Pbind( - \instrument, \string_model, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \attack, Pseq(attacks, 1), - \sustain, Pseq(fDurs, 1), - \release, Pseq(rels, 1), - //\amp, Pseq(amps, 1), - \amp, Pbrown(0.5, 1, 0.5), - \busIndex, v - ), - Pbind( - \instrument, \sine, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \sustain, Pseq(fDurs, 1), - \busIndex, v - ) - ] - }).flatten; - if(oneShot.not, { - msg = inSeq.collect({arg mSeq, m; mSeq[1..]}); - //ids = inSeq.collect({arg mSeq, m; mSeq[2]}); - sectionDurs = seq.collect({arg mSeq; mSeq.flatten2(mSeq.maxDepth - 5).flop[1].sum}); - pbinds = pbinds ++ - [ - Pbind( - \type, \osc, - \addr, addr, - \path, "/playing", - \msg, Pseq(msg, 1), - \dur, Pseq(sectionDurs, 1) - ); - ] - }); - res = Ppar(pbinds); - res -}; - -/* -genMidiPatterns = {arg seq; - var voices, durs, patterns, res, mOut, pbRange; - pbRange = 1; //semitones - change this as needed for your situation - mOut = MIDIOut.newByName("TiMidity", "TiMidity port 0").latency_(Server.default.latency); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - res = Ppar( - voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs; - - mOut.program(v, 70); - - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - - Pbind( - \type, \midi, - \chan, v, - \noteval, Pseq(freqs.cpsmidi - 24, 1), - \note, Pfunc({ | event | event[\noteval].floor }), - \dur, Pseq(fDurs, 1), - \midiout, mOut, - \amp, 1, - \bend, Pfunc({ - | event | - if (event[\note].isRest.not) { - var pitchbendvalue = event[\noteval].frac.linlin(0, pbRange, 8192, 8192*2).asInteger; - m.bend(v, pitchbendvalue); - }; - 0; // return something other than nil to avoid stopping the pattern - }), - ); - }); - ); - res -}; -*/ - - -//------resource management funcs - -genUID = {Date.seed.asHexString.toLower}; - -seedFunc = {arg func, seed; - var funcArgs, next; - next = Routine({loop{func.valueArray(funcArgs).yield }}); - next.randSeed_(seed); - {arg ...args; funcArgs = args; next.value} -}; - -stringifyToDepth = {arg data, maxDepth = 1; - var prettyString = "", rCount = 0, writeArray, indent; - - if(maxDepth == 0, { - data.asCompileString - }, { - indent = {arg size; size.collect({" "}).join("")}; - writeArray = {arg array; - prettyString = prettyString ++ indent.value(rCount) ++ "[\n"; - rCount = rCount + 1; - if(rCount < maxDepth, { - array.do({arg subArray; writeArray.value(subArray)}); - }, { - prettyString = prettyString ++ array.collect({arg subArray; - indent.value(rCount + 1) ++ subArray.asCompileString - }).join(",\n"); - }); - rCount = rCount - 1; - prettyString = prettyString ++ "\n" ++ indent.value(rCount) ++ "],\n"; - }; - - writeArray.value(data); - prettyString.replace(",\n\n", "\n").drop(-2); - }) -}; - -sanityCheck = {arg motif, index; - //print functions = very helpful - ("----------" + index + "------------").postln; - - motif.flatten.do({arg val, v; - if(v > 0, { - if(motif.flatten[v-1][0].hammingDistance(val[0]) > 1, {"problem 1".postln}); - if(motif.flatten[v-1][0].hammingDistance(val[0]) == 0, {"problem 2".postln}); - }); - val.postln - }); - "***********".postln; -}; - -msgInterpret = {arg in, escapeDoubleQuotes = true, escapeSingleQuotes = true; - var res; - - res = in; - if(res.isNil.not, { - if((res.isArray && res.isString.not), { - res = res.asCompileString; - res = res.replace(" ", "").replace("\n", "").replace("\t", ""); - if(escapeSingleQuotes, {res = res.replace("\'", "")}); - if(escapeDoubleQuotes, {res = res.replace("\"", "")}); - res = res.replace("Rest", "\"Rest\""); - res = res.interpret; - }, { - var tmpRes; - if(res.every({arg char; char.isDecDigit}), {tmpRes = res.asInteger}); - if(res.contains("."), {tmpRes = res.asFloat}); - if(tmpRes != nil, {res = tmpRes}); - }); - }); - res -}; - -writeResources = {arg path, dict; - var file, modelItems, resString; - file = File(path,"w"); - - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - - resString = nameSpaces.collect({arg nameSpace; - var depth = 0, insert = " "; - if(nameSpace == "music_data", {depth = 3; insert = "\n"}); - if(nameSpace == "last_changes", {depth = 1; insert = "\n"}); - if(nameSpace == "order", {depth = 1; insert = "\n"}); - if((nameSpace == "ref_uid") && (dict[nameSpace] == nil), {dict[nameSpace] = "nil"}); - "\"" ++ nameSpace ++ "\":" ++ insert ++ stringifyToDepth.value(dict[nameSpace], depth) - }).join(",\n"); - - resString = "{\n" ++ resString ++ "\n}"; - - file.write(resString); - file.close; - resString -}; - -loadModelFile = {arg path; loadModelJSON.value(File(path, "r").readAllString.parseJSON)}; - -loadModelJSON = {arg jsonObject; - var dict; - dict = Dictionary.with(*nameSpaces.collect({arg nS; nS->msgInterpret.value(jsonObject[nS])})); - dict -}; - -setGlobalVars = {arg dict, skipLastXChanges = false; - var tmpLastXChanges; - tmpLastXChanges = lastXChanges.deepCopy; - // order really matters!!!! - # seq, lastXChanges, curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited = nameSpaces.collect({arg nS; dict[nS]}); - if(skipLastXChanges, {lastXChanges = tmpLastXChanges}); - dict -}; - -globalVarsToDict = { - var modelItems, dict; - // order really matters!!!! - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - dict = Dictionary.with(*nameSpaces.collect({arg nS, n; nS->modelItems[n]})); -}; - -loadLedgerFile = {arg path; - ledgerPath = path; - resourceDir = path.splitext(".").drop(-1).join; - loadLedgerJSON.value(File(ledgerPath, "r").readAllString.parseJSON) -}; - -loadLedgerJSON = {arg jsonObject; ledger = jsonObject["ledger"]}; - -saveLedger = {arg ledger, path; - var file, curResourceDir; - file = File(path, "w"); - curResourceDir = resourceDir; - resourceDir = path.splitext(".").drop(-1).join; - if(curResourceDir != resourceDir, { - File.mkdir(resourceDir); - ledger.do({arg id; - File.copy(curResourceDir +/+ id, resourceDir +/+ id); - }); - }); - file.write("{\n\"ledger\":\n" ++ stringifyToDepth.value(ledger, 1) ++ "\n}"); - file.close; -}; - -//------global vars - -primes = [[2, 1], [3, 2], [5, 4], [7, 4], [11, 8], [13, 8]]; -//ranges = [[-2400, 0], [-1200, 1200], [0, 2400], [0, 2400]]; -exPath = thisProcess.nowExecutingPath; -dir = exPath.dirname; -//popSize = 4; -dims = primes.size; -tuples = genTuples.value(); -//refUID = nil; -group = Group.new; -~group = group; -loadLedgerFile.value(dir +/+ ".." +/+ "resources" +/+ "piece_ledger.json"); -resourceDir = (dir +/+ ".." +/+ "resources" +/+ "piece_ledger"); -//passagesWeights = [1, 1, 1, 1, 1]; -//susWeights = [1, 1, 1]; -// order really matters!!!! -nameSpaces = [ - "music_data", "last_changes", "cur_uid", "ref_uid", "order_seed", "dur_seed", "motifs_seed", - "entrances_probs_vals","passages_probs_vals", "exits_probs_vals", - "ranges", "step_probs_vals", "passages_weights", "hd_exp", "hd_invert", - "order", "sus_weights", "order_size", "passages_size", - "motif_edited", "order_edited" -]; - - -//------OSC funcs - -OSCdef(\load_ledger, {arg msg, time, addr, port; - loadLedgerFile.value(msg[1].asString); -}, \load_ledger); - -OSCdef(\load_model, {arg msg, time, addr, port; - var dict; - dict = loadModelFile.value(msg[1].asString); - setGlobalVars.value(dict); -}, \load_model); - -OSCdef(\save_ledger, {arg msg, time, addr, port; - msg.postln; - ledger = msgInterpret.value(msg[1].asString.parseJSON["ledger"], false).postln; - //loadLedgerJSON.value(msg[0]) - saveLedger.value(ledger, msg[2].asString); - //loadLedgerFile.value(msg[1].asString); -}, \save_ledger); - -OSCdef(\generate, {arg msg, time, addr, port; - var path, dict, durSeeds, musPath, modelString; - msg.postln; - - path = msg[1].asString; - - dict = loadModelFile.value(path); - setGlobalVars.value(dict, true); - - popSize = ranges.size; - - //refUID.postln; - - loadLedgerFile.value(ledgerPath); - if(ledger == nil, {ledger = ["tmp"]}); - if(ledger.last != "tmp", {ledger = ledger.add("tmp")}); - - if(refUID == nil, {lastXChanges = [initVoices.value().deepCopy]}); - if((refUID != nil) && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - lastXChanges = msgInterpret.value(file.readAllString.parseJSON["last_changes"]); - }); - - refUID.postln; - lastXChanges.collect({arg item; item.postln}); - - durSeeds = seedFunc.value({3.collect({rrand(100000, 999999)})}, durSeed).value.postln; - entrancesDurFunc = genDurFunc.valueArray(entrancesProbVals[..4] ++ [entrancesProbVals[5..]] ++ [durSeeds[0]]); - passagesDurFunc = genDurFunc.valueArray(passagesProbVals[..4] ++ [passagesProbVals[5..]] ++ [durSeeds[1]]); - exitsDurFunc = genDurFunc.valueArray(exitsProbVals[..4] ++ [exitsProbVals[5..]] ++ [durSeeds[2]]); - - if(orders == nil, { - orders = seedFunc.value(genOrders, orderSeed).valueArray(orderSize ++ passagesSize); - //addr.sendMsg("/order", stringifyToDepth.value(orders, 1)); - }); - - stepFunc = genStepFunc.valueArray(stepProbsVals[..1] ++ [stepProbsVals[2..]] ++ [motifSeed]); - seq = seedFunc.value(genMotif, motifSeed).value; - - lastXChanges.collect({arg item; item.postln}); - - dict = globalVarsToDict.value; - modelString = writeResources.value(path, dict); - - //addr.sendMsg("/generated", musPath, stringifyToDepth.value(seq, 3)); - //~seq = seq; - - addr.sendMsg("/generated", path, modelString, ledgerPath); -}, \generate); - - -OSCdef(\commit, {arg msg, time, addr, port; - var musicData, musicChanged, dict, newLedger, modelPath, musString, musFile, test1, test2, lastCurUID, commitType, commitPos, equalityLedger; - //msg.postln; - - /* - test1 = msg[1].asString.parseJSON; - test2 = (dir +/+ ".." +/+ "resources/tmp/tmp_music" ++ ".json").standardizePath.parseJSONFile; - msgInterpret.value(test1["music"])[0][0][0][1].class.postln; - msgInterpret.value(test2["music_data"])[0][0][0][1].class.postln; - (test1["music"] == test2["music_data"]).postln; - */ - - musicData = loadModelJSON.value(msg[1].asString.parseJSON)["music_data"].postln; - musicChanged = (musicData != seq).postln; - commitType = msg[2].asString; - commitPos = msg[3].postln.asInteger; - - lastCurUID = curUID.deepCopy; - curUID = genUID.value; - - File.mkdir((resourceDir +/+ curUID).standardizePath); - File.copy(exPath, (resourceDir +/+ curUID +/+ curUID ++ "_code" ++ ".scd").standardizePath); - - modelPath = (resourceDir +/+ curUID +/+ curUID ++ "_mus_model" ++ ".json").standardizePath; - dict = globalVarsToDict.value; - if(musicChanged, { - seq = musicData; - dict["music_data"] = seq; - dict["motif_edited"] = "true" - }); - dict["cur_uid"] = curUID; - - writeResources.value(modelPath, dict); - - File.delete(ledgerPath ++ "_bak"); - File.copy(ledgerPath, ledgerPath ++ "_bak"); - File.delete(ledgerPath); - - /* - if(commitType == "add", { - if(lastCurUID == "tmp", { - ledger = ledger.drop(-1).add(curUID); - }, { - ledger = ledger.add(curUID); - }) - }); - */ - - ledger.postln; - - if(commitType == "add", {ledger = ledger.add(curUID)}); - - if(commitType == "insert", {ledger = ledger.insert(commitPos + 1, curUID)}); - - if(commitType == "replace", {ledger = ledger.put(commitPos, curUID)}); - - equalityLedger = ledger.collect({arg item; item.asSymbol}); - if(equalityLedger.includes(\tmp).postln, {ledger.removeAt(equalityLedger.indexOf(\tmp).postln)}); - - ledger.postln; - - saveLedger.value(ledger, ledgerPath); - - addr.sendMsg("/committed", curUID, ledgerPath); - //refUID = curUID; - -}, \commit); - -OSCdef(\transport, {arg msg, time, addr, port; - msg.postln; - if(msg[1] == 0, { - group.set(\release, 2); - group.set(\gate, 0); - player.stop; - }, { - // the cued sequence can now be read from file, so this can be cleaned up - var cSize, patterns, pSeq, cuedSeek, indexStart, indexEnd, tmpLedger; - if(msg[1] == 1, { - pSeq = []; - cuedSeek = (seq != nil); - indexStart = msg[2].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.postln.parseJSON["music_data"]), path, indexStart + index, uid]); - file.close; - }); - }); - if(cuedSeek, { - var path, file; - path = (resourceDir +/+ "tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - patterns = genPatterns.value(pSeq, addr); - }, { - pSeq = [loadModelJSON.value(msg[2].asString.parseJSON)["music_data"].postln]; - patterns = genPatterns.value(pSeq, addr, true); - }); - player = Pfset(pattern: patterns, cleanupFunc: { - addr.sendMsg("/transport", 0); - addr.sendMsg("/one_shot", 0); - }); - player = player.play - }); -}, \transport); - - -OSCdef(\transcribe_motif, {arg msg, time, addr, port; - var tSeq, refChord, refUID; - - msg.postln; - - tSeq = [loadModelJSON.value(msg[1].asString.parseJSON)["music_data"]]; - refUID = msg[2].asString.postln; - - if((refUID != "nil") && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }, { - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - }); - - ~transcribe.value(tSeq, refChord, (dir +/+ ".." +/+ "lilypond" +/+ "includes").standardizePath, addr, "/transcribe_motif"); -}, \transcribe_motif); - - -OSCdef(\transcribe_all, {arg msg, time, addr, port; - var cSize, patterns, cuedSeek, indexStart, indexEnd, tmpLedger; - if(true, { - cuedSeek = (seq != nil); - indexStart = msg[1].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - - //tmp for testing transcription - //indexEnd = (indexStart+5); - - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - var lilyPartLedgerFiles; - - lilyPartLedgerFiles = 4.collect({arg p; - File((dir +/+ ".." +/+ "lilypond" +/+ "includes" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly").standardizePath, "w"); - }); - - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file, fileString, tSeq, refUID, refChord; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - fileString = file.readAllString; - tSeq = msgInterpret.value(fileString.parseJSON["music_data"]); - refUID = msgInterpret.value(fileString.parseJSON["ref_uid"]); - file.close; - - //uid.postln; - //(refUID == "nil").postln; - - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - - if(refUID != "nil", { - path = (resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }); - - if(index != indexEnd, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath); - }, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath, addr, "/transcribe_all"); - }); - - lilyPartLedgerFiles.do({arg f, p; - f.write("\\include \"" ++ resourceDir +/+ uid +/+ "lilypond" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly\"\n"); - }); - - }); - - lilyPartLedgerFiles.do({arg f; - f.close - }); - }); - /* - if(cuedSeek, { - var path, file; - path = (dir +/+ ".." +/+ "resources/tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - */ - }, { - - }); - -}, \transcribe_all); - -) - - diff --git a/resources/string_quartet_3/45fa07e8/45fa07e8_mus_model.json b/resources/string_quartet_3/45fa07e8/45fa07e8_mus_model.json deleted file mode 100644 index 10b6bb0..0000000 --- a/resources/string_quartet_3/45fa07e8/45fa07e8_mus_model.json +++ /dev/null @@ -1,443 +0,0 @@ -{ -"music_data": -[ - [ - [ - [ [ [ "Rest" ], [ 2, -5, 0, 3, -1, -1 ], [ "Rest" ], [ "Rest" ] ], 1.5 ], - [ [ [ "Rest" ], [ 2, -5, 0, 3, -1, -1 ], [ "Rest" ], [ 4, -5, -1, 2, -1, -1 ] ], 1.75 ], - [ [ [ 2, -5, -1, 3, -1, -1 ], [ 2, -5, 0, 3, -1, -1 ], [ "Rest" ], [ 4, -5, -1, 2, -1, -1 ] ], 1 ], - [ [ [ 2, -5, -1, 3, -1, -1 ], [ 2, -5, 0, 3, -1, -1 ], [ 4, -5, -1, 2, 0, -1 ], [ 4, -5, -1, 2, -1, -1 ] ], 1.375 ] - ], - [ - [ [ [ 2, -5, -1, 3, -1, -1 ], [ 4, -5, -1, 1, -1, -1 ], [ 4, -5, -1, 2, 0, -1 ], [ 4, -5, -1, 2, -1, -1 ] ], 0.875 ] - ], - [ - [ [ [ 2, -5, -1, 3, -1, -1 ], [ 4, -5, -1, 1, -1, -1 ], [ 4, -5, -1, 2, 0, -1 ], [ 3, -4, -1, 2, 0, -1 ] ], 1.625 ] - ], - [ - [ [ [ 2, -5, -1, 3, -1, -1 ], [ 3, -5, -1, 3, -1, -1 ], [ 4, -5, -1, 2, 0, -1 ], [ 3, -4, -1, 2, 0, -1 ] ], 0.75 ] - ], - [ - [ [ [ 2, -5, -1, 3, -1, -1 ], [ 4, -6, -1, 2, 0, -1 ], [ 4, -5, -1, 2, 0, -1 ], [ 3, -4, -1, 2, 0, -1 ] ], 1.75 ] - ], - [ - [ [ [ 3, -6, -1, 2, 0, -1 ], [ 4, -6, -1, 2, 0, -1 ], [ 4, -5, -1, 2, 0, -1 ], [ 3, -4, -1, 2, 0, -1 ] ], 1.375 ] - ], - [ - [ [ [ 3, -6, -1, 2, 0, -1 ], [ 4, -5, -1, 2, -1, -1 ], [ 4, -5, -1, 2, 0, -1 ], [ 3, -4, -1, 2, 0, -1 ] ], 1.125 ] - ], - [ - [ [ [ 3, -6, -1, 2, 0, -1 ], [ 4, -5, -1, 2, -1, -1 ], [ 3, -4, -1, 2, 1, -1 ], [ 3, -4, -1, 2, 0, -1 ] ], 1.625 ] - ], - [ - [ [ [ 3, -6, -1, 2, 0, -1 ], [ 4, -5, -1, 2, -1, -1 ], [ 3, -4, -1, 2, 1, -1 ], [ 2, -3, -1, 2, 1, -1 ] ], 1.125 ] - ], - [ - [ [ [ 3, -6, -1, 2, 0, -1 ], [ 4, -5, -1, 2, -1, -1 ], [ 3, -4, -1, 2, 1, -1 ], [ 3, -4, -2, 2, 1, -1 ] ], 1.5 ] - ], - [ - [ [ [ 3, -6, -1, 2, 0, -1 ], [ 4, -5, -1, 2, -1, -1 ], [ 4, -5, -2, 2, 1, -1 ], [ 3, -4, -2, 2, 1, -1 ] ], 1.375 ] - ], - [ - [ [ [ 3, -5, -2, 2, 0, -1 ], [ 4, -5, -1, 2, -1, -1 ], [ 4, -5, -2, 2, 1, -1 ], [ 3, -4, -2, 2, 1, -1 ] ], 1.5 ] - ], - [ - [ [ [ 3, -5, -2, 2, 0, -1 ], [ 4, -5, -2, 2, 0, -1 ], [ 4, -5, -2, 2, 1, -1 ], [ 3, -4, -2, 2, 1, -1 ] ], 1.625 ] - ], - [ - [ [ [ 3, -5, -2, 2, 0, -1 ], [ 4, -5, -2, 2, 0, -1 ], [ 4, -5, -2, 2, 1, -1 ], [ 5, -5, -2, 1, 0, -1 ] ], 1.25 ] - ], - [ - [ [ [ 3, -5, -2, 2, 0, -1 ], [ 4, -5, -3, 2, 1, -1 ], [ 4, -5, -2, 2, 1, -1 ], [ 5, -5, -2, 1, 0, -1 ] ], 1.75 ] - ], - [ - [ [ [ 3, -5, -2, 2, 0, -1 ], [ 4, -5, -3, 2, 1, -1 ], [ 4, -5, -2, 2, 1, -1 ], [ 3, -5, -2, 3, 1, -1 ] ], 0.875 ] - ], - [ - [ [ [ 3, -5, -2, 2, 0, -1 ], [ 5, -5, -2, 1, 0, -1 ], [ 4, -5, -2, 2, 1, -1 ], [ 3, -5, -2, 3, 1, -1 ] ], 0.625 ] - ], - [ - [ [ [ 3, -5, -2, 2, 0, -1 ], [ 5, -6, -2, 2, 0, -1 ], [ 4, -5, -2, 2, 1, -1 ], [ 3, -5, -2, 3, 1, -1 ] ], 0.75 ] - ], - [ - [ [ [ 3, -5, -2, 2, 0, -1 ], [ 5, -6, -2, 2, 0, -1 ], [ 4, -5, -2, 2, 1, -1 ], [ 5, -5, -2, 2, 0, -2 ] ], 1.125 ] - ], - [ - [ [ [ 3, -5, -2, 2, 0, -1 ], [ 6, -5, -2, 1, 0, -2 ], [ 4, -5, -2, 2, 1, -1 ], [ 5, -5, -2, 2, 0, -2 ] ], 1.5 ] - ], - [ - [ [ [ 4, -4, -2, 1, 0, -2 ], [ 6, -5, -2, 1, 0, -2 ], [ 4, -5, -2, 2, 1, -1 ], [ 5, -5, -2, 2, 0, -2 ] ], 1.375 ] - ], - [ - [ [ [ 4, -4, -2, 1, 0, -2 ], [ 6, -4, -2, 1, -1, -2 ], [ 4, -5, -2, 2, 1, -1 ], [ 5, -5, -2, 2, 0, -2 ] ], 1.625 ] - ], - [ - [ [ [ 4, -4, -2, 1, 0, -2 ], [ 6, -4, -2, 1, -1, -2 ], [ 6, -5, -2, 2, 0, -3 ], [ 5, -5, -2, 2, 0, -2 ] ], 1.375 ] - ], - [ - [ [ [ 5, -4, -2, 1, -2, -2 ], [ 6, -4, -2, 1, -1, -2 ], [ 6, -5, -2, 2, 0, -3 ], [ 5, -5, -2, 2, 0, -2 ] ], 0.75 ] - ], - [ - [ [ [ 5, -4, -2, 1, -2, -2 ], [ 6, -4, -2, 1, -1, -2 ], [ 5, -5, -1, 2, 0, -2 ], [ 5, -5, -2, 2, 0, -2 ] ], 1.375 ] - ], - [ - [ [ [ 5, -4, -2, 1, -2, -2 ], [ 6, -4, -2, 1, -1, -2 ], [ 5, -5, -2, 1, -1, -2 ], [ 5, -5, -2, 2, 0, -2 ] ], 1 ] - ], - [ - [ [ [ 5, -4, -2, 1, -2, -2 ], [ 6, -4, -2, 1, -1, -2 ], [ 4, -4, -2, 1, 0, -2 ], [ 5, -5, -2, 2, 0, -2 ] ], 1.625 ] - ], - [ - [ [ [ 5, -4, -2, 1, -2, -2 ], [ 6, -4, -2, 1, -1, -2 ], [ 4, -3, -2, 1, -1, -2 ], [ 5, -5, -2, 2, 0, -2 ] ], 1.625 ] - ], - [ - [ [ [ 5, -4, -2, 1, -2, -2 ], [ 5, -3, -2, 1, -2, -2 ], [ 4, -3, -2, 1, -1, -2 ], [ 5, -5, -2, 2, 0, -2 ] ], 1 ] - ], - [ - [ [ [ 4, -5, -2, 2, 0, -2 ], [ 5, -3, -2, 1, -2, -2 ], [ 4, -3, -2, 1, -1, -2 ], [ 5, -5, -2, 2, 0, -2 ] ], 1.125 ] - ], - [ - [ [ [ 4, -5, -2, 2, 0, -2 ], [ 5, -3, -2, 1, -2, -2 ], [ 5, -3, -2, 1, -3, -2 ], [ 5, -5, -2, 2, 0, -2 ] ], 0.75 ] - ], - [ - [ [ [ 4, -5, -2, 2, 0, -2 ], [ 5, -5, -2, 2, -1, -2 ], [ 5, -3, -2, 1, -3, -2 ], [ 5, -5, -2, 2, 0, -2 ] ], 1.5 ] - ], - [ - [ [ [ 4, -5, -2, 1, -1, -2 ], [ 5, -5, -2, 2, -1, -2 ], [ 5, -3, -2, 1, -3, -2 ], [ 5, -5, -2, 2, 0, -2 ] ], 0.875 ] - ], - [ - [ [ [ 4, -5, -2, 1, -1, -2 ], [ 4, -4, -2, 2, 0, -2 ], [ 5, -3, -2, 1, -3, -2 ], [ 5, -5, -2, 2, 0, -2 ] ], 1.75 ] - ], - [ - [ [ [ 4, -5, -2, 1, -1, -2 ], [ 4, -4, -2, 2, 0, -2 ], [ 5, -5, -2, 1, 0, -2 ], [ 5, -5, -2, 2, 0, -2 ] ], 0.875 ] - ], - [ - [ [ [ 4, -5, -2, 1, -1, -2 ], [ 4, -4, -2, 2, 0, -2 ], [ 5, -4, -2, 1, -1, -2 ], [ 5, -5, -2, 2, 0, -2 ] ], 0.875 ] - ], - [ - [ [ [ 4, -5, -2, 1, -1, -2 ], [ 4, -4, -2, 2, 0, -2 ], [ 4, -5, -1, 2, 0, -2 ], [ 5, -5, -2, 2, 0, -2 ] ], 1.5 ] - ], - [ - [ [ [ 4, -5, -2, 1, -1, -2 ], [ 4, -4, -2, 2, 0, -2 ], [ 5, -6, -2, 2, 0, -2 ], [ 5, -5, -2, 2, 0, -2 ] ], 0.875 ] - ], - [ - [ [ [ 4, -5, -2, 1, -1, -2 ], [ 4, -5, -2, 2, 0, -1 ], [ 5, -6, -2, 2, 0, -2 ], [ 5, -5, -2, 2, 0, -2 ] ], 1.625 ] - ], - [ - [ [ [ 4, -5, -2, 1, -1, -2 ], [ 4, -5, -2, 2, 0, -1 ], [ 5, -5, -2, 2, -1, -2 ], [ 5, -5, -2, 2, 0, -2 ] ], 1.125 ] - ], - [ - [ [ [ 4, -5, -2, 1, -1, -2 ], [ 4, -5, -2, 2, 0, -1 ], [ 5, -5, -2, 2, -1, -2 ], [ 5, -4, -2, 2, -1, -2 ] ], 1.5 ] - ], - [ - [ [ [ 4, -5, -2, 1, -1, -2 ], [ 5, -4, -3, 2, -1, -2 ], [ 5, -5, -2, 2, -1, -2 ], [ 5, -4, -2, 2, -1, -2 ] ], 0.875 ] - ], - [ - [ [ [ 4, -5, -2, 1, -1, -2 ], [ 5, -4, -3, 2, -1, -2 ], [ 5, -5, -2, 2, -1, -2 ], [ 6, -5, -3, 2, -1, -2 ] ], 1.5 ] - ], - [ - [ [ [ 4, -5, -2, 1, -1, -2 ], [ 5, -4, -3, 2, -1, -2 ], [ 6, -6, -3, 2, -1, -2 ], [ 6, -5, -3, 2, -1, -2 ] ], 1.25 ] - ], - [ - [ [ [ 4, -5, -2, 1, -1, -2 ], [ 5, -4, -3, 2, -1, -2 ], [ 6, -5, -2, 1, -1, -2 ], [ 6, -5, -3, 2, -1, -2 ] ], 1.5 ] - ], - [ - [ [ [ 4, -5, -2, 1, -1, -2 ], [ 7, -5, -2, 0, -1, -2 ], [ 6, -5, -2, 1, -1, -2 ], [ 6, -5, -3, 2, -1, -2 ] ], 0.75 ] - ], - [ - [ [ [ 4, -5, -2, 1, -1, -2 ], [ 7, -5, -2, 0, -1, -2 ], [ 6, -5, -2, 1, -1, -2 ], [ 6, -4, -2, 1, -1, -2 ] ], 0.75 ] - ], - [ - [ [ [ 5, -5, -2, 0, -1, -2 ], [ 7, -5, -2, 0, -1, -2 ], [ 6, -5, -2, 1, -1, -2 ], [ 6, -4, -2, 1, -1, -2 ] ], 1.125 ] - ], - [ - [ [ [ 5, -5, -2, 1, -1, -3 ], [ 7, -5, -2, 0, -1, -2 ], [ 6, -5, -2, 1, -1, -2 ], [ 6, -4, -2, 1, -1, -2 ] ], 1.625 ] - ], - [ - [ [ [ 5, -5, -2, 1, -1, -3 ], [ 6, -4, -3, 1, -1, -2 ], [ 6, -5, -2, 1, -1, -2 ], [ 6, -4, -2, 1, -1, -2 ] ], 1.75 ] - ], - [ - [ [ [ 5, -5, -2, 1, -1, -3 ], [ 6, -4, -3, 1, -1, -2 ], [ 5, -3, -2, 1, -1, -2 ], [ 6, -4, -2, 1, -1, -2 ] ], 0.875 ] - ], - [ - [ [ [ 4, -4, -2, 1, -1, -2 ], [ 6, -4, -3, 1, -1, -2 ], [ 5, -3, -2, 1, -1, -2 ], [ 6, -4, -2, 1, -1, -2 ] ], 1.25 ] - ], - [ - [ [ [ 4, -4, -2, 1, -1, -2 ], [ 6, -4, -3, 1, -1, -2 ], [ 5, -4, -2, 1, -1, -2 ], [ 6, -4, -2, 1, -1, -2 ] ], 1.625 ] - ], - [ - [ [ [ 4, -4, -2, 1, -1, -2 ], [ 5, -4, -2, 2, -1, -2 ], [ 5, -4, -2, 1, -1, -2 ], [ 6, -4, -2, 1, -1, -2 ] ], 1.875 ] - ], - [ - [ [ [ 4, -4, -2, 1, -1, -2 ], [ 3, -3, -2, 1, -1, -2 ], [ 5, -4, -2, 1, -1, -2 ], [ 6, -4, -2, 1, -1, -2 ] ], 1.625 ] - ], - [ - [ [ [ 4, -4, -2, 1, -1, -2 ], [ 4, -4, -3, 1, -1, -2 ], [ 5, -4, -2, 1, -1, -2 ], [ 6, -4, -2, 1, -1, -2 ] ], 1.5 ] - ], - [ - [ [ [ 4, -4, -2, 1, -1, -2 ], [ 4, -4, -3, 1, -1, -2 ], [ 5, -4, -2, 1, -1, -2 ], [ 5, -4, -3, 1, -1, -2 ] ], 0.625 ] - ], - [ - [ [ [ 4, -4, -2, 1, -1, -2 ], [ 3, -4, -2, 2, -1, -2 ], [ 5, -4, -2, 1, -1, -2 ], [ 5, -4, -3, 1, -1, -2 ] ], 1.625 ] - ], - [ - [ [ [ 4, -4, -2, 1, -1, -2 ], [ 5, -4, -3, 0, -1, -2 ], [ 5, -4, -2, 1, -1, -2 ], [ 5, -4, -3, 1, -1, -2 ] ], 1.625 ] - ], - [ - [ [ [ 5, -4, -3, 1, -2, -2 ], [ 5, -4, -3, 0, -1, -2 ], [ 5, -4, -2, 1, -1, -2 ], [ 5, -4, -3, 1, -1, -2 ] ], 0.875 ] - ], - [ - [ [ [ 5, -4, -3, 1, -2, -2 ], [ 5, -4, -3, 0, -1, -2 ], [ 6, -5, -3, 1, -1, -2 ], [ 5, -4, -3, 1, -1, -2 ] ], 1.125 ] - ], - [ - [ [ [ 4, -3, -3, 1, -1, -2 ], [ 5, -4, -3, 0, -1, -2 ], [ 6, -5, -3, 1, -1, -2 ], [ 5, -4, -3, 1, -1, -2 ] ], 1 ] - ], - [ - [ [ [ 4, -3, -3, 1, -1, -2 ], [ 5, -4, -3, 0, -1, -2 ], [ 6, -5, -3, 1, -1, -2 ], [ 6, -5, -4, 1, -1, -2 ] ], 1.5 ] - ], - [ - [ [ [ 5, -5, -2, 1, -1, -2 ], [ 5, -4, -3, 0, -1, -2 ], [ 6, -5, -3, 1, -1, -2 ], [ 6, -5, -4, 1, -1, -2 ] ], 1 ] - ], - [ - [ [ [ 5, -5, -2, 1, -1, -2 ], [ 5, -4, -3, 0, -1, -2 ], [ 6, -5, -3, 1, -1, -2 ], [ 5, -5, -3, 1, -1, -1 ] ], 1.25 ] - ], - [ - [ [ [ 5, -5, -2, 1, -1, -2 ], [ 5, -4, -3, 0, -1, -2 ], [ 5, -5, -2, 1, -1, -1 ], [ 5, -5, -3, 1, -1, -1 ] ], 1.375 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 5, -4, -3, 0, -1, -2 ], [ 5, -5, -2, 1, -1, -1 ], [ 5, -5, -3, 1, -1, -1 ] ], 1.375 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 5, -4, -3, 0, -1, -2 ], [ 5, -5, -2, 1, -1, -1 ], [ 4, -5, -2, 2, -1, -1 ] ], 1.5 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 5, -4, -3, 0, -1, -2 ], [ 5, -5, -2, 1, -1, -1 ], [ 6, -7, -2, 1, -1, -1 ] ], 1.375 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 5, -4, -3, 0, -1, -2 ], [ 5, -5, -2, 1, -1, -1 ], [ 6, -6, -2, 1, -2, -1 ] ], 1.625 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 5, -4, -3, 0, -1, -2 ], [ 6, -6, -3, 1, -1, -1 ], [ 6, -6, -2, 1, -2, -1 ] ], 1.125 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 5, -4, -3, 0, -1, -2 ], [ 5, -6, -2, 2, -1, -1 ], [ 6, -6, -2, 1, -2, -1 ] ], 1.125 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 5, -4, -3, 0, -1, -2 ], [ 5, -6, -2, 2, -1, -1 ], [ 6, -4, -2, 0, -1, -2 ] ], 0.625 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 5, -4, -3, 0, -1, -2 ], [ 7, -4, -2, -1, -1, -2 ], [ 6, -4, -2, 0, -1, -2 ] ], 1 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 5, -7, -2, 1, -1, -1 ], [ 7, -4, -2, -1, -1, -2 ], [ 6, -4, -2, 0, -1, -2 ] ], 1.5 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 4, -4, -2, 1, -1, -2 ], [ 7, -4, -2, -1, -1, -2 ], [ 6, -4, -2, 0, -1, -2 ] ], 1.25 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 4, -5, -2, 1, -1, -1 ], [ 7, -4, -2, -1, -1, -2 ], [ 6, -4, -2, 0, -1, -2 ] ], 1.625 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 4, -5, -2, 1, -1, -1 ], [ 7, -4, -2, -1, -1, -2 ], [ 5, -6, -2, 1, -1, 0 ] ], 1 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 4, -5, -2, 1, -1, -1 ], [ 6, -6, -2, 1, -1, -1 ], [ 5, -6, -2, 1, -1, 0 ] ], 1.625 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 4, -5, -2, 1, -1, -1 ], [ 5, -6, -1, 1, -1, 0 ], [ 5, -6, -2, 1, -1, 0 ] ], 1.25 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 4, -5, -2, 1, -1, -1 ], [ 5, -6, -1, 1, -1, 0 ], [ 5, -6, -2, 2, -1, -1 ] ], 1 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 4, -5, -2, 1, -1, -1 ], [ 5, -6, -1, 1, -1, 0 ], [ 5, -5, -1, 1, -1, -1 ] ], 1.625 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 4, -6, -1, 1, -1, -1 ], [ 5, -6, -1, 1, -1, 0 ], [ 5, -5, -1, 1, -1, -1 ] ], 1.25 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 5, -7, -2, 1, -1, -1 ], [ 5, -6, -1, 1, -1, 0 ], [ 5, -5, -1, 1, -1, -1 ] ], 0.875 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 5, -7, -2, 1, -1, -1 ], [ 6, -5, -1, 0, -1, -1 ], [ 5, -5, -1, 1, -1, -1 ] ], 1.25 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 5, -7, -2, 1, -1, -1 ], [ 6, -5, -1, 0, -1, -1 ], [ 6, -6, -2, 1, -1, -1 ] ], 0.75 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 5, -7, -2, 1, -1, -1 ], [ 7, -7, -2, 1, -1, -1 ], [ 6, -6, -2, 1, -1, -1 ] ], 1.125 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 5, -7, -2, 1, -1, -1 ], [ 4, -6, -2, 1, -1, -1 ], [ 6, -6, -2, 1, -1, -1 ] ], 1.625 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 5, -7, -2, 1, -1, -1 ], [ 4, -6, -2, 1, -1, -1 ], [ 7, -7, -3, 1, -1, -1 ] ], 1.125 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 5, -7, -2, 1, -1, -1 ], [ 4, -6, -2, 1, -1, -1 ], [ 6, -7, -2, 1, -1, 0 ] ], 1.375 ] - ], - [ - [ [ [ 5, -6, -2, 1, -1, -1 ], [ 5, -7, -2, 1, -1, -1 ], [ 4, -6, -2, 1, -1, -1 ], [ 6, -6, -1, 1, -1, -1 ] ], 1.75 ] - ], - [ - [ [ [ 4, -6, -1, 1, -1, 0 ], [ 5, -7, -2, 1, -1, -1 ], [ 4, -6, -2, 1, -1, -1 ], [ 6, -6, -1, 1, -1, -1 ] ], 1.125 ] - ], - [ - [ [ [ 4, -6, -1, 1, -1, 0 ], [ 5, -7, -2, 1, -1, -1 ], [ 4, -6, -2, 1, -1, -1 ], [ 7, -7, -2, 1, -1, -1 ] ], 1.25 ] - ], - [ - [ [ [ 4, -6, -1, 1, -1, 0 ], [ 5, -7, -2, 1, -1, -1 ], [ 4, -7, -2, 1, -1, 0 ], [ 7, -7, -2, 1, -1, -1 ] ], 0.75 ] - ], - [ - [ [ [ 4, -6, -1, 1, -1, 0 ], [ 5, -7, -2, 1, -1, -1 ], [ 4, -7, -2, 1, -1, 0 ], [ 6, -7, -1, 1, -1, 0 ] ], 1 ] - ], - [ - [ [ [ 4, -6, -1, 1, -1, 0 ], [ 5, -7, -2, 1, -1, -1 ], [ 4, -7, -2, 1, -1, 0 ], [ 5, -6, -1, 1, 0, 0 ] ], 1.125 ] - ], - [ - [ [ [ 4, -6, -1, 1, -1, 0 ], [ 4, -7, -1, 1, -1, 0 ], [ 4, -7, -2, 1, -1, 0 ], [ 5, -6, -1, 1, 0, 0 ] ], 0.625 ] - ], - [ - [ [ [ 4, -6, -1, 1, -1, 0 ], [ 4, -7, -1, 1, -1, 0 ], [ 3, -5, -1, 1, 0, 0 ], [ 5, -6, -1, 1, 0, 0 ] ], 1.25 ] - ], - [ - [ [ [ 4, -6, -1, 1, -1, 0 ], [ 4, -7, -1, 1, -1, 0 ], [ 3, -5, -1, 1, 0, 0 ], [ 5, -6, -2, 1, -1, 0 ] ], 1.25 ] - ], - [ - [ [ [ 4, -6, -1, 1, -1, 0 ], [ 4, -7, -1, 1, -1, 0 ], [ 3, -5, -1, 1, 0, 0 ], [ 6, -7, -1, 1, -1, -1 ] ], 1 ], - [ [ [ 4, -6, -1, 1, -1, 0 ], [ "Rest" ], [ 3, -5, -1, 1, 0, 0 ], [ 6, -7, -1, 1, -1, -1 ] ], 1.375 ], - [ [ [ 4, -6, -1, 1, -1, 0 ], [ "Rest" ], [ 3, -5, -1, 1, 0, 0 ], [ "Rest" ] ], 1.125 ], - [ [ [ "Rest" ], [ "Rest" ], [ 3, -5, -1, 1, 0, 0 ], [ "Rest" ] ], 1.5 ], - [ [ [ "Rest" ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 6.375 ] - ] - ] -], -"last_changes": -[ - [ [ 4, -6, -1, 1, -1, 0 ], [ 5, -7, -2, 1, -1, -1 ], [ 4, -7, -2, 1, -1, 0 ], [ 5, -6, -1, 1, 0, 0 ] ], - [ [ 4, -6, -1, 1, -1, 0 ], [ 4, -7, -1, 1, -1, 0 ], [ 4, -7, -2, 1, -1, 0 ], [ 5, -6, -1, 1, 0, 0 ] ], - [ [ 4, -6, -1, 1, -1, 0 ], [ 4, -7, -1, 1, -1, 0 ], [ 3, -5, -1, 1, 0, 0 ], [ 5, -6, -1, 1, 0, 0 ] ], - [ [ 4, -6, -1, 1, -1, 0 ], [ 4, -7, -1, 1, -1, 0 ], [ 3, -5, -1, 1, 0, 0 ], [ 5, -6, -2, 1, -1, 0 ] ], - [ [ 4, -6, -1, 1, -1, 0 ], [ 4, -7, -1, 1, -1, 0 ], [ 3, -5, -1, 1, 0, 0 ], [ 6, -7, -1, 1, -1, -1 ] ] -], -"cur_uid": "45fa07e8", -"ref_uid": "55f9b81e", -"order_seed": 921383, -"dur_seed": 545846, -"motifs_seed": 212473, -"entrances_probs_vals": [ 0, 0, 0, 0.66, 1.8406593406593, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"passages_probs_vals": [ 0, 0, 0, 0.66, 1.8406593406593, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"exits_probs_vals": [ 0, 0, 0, 0.66, 1.8406593406593, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"ranges": [ [ -2467, 2400 ], [ -1167, 2400 ], [ -702, 2400 ], [ -702, 2400 ] ], -"step_probs_vals": [ 0, 1200, 0, 0, 0.090534979423868, 0.92613636363636, 0.17489711934156, 0.079545454545455, 0.37037037037037, 0, 0.7201646090535, 0, 1, 0 ], -"passages_weights": [ 0.63, 0.62, 1, 0.41, 1 ], -"hd_exp": 6, -"hd_invert": 0, -"order": -[ - [ [ 1, 3, 0 ], [ 2 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 0, 2, 1 ], [ 3 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 1, 3, 2 ], [ 0 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 0, 2, 1 ], [ 3 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 3, 2, 0 ], [ 1 ], [ ] ], - [ [ 0, 1, 2 ], [ 3 ], [ ] ], - [ [ 3, 2, 0 ], [ 1 ], [ ] ], - [ [ 0, 1, 2 ], [ 3 ], [ ] ], - [ [ 3, 2, 0 ], [ 1 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 2, 1, 0 ], [ 3 ], [ ] ], - [ [ 2, 0, 3 ], [ 1 ], [ ] ], - [ [ 2, 1, 3 ], [ 0 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 1, 3, 0 ], [ 2 ], [ ] ], - [ [ 1, 3, 0 ], [ 2 ], [ ] ], - [ [ 1, 3, 0 ], [ 2 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 1, 3, 0 ], [ 2 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 1, 2, 3 ], [ 0 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 3, 0, 1 ], [ 2 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 1, 3, 0 ], [ 2 ], [ ] ], - [ [ 3, 2, 0 ], [ 1 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 0, 1, 2 ], [ 3 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 1, 3, 0 ], [ 2 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 3, 2, 1 ], [ 0 ], [ ] ], - [ [ 3, 2, 0 ], [ 1 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 1, 3, 2 ], [ 0 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 2, 3, 0 ], [ 1 ], [ ] ], - [ [ 2, 0, 1 ], [ 3 ], [ ] ], - [ [ 3, 2, 0 ], [ 1 ], [ ] ], - [ [ 2, 3, 0 ], [ 1 ], [ ] ], - [ [ 3, 2, 1 ], [ 0 ], [ ] ], - [ [ 1, 3, 0 ], [ 2 ], [ ] ], - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 1, 3, 0 ], [ 2 ], [ ] ], - [ [ 3, 2, 1 ], [ 0 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 2, 1, 0 ], [ 3 ], [ ] ], - [ [ 2, 0, 1 ], [ 3 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 2, 0, 1 ], [ 3 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 2, 3, 0 ], [ 1 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 3, 0, 1 ], [ 2 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 2, 0, 1 ], [ 3 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 2, 3, 0 ], [ 1 ], [ ] ], - [ [ 3, 0, 1 ], [ 2 ], [ ] ], - [ [ 2, 1, 0 ], [ 3 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 1, 3, 0 ], [ 2 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 1, 3, 2 ], [ 0 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 2, 0, 1 ], [ 3 ], [ ] ], - [ [ 0, 2, 1 ], [ 3 ], [ ] ], - [ [ 3, 2, 0 ], [ 1 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ] -], -"sus_weights": [ 0, 0, 0.61 ], -"order_size": [ 100, 100 ], -"passages_size": [ 0, 0 ], -"motif_edited": "false", -"order_edited": "false" -} \ No newline at end of file diff --git a/resources/string_quartet_3/4ff624b0/4ff624b0_mus_model.json b/resources/string_quartet_3/4ff624b0/4ff624b0_mus_model.json deleted file mode 100644 index 0ef2a04..0000000 --- a/resources/string_quartet_3/4ff624b0/4ff624b0_mus_model.json +++ /dev/null @@ -1,552 +0,0 @@ -{ -"music_data": -[ - [ - [ - [ [ [ 0, 0, 0, 0, 0, 0 ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 1 ], - [ [ [ 0, 0, 0, 0, 0, 0 ], [ "Rest" ], [ "Rest" ], [ 0, 0, 0, 0, 0, 0 ] ], 1 ], - [ [ [ 0, 0, 0, 0, 0, 0 ], [ "Rest" ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1 ], - [ [ [ 0, 0, 0, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ 1, 0, 0, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1 ], - [ [ [ 1, 0, 0, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, -1, 0, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ 1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, -1, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, -1, 0, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ 1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, -1, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ] ], 1 ], - [ [ [ 1, -1, 0, 0, 0, 0 ], [ 0, 0, 0, -1, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ] ], 1 ], - [ [ [ 1, -1, 0, 0, 0, 0 ], [ 0, -1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ 1, -1, 0, 0, 0, 0 ], [ 0, -1, 0, 0, 0, 0 ], [ -1, 2, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ] ], 1 ], - [ [ [ 1, -1, 0, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ -1, 2, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ] ], 1 ], - [ [ [ 0, 1, 0, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ -1, 2, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ 1, 0, -1, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ -1, 2, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ] ], 1 ], - [ [ [ 1, 0, -1, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ] ], 1 ], - [ [ [ 1, 0, -1, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ 0, 0, -1, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ 1, 0, -1, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ 0, 0, 1, 0, -1, 0 ] ], 1 ] - ], - [ - [ [ [ 1, 0, -1, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1 ], - [ [ [ 1, -1, 0, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1 ], - [ [ [ 1, -1, 0, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ 0, -1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ 1, -1, 0, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ 0, -1, 0, 0, 0, 0 ], [ 1, -1, -1, 0, 0, 0 ] ], 1 ], - [ [ [ 1, -1, 0, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ], [ 1, -1, -1, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ 0, 1, 0, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ], [ 1, -1, -1, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ 0, 1, 0, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ], [ -1, 2, 0, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ 0, 1, 0, 0, 0, 0 ], [ -2, 2, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ], [ -1, 2, 0, 0, 0, 0 ] ], 1 ], - [ [ [ 0, 0, 0, 0, 0, 0 ], [ -2, 2, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ], [ -1, 2, 0, 0, 0, 0 ] ], 1 ], - [ [ [ 0, 0, 0, 0, 0, 0 ], [ -2, 2, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ], [ 0, 1, -1, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ 0, 0, 0, 0, 0, 0 ], [ -2, 2, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ], [ -1, 1, 0, 1, 0, 0 ] ], 1 ], - [ [ [ -1, 2, 0, 0, 0, 0 ], [ -2, 2, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ], [ -1, 1, 0, 1, 0, 0 ] ], 1 ], - [ [ [ -1, 2, 0, 0, 0, 0 ], [ -1, 1, -1, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ], [ -1, 1, 0, 1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, 2, 0, 0, 0, 0 ], [ -1, 1, -1, 0, 0, 0 ], [ 0, 0, -1, 0, 0, 0 ], [ -1, 1, 0, 1, 0, 0 ] ], 1 ], - [ [ [ 0, 1, -1, 0, 0, 0 ], [ -1, 1, -1, 0, 0, 0 ], [ 0, 0, -1, 0, 0, 0 ], [ -1, 1, 0, 1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ 0, 1, -1, 0, 0, 0 ], [ 0, 1, -1, -1, 0, 0 ], [ 0, 0, -1, 0, 0, 0 ], [ -1, 1, 0, 1, 0, 0 ] ], 1 ], - [ [ [ 0, 1, -1, 0, 0, 0 ], [ 0, 1, -1, -1, 0, 0 ], [ -1, 2, -1, 0, 0, 0 ], [ -1, 1, 0, 1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, 3, -1, 0, 0, 0 ], [ 0, 1, -1, -1, 0, 0 ], [ -1, 2, -1, 0, 0, 0 ], [ -1, 1, 0, 1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, 3, -1, 0, 0, 0 ], [ 0, 1, -1, -1, 0, 0 ], [ -1, 2, -1, 0, 0, 0 ], [ -2, 3, -1, 0, 0, 0 ] ], 1 ], - [ [ [ -1, 3, -1, 0, 0, 0 ], [ 0, 1, -1, -1, 0, 0 ], [ -1, 3, -1, 0, -1, 0 ], [ -2, 3, -1, 0, 0, 0 ] ], 1 ], - [ [ [ -1, 3, -1, 0, 0, 0 ], [ -1, 3, -1, -1, 0, 0 ], [ -1, 3, -1, 0, -1, 0 ], [ -2, 3, -1, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, 3, -1, 0, 0, 0 ], [ -1, 3, -1, -1, 0, 0 ], [ -1, 3, -1, 0, -1, 0 ], [ -2, 4, -1, 0, -1, 0 ] ], 1 ] - ], - [ - [ [ [ -1, 3, -1, 0, 0, 0 ], [ -1, 3, -1, -1, 0, 0 ], [ -1, 3, -1, 0, -1, 0 ], [ 0, 3, 0, -1, 0, 0 ] ], 1 ], - [ [ [ 0, 3, -1, -1, 0, 0 ], [ -1, 3, -1, -1, 0, 0 ], [ -1, 3, -1, 0, -1, 0 ], [ 0, 3, 0, -1, 0, 0 ] ], 1 ], - [ [ [ 0, 3, -1, -1, 0, 0 ], [ -1, 3, -1, -1, 0, 0 ], [ 0, 2, -1, -1, 0, 0 ], [ 0, 3, 0, -1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ 0, 3, -1, -1, 0, 0 ], [ -1, 3, -1, -1, 0, 0 ], [ -1, 4, -1, -1, 0, 0 ], [ 0, 3, 0, -1, 0, 0 ] ], 1 ], - [ [ [ 0, 3, -1, -1, 0, 0 ], [ -1, 3, -1, -1, 0, 0 ], [ -1, 4, -1, -1, 0, 0 ], [ 0, 2, -1, -1, 0, 0 ] ], 1 ], - [ [ [ 0, 3, -1, -1, 0, 0 ], [ -1, 2, -1, -1, 0, 0 ], [ -1, 4, -1, -1, 0, 0 ], [ 0, 2, -1, -1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ 0, 3, -1, -1, 0, 0 ], [ -2, 4, -1, -1, 0, 0 ], [ -1, 4, -1, -1, 0, 0 ], [ 0, 2, -1, -1, 0, 0 ] ], 1 ], - [ [ [ -2, 5, -1, -1, 0, 0 ], [ -2, 4, -1, -1, 0, 0 ], [ -1, 4, -1, -1, 0, 0 ], [ 0, 2, -1, -1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -2, 5, -1, -1, 0, 0 ], [ -2, 4, -1, -1, 0, 0 ], [ -1, 4, -1, -1, 0, 0 ], [ -1, 3, -1, -1, 0, 0 ] ], 1 ], - [ [ [ -2, 5, -1, -1, 0, 0 ], [ -3, 6, -1, -1, 0, 0 ], [ -1, 4, -1, -1, 0, 0 ], [ -1, 3, -1, -1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -2, 5, -1, -1, 0, 0 ], [ -3, 6, -1, -1, 0, 0 ], [ -1, 4, -1, -1, 0, 0 ], [ -3, 7, -1, -1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -2, 5, -1, -1, 0, 0 ], [ -3, 6, -1, -1, 0, 0 ], [ -2, 6, -1, -1, 0, 0 ], [ -3, 7, -1, -1, 0, 0 ] ], 1 ], - [ [ [ -2, 5, -1, -1, 0, 0 ], [ -4, 8, -1, -1, 0, 0 ], [ -2, 6, -1, -1, 0, 0 ], [ -3, 7, -1, -1, 0, 0 ] ], 1 ], - [ [ [ -3, 6, -1, -1, 0, 0 ], [ -4, 8, -1, -1, 0, 0 ], [ -2, 6, -1, -1, 0, 0 ], [ -3, 7, -1, -1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -4, 7, -1, -1, 0, 0 ], [ -4, 8, -1, -1, 0, 0 ], [ -2, 6, -1, -1, 0, 0 ], [ -3, 7, -1, -1, 0, 0 ] ], 1 ], - [ [ [ -4, 7, -1, -1, 0, 0 ], [ -2, 7, -1, -1, 0, 0 ], [ -2, 6, -1, -1, 0, 0 ], [ -3, 7, -1, -1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -4, 6, -1, -1, 0, 0 ], [ -2, 7, -1, -1, 0, 0 ], [ -2, 6, -1, -1, 0, 0 ], [ -3, 7, -1, -1, 0, 0 ] ], 1 ], - [ [ [ -4, 6, -1, -1, 0, 0 ], [ -2, 7, -1, -1, 0, 0 ], [ -3, 8, -1, -1, 0, 0 ], [ -3, 7, -1, -1, 0, 0 ] ], 1 ], - [ [ [ -4, 6, -1, -1, 0, 0 ], [ -2, 6, -1, -1, 0, 0 ], [ -3, 8, -1, -1, 0, 0 ], [ -3, 7, -1, -1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 6, -1, -1, 0, 0 ], [ -2, 6, -1, -1, 0, 0 ], [ -3, 8, -1, -1, 0, 0 ], [ -3, 7, -1, -1, 0, 0 ] ], 1 ], - [ [ [ -3, 6, -1, -1, 0, 0 ], [ -2, 6, -1, -1, 0, 0 ], [ -3, 7, -1, -1, 0, 1 ], [ -3, 7, -1, -1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 6, -1, -1, 0, 0 ], [ -2, 6, -1, -1, 0, 0 ], [ -3, 7, -1, -1, 0, 1 ], [ -3, 6, -1, -1, 0, 1 ] ], 1 ], - [ [ [ -3, 6, -1, -1, 0, 0 ], [ -4, 7, -1, 0, 0, 1 ], [ -3, 7, -1, -1, 0, 1 ], [ -3, 6, -1, -1, 0, 1 ] ], 1 ], - [ [ [ -5, 7, -1, 0, 0, 1 ], [ -4, 7, -1, 0, 0, 1 ], [ -3, 7, -1, -1, 0, 1 ], [ -3, 6, -1, -1, 0, 1 ] ], 1 ] - ], - [ - [ [ [ -4, 7, -1, -1, 0, 1 ], [ -4, 7, -1, 0, 0, 1 ], [ -3, 7, -1, -1, 0, 1 ], [ -3, 6, -1, -1, 0, 1 ] ], 1 ], - [ [ [ -4, 7, -1, -1, 0, 1 ], [ -4, 7, -1, 0, 0, 1 ], [ -4, 7, 0, 0, 0, 1 ], [ -3, 6, -1, -1, 0, 1 ] ], 1 ] - ], - [ - [ [ [ -4, 7, -1, -1, 0, 1 ], [ -4, 7, -1, 0, 0, 1 ], [ -3, 6, -1, 0, 0, 1 ], [ -3, 6, -1, -1, 0, 1 ] ], 1 ], - [ [ [ -4, 7, -1, -1, 0, 1 ], [ -3, 7, -1, -1, 0, 1 ], [ -3, 6, -1, 0, 0, 1 ], [ -3, 6, -1, -1, 0, 1 ] ], 1 ] - ], - [ - [ [ [ -3, 5, -1, -1, 0, 1 ], [ -3, 7, -1, -1, 0, 1 ], [ -3, 6, -1, 0, 0, 1 ], [ -3, 6, -1, -1, 0, 1 ] ], 1 ] - ], - [ - [ [ [ -3, 5, -1, -1, 0, 1 ], [ -3, 7, -1, -1, 0, 1 ], [ -3, 6, -1, 0, 0, 1 ], [ -3, 5, -1, 0, 0, 1 ] ], 1 ], - [ [ [ -3, 5, -1, -1, 0, 1 ], [ -2, 5, -1, -1, 0, 1 ], [ -3, 6, -1, 0, 0, 1 ], [ -3, 5, -1, 0, 0, 1 ] ], 1 ], - [ [ [ -3, 5, -1, -1, 0, 1 ], [ -2, 5, -1, -1, 0, 1 ], [ -2, 5, 0, -1, 0, 1 ], [ -3, 5, -1, 0, 0, 1 ] ], 1 ] - ], - [ - [ [ [ -3, 5, -1, -1, 0, 1 ], [ -1, 5, -1, -2, 0, 1 ], [ -2, 5, 0, -1, 0, 1 ], [ -3, 5, -1, 0, 0, 1 ] ], 1 ], - [ [ [ -3, 5, -1, -1, 0, 1 ], [ -1, 5, -1, -2, 0, 1 ], [ -1, 4, -1, -1, 0, 1 ], [ -3, 5, -1, 0, 0, 1 ] ], 1 ], - [ [ [ -3, 5, -1, -1, 0, 1 ], [ -1, 5, -1, -2, 0, 1 ], [ -1, 4, -1, -1, 0, 1 ], [ -2, 5, -1, -1, 0, 1 ] ], 1 ] - ], - [ - [ [ [ -2, 5, -1, -2, 0, 1 ], [ -1, 5, -1, -2, 0, 1 ], [ -1, 4, -1, -1, 0, 1 ], [ -2, 5, -1, -1, 0, 1 ] ], 1 ], - [ [ [ -2, 5, -1, -2, 0, 1 ], [ -1, 5, -1, -2, 0, 1 ], [ -1, 4, -1, -2, 0, 1 ], [ -2, 5, -1, -1, 0, 1 ] ], 1 ] - ], - [ - [ [ [ -2, 5, -1, -2, 0, 1 ], [ -1, 5, -1, -2, 0, 1 ], [ -2, 6, -1, -2, 0, 1 ], [ -2, 5, -1, -1, 0, 1 ] ], 1 ] - ], - [ - [ [ [ -2, 5, -1, -2, 0, 1 ], [ -1, 5, -1, -2, 0, 1 ], [ -1, 5, -2, -2, 0, 1 ], [ -2, 5, -1, -1, 0, 1 ] ], 1 ], - [ [ [ -2, 4, -1, -2, 0, 1 ], [ -1, 5, -1, -2, 0, 1 ], [ -1, 5, -2, -2, 0, 1 ], [ -2, 5, -1, -1, 0, 1 ] ], 1 ], - [ [ [ -2, 4, -1, -2, 0, 1 ], [ -1, 5, -1, -2, 0, 1 ], [ -1, 5, -2, -2, 0, 1 ], [ -1, 4, -1, -2, 0, 1 ] ], 1 ] - ], - [ - [ [ [ -3, 6, -1, -2, 0, 1 ], [ -1, 5, -1, -2, 0, 1 ], [ -1, 5, -2, -2, 0, 1 ], [ -1, 4, -1, -2, 0, 1 ] ], 1 ] - ], - [ - [ [ [ -3, 6, -1, -2, 0, 1 ], [ -1, 5, -1, -2, 0, 1 ], [ -1, 5, -2, -2, 0, 1 ], [ -2, 6, -1, -2, 0, 1 ] ], 1 ], - [ [ [ -3, 6, -1, -2, 0, 1 ], [ -1, 5, -1, -2, 0, 1 ], [ -2, 5, -1, -2, 0, 1 ], [ -2, 6, -1, -2, 0, 1 ] ], 1 ] - ], - [ - [ [ [ -3, 6, -1, -2, 0, 1 ], [ -1, 5, -1, -2, 0, 1 ], [ -2, 5, -1, -2, 0, 1 ], [ -1, 5, -2, -2, 0, 1 ] ], 1 ], - [ [ [ -3, 6, -1, -2, 0, 1 ], [ -1, 5, -1, -2, 0, 1 ], [ -1, 5, -1, -3, 0, 1 ], [ -1, 5, -2, -2, 0, 1 ] ], 1 ], - [ [ [ -2, 5, -2, -2, 0, 1 ], [ -1, 5, -1, -2, 0, 1 ], [ -1, 5, -1, -3, 0, 1 ], [ -1, 5, -2, -2, 0, 1 ] ], 1 ] - ], - [ - [ [ [ -2, 5, -2, -3, 0, 1 ], [ -1, 5, -1, -2, 0, 1 ], [ -1, 5, -1, -3, 0, 1 ], [ -1, 5, -2, -2, 0, 1 ] ], 1 ], - [ [ [ -2, 5, -2, -3, 0, 1 ], [ 0, 5, -1, -3, 0, 1 ], [ -1, 5, -1, -3, 0, 1 ], [ -1, 5, -2, -2, 0, 1 ] ], 1 ], - [ [ [ -2, 5, -2, -3, 0, 1 ], [ 0, 5, -1, -3, 0, 1 ], [ -1, 5, -1, -3, 0, 1 ], [ -1, 6, -1, -3, 0, 1 ] ], 1 ] - ], - [ - [ [ [ -2, 5, -2, -3, 0, 1 ], [ 0, 5, -1, -3, 0, 1 ], [ -1, 5, -1, -3, 0, 1 ], [ -1, 5, -2, -3, 0, 1 ] ], 1 ], - [ [ [ -2, 5, -2, -3, 0, 1 ], [ 1, 4, -2, -3, 0, 1 ], [ -1, 5, -1, -3, 0, 1 ], [ -1, 5, -2, -3, 0, 1 ] ], 1 ], - [ [ [ -2, 5, -2, -3, 0, 1 ], [ 1, 4, -2, -3, 0, 1 ], [ 0, 4, -2, -3, 0, 1 ], [ -1, 5, -2, -3, 0, 1 ] ], 1 ] - ], - [ - [ [ [ -2, 5, -2, -3, 0, 1 ], [ 0, 5, -2, -3, 0, 1 ], [ 0, 4, -2, -3, 0, 1 ], [ -1, 5, -2, -3, 0, 1 ] ], 1 ] - ], - [ - [ [ [ -2, 5, -2, -3, 0, 1 ], [ 1, 5, -2, -4, 0, 1 ], [ 0, 4, -2, -3, 0, 1 ], [ -1, 5, -2, -3, 0, 1 ] ], 1 ], - [ [ [ -1, 5, -2, -4, 0, 1 ], [ 1, 5, -2, -4, 0, 1 ], [ 0, 4, -2, -3, 0, 1 ], [ -1, 5, -2, -3, 0, 1 ] ], 1 ] - ], - [ - [ [ [ -1, 5, -2, -4, 0, 1 ], [ 1, 5, -2, -4, 0, 1 ], [ 0, 4, -2, -3, 0, 1 ], [ 0, 5, -2, -4, 0, 1 ] ], 1 ], - [ [ [ -1, 5, -2, -4, 0, 1 ], [ 0, 6, -2, -4, 0, 1 ], [ 0, 4, -2, -3, 0, 1 ], [ 0, 5, -2, -4, 0, 1 ] ], 1 ], - [ [ [ -1, 5, -2, -4, 0, 1 ], [ 0, 6, -2, -4, 0, 1 ], [ 0, 5, -1, -4, 0, 1 ], [ 0, 5, -2, -4, 0, 1 ] ], 1 ] - ], - [ - [ [ [ -2, 5, -1, -4, 0, 1 ], [ 0, 6, -2, -4, 0, 1 ], [ 0, 5, -1, -4, 0, 1 ], [ 0, 5, -2, -4, 0, 1 ] ], 1 ], - [ [ [ -2, 5, -1, -4, 0, 1 ], [ 0, 5, -1, -4, 1, 1 ], [ 0, 5, -1, -4, 0, 1 ], [ 0, 5, -2, -4, 0, 1 ] ], 1 ], - [ [ [ -2, 5, -1, -4, 0, 1 ], [ 0, 5, -1, -4, 1, 1 ], [ 0, 5, -1, -4, 0, 1 ], [ -1, 5, -1, -4, 1, 1 ] ], 1 ] - ], - [ - [ [ [ -2, 5, -1, -4, 0, 1 ], [ -1, 6, -1, -4, 0, 1 ], [ 0, 5, -1, -4, 0, 1 ], [ -1, 5, -1, -4, 1, 1 ] ], 1 ], - [ [ [ -1, 5, -1, -5, 0, 1 ], [ -1, 6, -1, -4, 0, 1 ], [ 0, 5, -1, -4, 0, 1 ], [ -1, 5, -1, -4, 1, 1 ] ], 1 ] - ], - [ - [ [ [ -1, 5, -1, -5, 0, 1 ], [ -1, 6, -1, -4, 0, 1 ], [ 0, 5, -1, -4, 0, 1 ], [ 1, 4, -1, -5, 0, 1 ] ], 1 ], - [ [ [ -1, 5, -1, -5, 0, 1 ], [ 0, 6, -1, -5, 0, 1 ], [ 0, 5, -1, -4, 0, 1 ], [ 1, 4, -1, -5, 0, 1 ] ], 1 ], - [ [ [ -1, 5, -1, -5, 0, 1 ], [ 0, 6, -1, -5, 0, 1 ], [ 1, 5, -1, -5, 0, 1 ], [ 1, 4, -1, -5, 0, 1 ] ], 1 ] - ], - [ - [ [ [ -1, 5, -1, -5, 0, 1 ], [ 0, 5, -1, -5, 0, 1 ], [ 1, 5, -1, -5, 0, 1 ], [ 1, 4, -1, -5, 0, 1 ] ], 1 ], - [ [ [ 0, 4, -1, -5, 0, 1 ], [ 0, 5, -1, -5, 0, 1 ], [ 1, 5, -1, -5, 0, 1 ], [ 1, 4, -1, -5, 0, 1 ] ], 1 ], - [ [ [ 0, 4, -1, -5, 0, 1 ], [ 0, 5, -1, -5, 0, 1 ], [ 2, 4, -1, -5, 0, 1 ], [ 1, 4, -1, -5, 0, 1 ] ], 1 ] - ], - [ - [ [ [ 0, 4, -1, -5, 0, 1 ], [ 0, 5, -1, -5, 0, 1 ], [ 2, 4, -1, -5, 0, 1 ], [ 0, 6, -1, -5, 0, 1 ] ], 1 ], - [ [ [ 0, 4, -1, -5, 0, 1 ], [ 0, 5, -1, -5, 0, 1 ], [ 1, 6, -1, -5, 0, 1 ], [ 0, 6, -1, -5, 0, 1 ] ], 1 ] - ], - [ - [ [ [ 0, 4, -1, -5, 0, 1 ], [ 0, 5, -1, -5, 0, 1 ], [ 1, 6, -1, -5, 0, 1 ], [ 2, 4, -1, -5, 0, 0 ] ], 1 ], - [ [ [ 0, 4, -1, -5, 0, 1 ], [ 1, 4, -2, -5, 0, 1 ], [ 1, 6, -1, -5, 0, 1 ], [ 2, 4, -1, -5, 0, 0 ] ], 1 ] - ], - [ - [ [ [ 0, 4, -1, -5, 0, 1 ], [ 1, 4, -2, -5, 0, 1 ], [ 1, 6, -1, -5, 0, 1 ], [ 1, 6, -1, -5, 0, 0 ] ], 1 ] - ], - [ - [ [ [ 0, 4, -1, -5, 0, 1 ], [ 1, 5, -1, -5, 0, 0 ], [ 1, 6, -1, -5, 0, 1 ], [ 1, 6, -1, -5, 0, 0 ] ], 1 ] - ], - [ - [ [ [ 0, 4, -1, -5, 0, 1 ], [ 1, 4, -1, -5, 0, 1 ], [ 1, 6, -1, -5, 0, 1 ], [ 1, 6, -1, -5, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, 5, -1, -5, 0, 1 ], [ 1, 4, -1, -5, 0, 1 ], [ 1, 6, -1, -5, 0, 1 ], [ 1, 6, -1, -5, 0, 0 ] ], 1 ], - [ [ [ -1, 5, -1, -5, 0, 1 ], [ 1, 4, -1, -5, 0, 1 ], [ 3, 4, -1, -5, 0, 0 ], [ 1, 6, -1, -5, 0, 0 ] ], 1 ], - [ [ [ -1, 5, -1, -5, 0, 1 ], [ 1, 4, -1, -5, 0, 1 ], [ 3, 4, -1, -5, 0, 0 ], [ 1, 5, -1, -5, 0, 1 ] ], 1 ] - ], - [ - [ [ [ -1, 5, -1, -5, 0, 1 ], [ 1, 5, -1, -5, -1, 1 ], [ 3, 4, -1, -5, 0, 0 ], [ 1, 5, -1, -5, 0, 1 ] ], 1 ], - [ [ [ 0, 4, -1, -5, 1, 0 ], [ 1, 5, -1, -5, -1, 1 ], [ 3, 4, -1, -5, 0, 0 ], [ 1, 5, -1, -5, 0, 1 ] ], 1 ] - ], - [ - [ [ [ 0, 4, -1, -5, 1, 0 ], [ 1, 5, -1, -5, -1, 1 ], [ 2, 4, -1, -5, -1, 1 ], [ 1, 5, -1, -5, 0, 1 ] ], 1 ], - [ [ [ 0, 4, -1, -5, 1, 0 ], [ 1, 5, -1, -5, -1, 1 ], [ 2, 4, -1, -5, -1, 1 ], [ 0, 5, -1, -4, -1, 1 ] ], 1 ], - [ [ [ -1, 5, -1, -4, -1, 1 ], [ 1, 5, -1, -5, -1, 1 ], [ 2, 4, -1, -5, -1, 1 ], [ 0, 5, -1, -4, -1, 1 ] ], 1 ] - ], - [ - [ [ [ -1, 5, -1, -4, -1, 1 ], [ 1, 5, -1, -5, -1, 1 ], [ 2, 4, -1, -5, -1, 1 ], [ -1, 5, -1, -3, -1, 1 ] ], 1 ], - [ [ [ -1, 5, -1, -4, -1, 1 ], [ 1, 5, -1, -5, -1, 1 ], [ 0, 5, -1, -3, -1, 1 ], [ -1, 5, -1, -3, -1, 1 ] ], 1 ] - ], - [ - [ [ [ -1, 5, -1, -4, -1, 1 ], [ 1, 5, -1, -5, -1, 1 ], [ 1, 5, -1, -4, -1, 1 ], [ -1, 5, -1, -3, -1, 1 ] ], 1 ], - [ [ [ -1, 5, -1, -4, -1, 1 ], [ 1, 5, -1, -5, -1, 1 ], [ 1, 5, -1, -4, -1, 1 ], [ 0, 5, -1, -4, -1, 1 ] ], 1 ] - ], - [ - [ [ [ -1, 5, -1, -4, -1, 1 ], [ 1, 5, -1, -5, -1, 1 ], [ 2, 5, -1, -5, -1, 1 ], [ 0, 5, -1, -4, -1, 1 ] ], 1 ] - ], - [ - [ [ [ -1, 5, -1, -4, -1, 1 ], [ 1, 5, -1, -5, -1, 1 ], [ 2, 5, -1, -5, -1, 1 ], [ 1, 6, -1, -5, -1, 1 ] ], 1 ], - [ [ [ 0, 5, -1, -5, -1, 1 ], [ 1, 5, -1, -5, -1, 1 ], [ 2, 5, -1, -5, -1, 1 ], [ 1, 6, -1, -5, -1, 1 ] ], 1 ], - [ [ [ 0, 5, -1, -5, -1, 1 ], [ 1, 5, -1, -5, -1, 1 ], [ 2, 5, -1, -5, -2, 1 ], [ 1, 6, -1, -5, -1, 1 ] ], 1 ] - ], - [ - [ [ [ 0, 5, -1, -5, -1, 1 ], [ 1, 6, -1, -5, -2, 1 ], [ 2, 5, -1, -5, -2, 1 ], [ 1, 6, -1, -5, -1, 1 ] ], 1 ] - ], - [ - [ [ [ 0, 6, -1, -5, -2, 1 ], [ 1, 6, -1, -5, -2, 1 ], [ 2, 5, -1, -5, -2, 1 ], [ 1, 6, -1, -5, -1, 1 ] ], 1 ] - ], - [ - [ [ [ 0, 6, -1, -5, -2, 1 ], [ 0, 6, -1, -5, -1, 1 ], [ 2, 5, -1, -5, -2, 1 ], [ 1, 6, -1, -5, -1, 1 ] ], 1 ], - [ [ [ 0, 6, -2, -5, -1, 1 ], [ 0, 6, -1, -5, -1, 1 ], [ 2, 5, -1, -5, -2, 1 ], [ 1, 6, -1, -5, -1, 1 ] ], 1 ], - [ [ [ 0, 6, -2, -5, -1, 1 ], [ 0, 6, -1, -5, -1, 1 ], [ 1, 6, -2, -5, -1, 1 ], [ 1, 6, -1, -5, -1, 1 ] ], 1 ] - ], - [ - [ [ [ 0, 6, -2, -5, -1, 1 ], [ 0, 6, -1, -5, -1, 1 ], [ 1, 6, -2, -5, -1, 1 ], [ 2, 5, -2, -5, -1, 1 ] ], 1 ], - [ [ [ -1, 7, -2, -5, -1, 1 ], [ 0, 6, -1, -5, -1, 1 ], [ 1, 6, -2, -5, -1, 1 ], [ 2, 5, -2, -5, -1, 1 ] ], 1 ] - ], - [ - [ [ [ -1, 7, -2, -5, -1, 1 ], [ 0, 6, -1, -5, -1, 1 ], [ 1, 6, -2, -5, -1, 1 ], [ 0, 7, -2, -5, -1, 1 ] ], 1 ], - [ [ [ -1, 7, -2, -5, -1, 1 ], [ 0, 6, -1, -5, -1, 1 ], [ 1, 5, -1, -5, -1, 1 ], [ 0, 7, -2, -5, -1, 1 ] ], 1 ] - ], - [ - [ [ [ -1, 7, -2, -5, -1, 1 ], [ -1, 8, -2, -5, -1, 1 ], [ 1, 5, -1, -5, -1, 1 ], [ 0, 7, -2, -5, -1, 1 ] ], 1 ], - [ [ [ -1, 7, -2, -5, -1, 1 ], [ -1, 8, -2, -5, -1, 1 ], [ 0, 8, -2, -5, -1, 1 ], [ 0, 7, -2, -5, -1, 1 ] ], 1 ] - ], - [ - [ [ [ -2, 8, -2, -5, -1, 1 ], [ -1, 8, -2, -5, -1, 1 ], [ 0, 8, -2, -5, -1, 1 ], [ 0, 7, -2, -5, -1, 1 ] ], 1 ], - [ [ [ -2, 8, -2, -5, -1, 1 ], [ 0, 8, -2, -6, -1, 1 ], [ 0, 8, -2, -5, -1, 1 ], [ 0, 7, -2, -5, -1, 1 ] ], 1 ], - [ [ [ -2, 8, -2, -5, -1, 1 ], [ 0, 8, -2, -6, -1, 1 ], [ 0, 8, -2, -5, -1, 1 ], [ -1, 9, -2, -5, -1, 1 ] ], 1 ] - ], - [ - [ [ [ -1, 8, -2, -6, -1, 1 ], [ 0, 8, -2, -6, -1, 1 ], [ 0, 8, -2, -5, -1, 1 ], [ -1, 9, -2, -5, -1, 1 ] ], 1 ], - [ [ [ -1, 8, -2, -6, -1, 1 ], [ 0, 8, -2, -6, -1, 1 ], [ 0, 8, -2, -5, -1, 1 ], [ 0, 8, -3, -5, -1, 1 ] ], 1 ] - ], - [ - [ [ [ -1, 8, -2, -6, -1, 1 ], [ 0, 8, -2, -6, -1, 1 ], [ 1, 8, -2, -6, -1, 1 ], [ 0, 8, -3, -5, -1, 1 ] ], 1 ] - ], - [ - [ [ [ -1, 8, -2, -6, -1, 1 ], [ 0, 8, -2, -6, -1, 1 ], [ 0, 9, -3, -5, -1, 1 ], [ 0, 8, -3, -5, -1, 1 ] ], 1 ], - [ [ [ -2, 8, -3, -5, -1, 2 ], [ 0, 8, -2, -6, -1, 1 ], [ 0, 9, -3, -5, -1, 1 ], [ 0, 8, -3, -5, -1, 1 ] ], 1 ], - [ [ [ -2, 8, -3, -5, -1, 2 ], [ -1, 8, -3, -5, -1, 2 ], [ 0, 9, -3, -5, -1, 1 ], [ 0, 8, -3, -5, -1, 1 ] ], 1 ] - ], - [ - [ [ [ -2, 8, -3, -5, -1, 2 ], [ -1, 8, -3, -5, -1, 2 ], [ 0, 8, -3, -5, -1, 2 ], [ 0, 8, -3, -5, -1, 1 ] ], 1 ], - [ [ [ -2, 8, -3, -5, -1, 2 ], [ -1, 8, -3, -5, -1, 2 ], [ 0, 8, -3, -5, -1, 2 ], [ 0, 7, -3, -5, -1, 2 ] ], 1 ] - ], - [ - [ [ [ -2, 8, -3, -5, -1, 2 ], [ -1, 8, -3, -5, -1, 2 ], [ 1, 8, -3, -6, -1, 2 ], [ 0, 7, -3, -5, -1, 2 ] ], 1 ], - [ [ [ -1, 8, -3, -6, -1, 2 ], [ -1, 8, -3, -5, -1, 2 ], [ 1, 8, -3, -6, -1, 2 ], [ 0, 7, -3, -5, -1, 2 ] ], 1 ] - ], - [ - [ [ [ -1, 7, -3, -6, -1, 2 ], [ -1, 8, -3, -5, -1, 2 ], [ 1, 8, -3, -6, -1, 2 ], [ 0, 7, -3, -5, -1, 2 ] ], 1 ], - [ [ [ -1, 7, -3, -6, -1, 2 ], [ -1, 8, -3, -5, -1, 2 ], [ -1, 8, -2, -5, -1, 2 ], [ 0, 7, -3, -5, -1, 2 ] ], 1 ] - ], - [ - [ [ [ -1, 7, -3, -6, -1, 2 ], [ -2, 8, -2, -4, -1, 2 ], [ -1, 8, -2, -5, -1, 2 ], [ 0, 7, -3, -5, -1, 2 ] ], 1 ], - [ [ [ -2, 7, -2, -5, -1, 2 ], [ -2, 8, -2, -4, -1, 2 ], [ -1, 8, -2, -5, -1, 2 ], [ 0, 7, -3, -5, -1, 2 ] ], 1 ] - ], - [ - [ [ [ -2, 7, -2, -5, -1, 2 ], [ -2, 8, -1, -5, -1, 2 ], [ -1, 8, -2, -5, -1, 2 ], [ 0, 7, -3, -5, -1, 2 ] ], 1 ] - ], - [ - [ [ [ -2, 7, -2, -5, -1, 2 ], [ -1, 7, -2, -5, -1, 2 ], [ -1, 8, -2, -5, -1, 2 ], [ 0, 7, -3, -5, -1, 2 ] ], 1 ], - [ [ [ -3, 9, -2, -5, -1, 2 ], [ -1, 7, -2, -5, -1, 2 ], [ -1, 8, -2, -5, -1, 2 ], [ 0, 7, -3, -5, -1, 2 ] ], 1 ] - ], - [ - [ [ [ -3, 9, -2, -5, -1, 2 ], [ 0, 6, -3, -5, -1, 2 ], [ -1, 8, -2, -5, -1, 2 ], [ 0, 7, -3, -5, -1, 2 ] ], 1 ], - [ [ [ -3, 9, -2, -5, -1, 2 ], [ 0, 6, -3, -5, -1, 2 ], [ -1, 8, -3, -5, -1, 2 ], [ 0, 7, -3, -5, -1, 2 ] ], 1 ], - [ [ [ -2, 8, -3, -5, -1, 2 ], [ 0, 6, -3, -5, -1, 2 ], [ -1, 8, -3, -5, -1, 2 ], [ 0, 7, -3, -5, -1, 2 ] ], 1 ] - ], - [ - [ [ [ -2, 7, -3, -5, -1, 2 ], [ 0, 6, -3, -5, -1, 2 ], [ -1, 8, -3, -5, -1, 2 ], [ 0, 7, -3, -5, -1, 2 ] ], 1 ], - [ [ [ -2, 7, -3, -5, -1, 2 ], [ 0, 6, -3, -5, -1, 2 ], [ 0, 7, -4, -5, -1, 2 ], [ 0, 7, -3, -5, -1, 2 ] ], 1 ] - ], - [ - [ [ [ -1, 7, -3, -6, -1, 2 ], [ 0, 6, -3, -5, -1, 2 ], [ 0, 7, -4, -5, -1, 2 ], [ 0, 7, -3, -5, -1, 2 ] ], 1 ], - [ [ [ -1, 7, -3, -6, -1, 2 ], [ -1, 8, -3, -5, -1, 2 ], [ 0, 7, -4, -5, -1, 2 ], [ 0, 7, -3, -5, -1, 2 ] ], 1 ], - [ [ [ -1, 7, -3, -6, -1, 2 ], [ -1, 8, -3, -5, -1, 2 ], [ -1, 7, -3, -4, -1, 2 ], [ 0, 7, -3, -5, -1, 2 ] ], 1 ] - ], - [ - [ [ [ -1, 7, -3, -6, -1, 2 ], [ -1, 8, -3, -5, -1, 2 ], [ -1, 7, -3, -4, -1, 2 ], [ -1, 7, -2, -4, -1, 2 ] ], 1 ], - [ [ [ -1, 7, -3, -6, -1, 2 ], [ -1, 6, -3, -4, -1, 2 ], [ -1, 7, -3, -4, -1, 2 ], [ -1, 7, -2, -4, -1, 2 ] ], 1 ], - [ [ [ -2, 6, -3, -4, -1, 2 ], [ -1, 6, -3, -4, -1, 2 ], [ -1, 7, -3, -4, -1, 2 ], [ -1, 7, -2, -4, -1, 2 ] ], 1 ] - ], - [ - [ [ [ -2, 6, -3, -4, -1, 2 ], [ -1, 6, -3, -4, -1, 2 ], [ 0, 6, -4, -4, -1, 2 ], [ -1, 7, -2, -4, -1, 2 ] ], 1 ], - [ [ [ -1, 6, -3, -5, -1, 2 ], [ -1, 6, -3, -4, -1, 2 ], [ 0, 6, -4, -4, -1, 2 ], [ -1, 7, -2, -4, -1, 2 ] ], 1 ] - ], - [ - [ [ [ -1, 6, -3, -5, -1, 2 ], [ -1, 6, -3, -4, -1, 2 ], [ -1, 6, -3, -3, -1, 2 ], [ -1, 7, -2, -4, -1, 2 ] ], 1 ], - [ [ [ -1, 5, -3, -4, -1, 2 ], [ -1, 6, -3, -4, -1, 2 ], [ -1, 6, -3, -3, -1, 2 ], [ -1, 7, -2, -4, -1, 2 ] ], 1 ], - [ [ [ -1, 5, -3, -4, -1, 2 ], [ -1, 6, -3, -4, -1, 2 ], [ -1, 6, -3, -3, -1, 2 ], [ 0, 6, -3, -4, -1, 2 ] ], 1 ] - ], - [ - [ [ [ -1, 5, -3, -4, -1, 2 ], [ 0, 5, -4, -4, -1, 2 ], [ -1, 6, -3, -3, -1, 2 ], [ 0, 6, -3, -4, -1, 2 ] ], 1 ] - ], - [ - [ [ [ -1, 5, -3, -4, -1, 2 ], [ 0, 5, -4, -4, -1, 2 ], [ 0, 5, -3, -4, -1, 2 ], [ 0, 6, -3, -4, -1, 2 ] ], 1 ], - [ [ [ -1, 5, -3, -4, -1, 2 ], [ 0, 5, -4, -4, -1, 2 ], [ 0, 5, -3, -4, -1, 2 ], [ 1, 5, -4, -4, -1, 2 ] ], 1 ], - [ [ [ -1, 5, -3, -4, -1, 2 ], [ -1, 5, -3, -3, -1, 2 ], [ 0, 5, -3, -4, -1, 2 ], [ 1, 5, -4, -4, -1, 2 ] ], 1 ] - ], - [ - [ [ [ -1, 5, -3, -4, -1, 2 ], [ 1, 5, -3, -4, -1, 2 ], [ 0, 5, -3, -4, -1, 2 ], [ 1, 5, -4, -4, -1, 2 ] ], 1 ], - [ [ [ -1, 5, -3, -4, -1, 2 ], [ 1, 5, -3, -4, -1, 2 ], [ 0, 5, -3, -4, -1, 2 ], [ 0, 5, -2, -4, -1, 2 ] ], 1 ], - [ [ [ -1, 5, -3, -4, -1, 2 ], [ 1, 5, -3, -4, -1, 2 ], [ 1, 5, -3, -5, -1, 2 ], [ 0, 5, -2, -4, -1, 2 ] ], 1 ] - ], - [ - [ [ [ -1, 5, -3, -4, -1, 2 ], [ 1, 5, -3, -4, -1, 2 ], [ 1, 4, -3, -4, -1, 2 ], [ 0, 5, -2, -4, -1, 2 ] ], 1 ], - [ [ [ -1, 5, -3, -4, -1, 2 ], [ 1, 5, -3, -4, -1, 2 ], [ 1, 4, -3, -4, -1, 2 ], [ 0, 5, -3, -4, -1, 2 ] ], 1 ], - [ [ [ -1, 5, -3, -4, -1, 2 ], [ 0, 6, -3, -4, -1, 2 ], [ 1, 4, -3, -4, -1, 2 ], [ 0, 5, -3, -4, -1, 2 ] ], 1 ] - ], - [ - [ [ [ 0, 4, -4, -4, -1, 2 ], [ 0, 6, -3, -4, -1, 2 ], [ 1, 4, -3, -4, -1, 2 ], [ 0, 5, -3, -4, -1, 2 ] ], 1 ], - [ [ [ 0, 4, -4, -4, -1, 2 ], [ 1, 4, -4, -4, -1, 2 ], [ 1, 4, -3, -4, -1, 2 ], [ 0, 5, -3, -4, -1, 2 ] ], 1 ], - [ [ [ 0, 4, -4, -4, -1, 2 ], [ 1, 4, -4, -4, -1, 2 ], [ 1, 4, -3, -4, -1, 2 ], [ 2, 4, -4, -4, -1, 2 ] ], 1 ] - ], - [ - [ [ [ 0, 3, -3, -4, -1, 2 ], [ 1, 4, -4, -4, -1, 2 ], [ 1, 4, -3, -4, -1, 2 ], [ 2, 4, -4, -4, -1, 2 ] ], 1 ] - ], - [ - [ [ [ 0, 3, -4, -4, -1, 2 ], [ 1, 4, -4, -4, -1, 2 ], [ 1, 4, -3, -4, -1, 2 ], [ 2, 4, -4, -4, -1, 2 ] ], 1 ] - ], - [ - [ [ [ 0, 4, -3, -5, -1, 2 ], [ 1, 4, -4, -4, -1, 2 ], [ 1, 4, -3, -4, -1, 2 ], [ 2, 4, -4, -4, -1, 2 ] ], 1 ] - ], - [ - [ [ [ 0, 4, -3, -5, -1, 2 ], [ 1, 4, -4, -4, -1, 2 ], [ 1, 4, -3, -4, -1, 2 ], [ 1, 4, -3, -3, -1, 2 ] ], 1 ], - [ [ [ -1, 4, -2, -4, -1, 2 ], [ 1, 4, -4, -4, -1, 2 ], [ 1, 4, -3, -4, -1, 2 ], [ 1, 4, -3, -3, -1, 2 ] ], 1 ] - ], - [ - [ [ [ -1, 4, -2, -4, -1, 2 ], [ 1, 4, -4, -4, -1, 2 ], [ 1, 4, -3, -4, -1, 2 ], [ 1, 5, -2, -4, -1, 2 ] ], 1 ] - ], - [ - [ [ [ -1, 4, -2, -4, -1, 2 ], [ 1, 4, -4, -4, -1, 2 ], [ 1, 4, -3, -4, -1, 2 ], [ 1, 4, -2, -4, -1, 2 ] ], 1 ], - [ [ [ -1, 4, -2, -4, -1, 2 ], [ 1, 4, -4, -4, -1, 2 ], [ 2, 3, -4, -4, -1, 2 ], [ 1, 4, -2, -4, -1, 2 ] ], 1 ] - ], - [ - [ [ [ -1, 4, -2, -4, -1, 2 ], [ 1, 4, -4, -4, -1, 2 ], [ 2, 3, -4, -4, -1, 2 ], [ 1, 3, -2, -4, -1, 2 ] ], 1 ] - ], - [ - [ [ [ -1, 4, -2, -4, -1, 2 ], [ 1, 4, -4, -4, -1, 2 ], [ 2, 3, -4, -4, -1, 2 ], [ 1, 4, -2, -5, -1, 2 ] ], 1 ], - [ [ [ -1, 4, -2, -4, -1, 2 ], [ 0, 4, -2, -4, 0, 2 ], [ 2, 3, -4, -4, -1, 2 ], [ 1, 4, -2, -5, -1, 2 ] ], 1 ], - [ [ [ -1, 4, -2, -4, -1, 2 ], [ 0, 4, -2, -4, 0, 2 ], [ 0, 5, -2, -4, -1, 2 ], [ 1, 4, -2, -5, -1, 2 ] ], 1 ] - ], - [ - [ [ [ -1, 4, -2, -4, -1, 2 ], [ 0, 4, -2, -4, 0, 2 ], [ 1, 4, -2, -4, 0, 1 ], [ 1, 4, -2, -5, -1, 2 ] ], 1 ], - [ [ [ -1, 4, -2, -4, -1, 2 ], [ 0, 4, -2, -4, 0, 2 ], [ 1, 4, -2, -4, 0, 1 ], [ 1, 4, -2, -4, -1, 1 ] ], 1 ] - ], - [ - [ [ [ 0, 3, -2, -4, 0, 1 ], [ 0, 4, -2, -4, 0, 2 ], [ 1, 4, -2, -4, 0, 1 ], [ 1, 4, -2, -4, -1, 1 ] ], 1 ] - ], - [ - [ [ [ -1, 4, -2, -4, 0, 1 ], [ 0, 4, -2, -4, 0, 2 ], [ 1, 4, -2, -4, 0, 1 ], [ 1, 4, -2, -4, -1, 1 ] ], 1 ], - [ [ [ -1, 4, -2, -4, 0, 1 ], [ 0, 4, -2, -4, 0, 2 ], [ 1, 4, -2, -4, 0, 1 ], [ 0, 4, -3, -4, 0, 2 ] ], 1 ], - [ [ [ -1, 4, -2, -4, 0, 1 ], [ 0, 4, -2, -4, 0, 2 ], [ 1, 3, -2, -4, 0, 2 ], [ 0, 4, -3, -4, 0, 2 ] ], 1 ] - ], - [ - [ [ [ -1, 4, -2, -4, 0, 1 ], [ 0, 4, -2, -4, 0, 2 ], [ 0, 5, -2, -4, 0, 2 ], [ 0, 4, -3, -4, 0, 2 ] ], 1 ] - ], - [ - [ [ [ -1, 3, -2, -4, 0, 2 ], [ 0, 4, -2, -4, 0, 2 ], [ 0, 5, -2, -4, 0, 2 ], [ 0, 4, -3, -4, 0, 2 ] ], 1 ], - [ [ [ -1, 3, -2, -4, 0, 2 ], [ "Rest" ], [ 0, 5, -2, -4, 0, 2 ], [ 0, 4, -3, -4, 0, 2 ] ], 1 ], - [ [ [ "Rest" ], [ "Rest" ], [ 0, 5, -2, -4, 0, 2 ], [ 0, 4, -3, -4, 0, 2 ] ], 1 ], - [ [ [ "Rest" ], [ "Rest" ], [ "Rest" ], [ 0, 4, -3, -4, 0, 2 ] ], 1 ], - [ [ [ "Rest" ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 1 ] - ] - ] -], -"last_changes": -[ - [ [ -1, 4, -2, -4, 0, 1 ], [ 0, 4, -2, -4, 0, 2 ], [ 1, 4, -2, -4, 0, 1 ], [ 1, 4, -2, -4, -1, 1 ] ], - [ [ -1, 4, -2, -4, 0, 1 ], [ 0, 4, -2, -4, 0, 2 ], [ 1, 4, -2, -4, 0, 1 ], [ 0, 4, -3, -4, 0, 2 ] ], - [ [ -1, 4, -2, -4, 0, 1 ], [ 0, 4, -2, -4, 0, 2 ], [ 1, 3, -2, -4, 0, 2 ], [ 0, 4, -3, -4, 0, 2 ] ], - [ [ -1, 4, -2, -4, 0, 1 ], [ 0, 4, -2, -4, 0, 2 ], [ 0, 5, -2, -4, 0, 2 ], [ 0, 4, -3, -4, 0, 2 ] ], - [ [ -1, 3, -2, -4, 0, 2 ], [ 0, 4, -2, -4, 0, 2 ], [ 0, 5, -2, -4, 0, 2 ], [ 0, 4, -3, -4, 0, 2 ] ] -], -"cur_uid": "4ff624b0", -"ref_uid": "nil", -"order_seed": 492048, -"dur_seed": 518010, -"motifs_seed": 626337, -"entrances_probs_vals": [ 0, 0, 0, 1, 1, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"passages_probs_vals": [ 0, 0, 0, 1, 1, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"exits_probs_vals": [ 0, 0, 0, 1, 1, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"ranges": [ [ -2400, 1200 ], [ -1200, 1200 ], [ -702, 1200 ], [ -702, 1200 ] ], -"step_probs_vals": [ -1200, 1200, 0.0020576131687243, 0.068181818181818, 0.074074074074074, 0.0625, 0.20576131687243, 0.0625, 0.45679012345679, 0.011363636363636, 0.53086419753086, 0, 0.54320987654321, 0.92045454545455, 0.58641975308642, 0.92613636363636, 0.61316872427983, 0, 0.98971193415638, 0 ], -"passages_weights": [ 0.48, 0.46, 0.48, 1, 1 ], -"hd_exp": 9, -"hd_invert": 0, -"order": -[ - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 1, 2 ], [ 0, 3 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 2 ], [ 3, 0, 1 ], [ ] ], - [ [ 3 ], [ 2, 1, 0 ], [ ] ], - [ [ 1 ], [ 0, 2, 3 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 1 ], [ 3, 0, 2 ], [ ] ], - [ [ 0, 1 ], [ 3, 2 ], [ ] ], - [ [ 3, 2, 1 ], [ 0 ], [ ] ], - [ [ 0, 1, 2 ], [ 3 ], [ ] ], - [ [ 2 ], [ 1, 0, 3 ], [ ] ], - [ [ 2 ], [ 3, 0, 1 ], [ ] ], - [ [ 3, 1 ], [ 2, 0 ], [ ] ], - [ [ 3, 0 ], [ 1, 2 ], [ ] ], - [ [ 2, 1, 3 ], [ 0 ], [ ] ], - [ [ 0 ], [ 3, 2, 1 ], [ ] ], - [ [ 0, 2, 1 ], [ 3 ], [ ] ], - [ [ 1 ], [ 3, 0, 2 ], [ ] ], - [ [ 0 ], [ 2, 3, 1 ], [ ] ], - [ [ 2, 3 ], [ 1, 0 ], [ ] ], - [ [ 2, 0 ], [ 3, 1 ], [ ] ], - [ [ 0, 1, 2 ], [ 3 ], [ ] ], - [ [ 3 ], [ 2, 1, 0 ], [ ] ], - [ [ 2, 3 ], [ 0, 1 ], [ ] ], - [ [ 3 ], [ 0, 2, 1 ], [ ] ], - [ [ 1, 3 ], [ 0, 2 ], [ ] ], - [ [ 2 ], [ 3, 1, 0 ], [ ] ], - [ [ 3, 1 ], [ 0, 2 ], [ ] ], - [ [ 3, 0 ], [ 2, 1 ], [ ] ], - [ [ 2, 1, 3 ], [ 0 ], [ ] ], - [ [ 0 ], [ 3, 1, 2 ], [ ] ], - [ [ 0 ], [ 1, 2, 3 ], [ ] ], - [ [ 1, 3 ], [ 0, 2 ], [ ] ], - [ [ 1, 3, 0 ], [ 2 ], [ ] ], - [ [ 1 ], [ 2, 0, 3 ], [ ] ], - [ [ 1, 3, 2 ], [ 0 ], [ ] ], - [ [ 1, 0 ], [ 3, 2 ], [ ] ], - [ [ 1 ], [ 3, 2, 0 ], [ ] ], - [ [ 2 ], [ 0, 1, 3 ], [ ] ], - [ [ 0 ], [ 3, 1, 2 ], [ ] ], - [ [ 2, 3, 0 ], [ 1 ], [ ] ], - [ [ 3, 2 ], [ 1, 0 ], [ ] ], - [ [ 0 ], [ 3, 1, 2 ], [ ] ], - [ [ 2 ], [ 0, 1, 3 ], [ ] ], - [ [ 3, 2 ], [ 1, 0 ], [ ] ], - [ [ 0 ], [ 3, 1, 2 ], [ ] ], - [ [ 3 ], [ 1, 0, 2 ], [ ] ], - [ [ 1, 0 ], [ 3, 2 ], [ ] ], - [ [ 0, 2 ], [ 3, 1 ], [ ] ], - [ [ 2, 1, 0 ], [ 3 ], [ ] ], - [ [ 3, 2, 0 ], [ 1 ], [ ] ], - [ [ 3, 2, 0 ], [ 1 ], [ ] ], - [ [ 1 ], [ 0, 2, 3 ], [ ] ], - [ [ 3, 2 ], [ 1, 0 ], [ ] ], - [ [ 1 ], [ 2, 3, 0 ], [ ] ], - [ [ 1, 0 ], [ 3, 2 ], [ ] ], - [ [ 1, 0 ], [ 2, 3 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 1 ], [ 3, 0, 2 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 1, 2, 3 ], [ 0 ], [ ] ], - [ [ 3 ], [ 1, 0, 2 ], [ ] ], - [ [ 2, 1 ], [ 3, 0 ], [ ] ], - [ [ 1, 0 ], [ 3, 2 ], [ ] ], - [ [ 0, 3 ], [ 1, 2 ], [ ] ], - [ [ 2 ], [ 0, 1, 3 ], [ ] ], - [ [ 1, 2 ], [ 0, 3 ], [ ] ], - [ [ 3, 0, 1 ], [ 2 ], [ ] ], - [ [ 3 ], [ 2, 0, 1 ], [ ] ], - [ [ 1, 0 ], [ 2, 3 ], [ ] ], - [ [ 1, 3 ], [ 2, 0 ], [ ] ], - [ [ 1, 3 ], [ 0, 2 ], [ ] ], - [ [ 3, 2 ], [ 1, 0 ], [ ] ], - [ [ 2, 0, 3 ], [ 1 ], [ ] ], - [ [ 3, 2 ], [ 1, 0 ], [ ] ], - [ [ 3 ], [ 1, 2, 0 ], [ ] ], - [ [ 3, 1 ], [ 0, 2 ], [ ] ], - [ [ 3 ], [ 0, 1, 2 ], [ ] ], - [ [ 2 ], [ 3, 1, 0 ], [ ] ], - [ [ 1, 3 ], [ 2, 0 ], [ ] ], - [ [ 1 ], [ 2, 0, 3 ], [ ] ], - [ [ 2, 0, 3 ], [ 1 ], [ ] ], - [ [ 0 ], [ 2, 3, 1 ], [ ] ], - [ [ 0 ], [ 1, 3, 2 ], [ ] ], - [ [ 0 ], [ 2, 3, 1 ], [ ] ], - [ [ 2 ], [ 0, 1, 3 ], [ ] ], - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 1, 2, 3 ], [ 0 ], [ ] ], - [ [ 2, 1, 3 ], [ 0 ], [ ] ], - [ [ 1, 2 ], [ 3, 0 ], [ ] ], - [ [ 2, 1, 0 ], [ 3 ], [ ] ], - [ [ 1, 0 ], [ 3, 2 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 0 ], [ 3, 1, 2 ], [ ] ], - [ [ 1, 0 ], [ 2, 3 ], [ ] ], - [ [ 3, 2, 1 ], [ 0 ], [ ] ], - [ [ 1 ], [ 0, 3, 2 ], [ ] ], - [ [ 1, 3, 0 ], [ 2 ], [ ] ], - [ [ 1, 2, 3 ], [ 0 ], [ ] ] -], -"sus_weights": [ 0.35, 0.37, 0.38 ], -"order_size": [ 100, 100 ], -"passages_size": [ 0, 0 ], -"motif_edited": "false", -"order_edited": "false" -} \ No newline at end of file diff --git a/resources/string_quartet_3/5201b8af/5201b8af_code.scd b/resources/string_quartet_3/5201b8af/5201b8af_code.scd deleted file mode 100644 index c194eef..0000000 --- a/resources/string_quartet_3/5201b8af/5201b8af_code.scd +++ /dev/null @@ -1,945 +0,0 @@ -( -// helper funcs -var hsArrayToCents, pDist, hdSum, hsChordalDistance, hsArrayToFreq; - -// score funcs -var isInRange, spacingScore, rangeScore, intervalScore, inclusionScore; - -// subroutines -var genTuples, initVoices, genOrders, genSubMotif, updateVoices, genDurFunc, genStepFunc; - -// primary routines -var genMotif, genSecondarySeq; - -// audition funcs -var genPatterns, genMidiPatterns; - -// resource management funcs -var seedFunc, genUID, writeResources, stringifyToDepth, setSeeds, sanityCheck, -msgInterpret, loadLedgerFile, loadLedgerJSON, loadModelFile, loadModelJSON, -setGlobalVars, globalVarsToDict, saveLedger; - -// model vars -//(model and global vars mostly set by OSC funcs -var seq, lastXChanges, -curUID, refUID, orderSeed, durSeed, motifSeed, -entrancesProbVals, passagesProbVals, exitsProbVals, -ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, -orders, susWeights, orderSize, passagesSize, -motifEdited, orderEdited; - -// model aux vars -var entrancesDurFunc, passagesDurFunc, exitsDurFunc, stepFunc; - -// other global vars -var popSize, exPath, dir, primes, dims, tuples, -group, player, resourceDir, ledgerPath, ledger, currentlyPlayingUID, -nameSpaces; - -// install JSON quark (not used) -/* -if(Quarks.isInstalled("JSONlib").not, { - Quarks.install("https://github.com/musikinformatik/JSONlib.git"); - thisProcess.recompile; - //HelpBrowser.openHelpFor("Classes/JSONlib"); -}); -*/ - - -//------helper funcs - -hsArrayToCents = { - arg hsArray; - hsArray.collect({arg dist, p; dist * 1200 * log2(primes[p][0]/primes[p][1])}).sum -}; - -pDist = { - arg array1, array2, signed = false; - var pDistance; - pDistance = hsArrayToCents.value(array1) - hsArrayToCents.value(array2); - if(signed, {pDistance}, {abs(pDistance)}) -}; - -hdSum = { - arg hsArrays; - var size, distances, mean; - size = hsArrays.size; - distances = (size - 1).collect({arg i; - ((i + 1)..(size - 1)).collect({arg j; - abs(hsArrays[i] - hsArrays[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsChordalDistance = { - arg hsArrays1, hsArrays2; - var size, distances, mean; - size = hsArrays1.size; - distances = hsArrays1.size.collect({arg i; - hsArrays2.size.collect({arg j; - abs(hsArrays1[i] - hsArrays2[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsArrayToFreq = { - arg array; - array.collect({arg dim, d; pow(primes[d][0]/primes[d][1], dim)}).product -}; - -//------score funcs - -/* -isInRange = { - arg hsArray, min, max; - var cents; - cents = hsArrayToCents.value(hsArray); - (cents >= min) && (cents <= max) -}; -*/ - -spacingScore = { - arg hsArrays, min; - var centsArray; - centsArray = hsArrays.collect({arg hsArray; hsArrayToCents.value(hsArray)}).sort({arg a, b; a < b}); - centsArray.differentiate.drop(1).collect({arg pDistance; if(pDistance >= min, {1}, {0.01})}).sum; -}; - -rangeScore = { - arg hsArray1, hsArray2, min, max, low, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - if((pDistance >= min) && (pDistance <= max), {1}, {low}); -}; - -intervalScore = { - arg hsArray1, hsArray2, mean, sd, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - //pDistance.gaussCurve(1, mean, sd) - stepFunc.value(pDistance); -}; - -inclusionScore = { - arg array, test, min = 0.01; - if(array.collect({arg v; v.hash}).includes(test.hash), {min}, {1}); -}; - - -//------subroutines - -genTuples = { - var tuples; - tuples = dims.collect({[-1, 0, 1]}).allTuples.select({arg tuple; (abs(tuple.drop(1)).sum <= 1) && (tuple[0] == 0)}); - tuples = tuples ++ tuples.collect({arg tuple; [-3, -2, -1, 1, 2, 3].collect({arg octTrans; tuple.deepCopy.put(0, octTrans)})}).flatten; -}; - -initVoices = { - var init, voicesInit; - voicesInit = popSize.collect({dims.collect({0})}); - /* - voicesInit = [dims.collect({0})]; - (popSize - 1).do({ - arg rep, new; - rep = dims.rand; - new = voicesInit.last.deepCopy; - new[rep] = new[rep] + [-1, 1].choose(); - voicesInit = voicesInit.add(new); - }); - */ - voicesInit.deepCopy; -}; - -genDurFunc = {arg chordProb, minPad, maxPad, minDur, maxDur, envData, seed; - var env, pTable, durFunc; - env = Env.pairs([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).asSignal(256).asList.asArray; - pTable = env.asRandomTable; - [chordProb, minPad, maxPad, minDur, maxDur, envData].postln; - durFunc = {arg allowChord, pad = false; - var res; - res = if(allowChord.not, { - pTable.tableRand * (maxDur - minDur) + minDur - }, { - if(1.0.rand < chordProb, {0}, {pTable.tableRand * (maxDur - minDur) + minDur}); - }).round(0.125); - if(pad, {res = res + rrand(minPad.asFloat, maxPad.asFloat).round(0.125)}); - if(res.asInteger == res, {res = res.asInteger}); - res - }; - seedFunc.value(durFunc, seed); -}; - -genStepFunc = {arg minStep, maxStep, envData, seed; - var envDataNorm, env, pTable, stepFunc; - [minStep, maxStep, envData].postln; - envDataNorm = ([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).flop; - envDataNorm = [envDataNorm[0].normalize(minStep, maxStep), envDataNorm[1]].flop; - env = Env.pairs(envDataNorm); - stepFunc = {arg pDist; - env.at(pDist).clip(0.001, 1); - }; - seedFunc.value(stepFunc, seed); -}; - -genOrders = {arg minMotifLength = 1, maxMotifLength = 5, minProgLength = 0, maxProgLength = 5; - ((maxMotifLength - minMotifLength).rand + minMotifLength).collect({ - var noProgIns, noSusIns, noSilentIns, prog, sus, silent, order; - noSusIns = [1, 2, 3].wchoose(susWeights.normalizeSum); - noProgIns = (popSize - noSusIns).rand + 1; - noSilentIns = popSize - noSusIns - noProgIns; - - # prog, sus, silent = (0..(popSize-1)).scramble.clumps([noProgIns, noSusIns, noSilentIns]); - - prog = (prog.scramble ++ ((maxProgLength - minProgLength).rand + minProgLength).collect({prog.choose}).scramble); - if(silent == nil, {silent = []}); - [sus.scramble, prog, silent.scramble] - }); -}; - -updateVoices = {arg ins, sus; - var voices, candidates, nWeights, nProbs, sel; - - voices = lastXChanges.deepCopy.last; - - candidates = sus.collect({arg v; tuples.collect({arg t; voices[v] + t})}).flatten; - candidates = difference(candidates.asSet, voices.asSet).asList; - nProbs = candidates.collect({arg candidate; - var stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore; - - //stepScore = intervalScore.value(voices[ins], candidate, 30, 400, 0.1); - stepScore = intervalScore.value(voices[ins], candidate, 100, 100); - recentlySoundedScore = inclusionScore.value(lastXChanges.flop[ins], candidate, 0); - isInRangeScore = rangeScore.value(candidate, candidate.collect({0}), ranges[ins][0], ranges[ins][1], 0, true); - regScore = spacingScore.value(voices.deepCopy.put(ins, candidate), 300); - hdScore = pow(hdSum.value(voices.deepCopy.put(ins, candidate)), hdExp); - if(hdInvert == 0, {hdScore = 1/hdScore}); - //maybe what you want here is a vector to another root and then favoring movement towards it. - //distScore = pow(hsChordalDistance.value(voices, voices.put(ins, candidate)), 2); - - [stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore] - }); - - nWeights = passagesWeights; - - //this handles nWeights of 0; mainly for testing - nProbs = nProbs.flop.select({arg scores, s; nWeights[s] != 0}).flop; - nWeights = nWeights.select({arg weight; weight != 0}); - nProbs = nProbs.flop.collect({arg scores, s; - if(scores.sum == 0, {scores}, {scores.normalizeSum * nWeights[s]}) - }); - nProbs = nProbs.flop.collect({arg scores, s; scores.product}).normalizeSum; - - sel = candidates.wchoose(nProbs); - - voices[ins] = sel; - lastXChanges = lastXChanges.add(voices).keep(-5); -}; - -genSubMotif = {arg order, orderIndex, lastState, repeatLast = false, startFromLast = false, isLastOrder = false; - var sus, prog, silent, flatOrder, res, isInChord, allowChord, pad, lastXChangesHold, voices, adder; - # sus, prog, silent = order; - flatOrder = silent ++ sus ++ prog; - lastXChangesHold = lastXChanges.deepCopy; - voices = lastState.deepCopy; - isInChord = popSize.collect({false}); - allowChord = false; - pad = false; - res = []; - "------generating motif".postln; - //need to figure out here if voices move between motifs - flatOrder.do({arg ins, i; - - if(prog.includes(ins) && repeatLast.not, {updateVoices.value(ins, sus)}); - adder = if(silent.includes(ins), {["Rest"]}, {lastXChanges.last.deepCopy[ins]}); - - if(voices[ins] != adder, { - var dur; - - if((sus ++ silent).includes(ins), { - allowChord = (ins != sus.last); - pad = (ins == sus.last); - }, { - if(i < (flatOrder.size - 1), { - allowChord = (isInChord[flatOrder[i + 1]] || (ins == flatOrder[i + 1])).not; - pad = false; - }, { - allowChord = false; - pad = true - }); - }); - if((orderIndex == 0) && sus.includes(ins), { - dur = entrancesDurFunc.value(allowChord, pad); - }, { - dur = passagesDurFunc.value(allowChord, pad); - }); - if(dur == 0, {isInChord[ins] = true}, {isInChord = popSize.collect({false})}); - - voices[ins] = adder; - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - - // pad ending - if(orderIndex == (orders.size - 1), { - (0..(popSize-1)).scramble.do({arg ins; - if(res.last.first[ins] != ["Rest"], { - var dur; - voices[ins] = ["Rest"]; - allowChord = (voices != popSize.collect({["Rest"]})); - pad = allowChord.not; - dur = exitsDurFunc.value(allowChord, pad); - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - }); - - //format and return - if(startFromLast, {lastXChanges = lastXChangesHold.deepCopy}); - res; -}; - - -//------primary routines - -genMotif = { - var repeats, fSeq, fDur, durAdd; - - repeats = 1; - fSeq = []; - - repeats.do({arg index; - var motif; - - motif = []; - - orders.do({arg order, o; - var lastState, subMotif; - lastState = if(o == 0, {popSize.collect({["Rest"]})}, {motif.last.last.first}); - subMotif = genSubMotif.value(order, o, lastState, isLastOrder: o == (orders.size - 1)); - motif = motif.add(subMotif); - - }); - - sanityCheck.value(motif, index); - - fSeq = fSeq.add(motif); - }); - - //round last duration to measure - fDur = fSeq.flatten.flatten.slice(nil, 1).sum; - durAdd = fDur.round(4) - fDur; - if(durAdd < 0, {durAdd = 4 - durAdd}); - fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] = fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] + durAdd; - - fSeq -}; - -genSecondarySeq = {arg seq; - var curdles, fSeq; - curdles = []; - while({curdles.sum < seq.size}, {curdles = curdles ++ [3.rand + 1]}); - - fSeq = seq.clumps(curdles).collect({arg clump, m; - var repeats, paddedSeq; - - //add rest - paddedSeq = clump.add([[[popSize.collect({["Rest"]}), 0.5.rand]]]); - - //implement repeats - repeats = [0.rand + 1, 1].wchoose([1, 0].normalizeSum); - repeats.collect({paddedSeq}); - }); - fSeq -}; - - -//------audition funcs - -/* -Event.addEventType(\osc, { - if (~addr.postln.notNil) { - ~addr.sendMsg(~indexPath, ~indexMsg); - ~addr.sendMsg(~seqPath, stringifyToDepth.value(~seqMsg, 3)); - //~addr.sendMsg("/STATE/OPEN", (dir.replace("supercollider", "resources") +/+ ~idMsg +/+ ~idMsg ++ "_gui_state" ++ ".state").standardizePath.postln); - }; -}); -*/ - -Event.addEventType(\osc, { - if (~addr.notNil) { - ~msg; - ~addr.sendMsg(~path, *~msg); - }; -}); - -genPatterns = {arg inSeq, addr, oneShot = false; - var voices, durs, pbinds, res, indices, sectionDurs, msg, ids, seq; - seq = inSeq.collect({arg mSeq; mSeq[0]}); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - pbinds = voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs, attacks, rels, amps; - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - //attacks = 2.collect({rrand(1, 3)}) ++ freqs.drop(2).collect({rrand(0.3, 0.5)}); - attacks = fDurs.collect({arg dur; dur * rrand(0.2, 0.4)}); - //rels = freqs.drop(2).collect({rrand(0.3, 0.5)}) ++ 2.collect({rrand(1, 3)}); - rels = (clumps.size - 1).collect({arg c; - if(clumps[c + 1][0] == ["Rest"], {rrand(1.0, 3.0)}, {rrand(0.3, 0.5)}); - }); - rels = rels.add(rrand(1.0, 3.0)); - amps = freqs.collect({rrand(0.6, 0.99)}); - - [ - Pbind( - \instrument, \string_model, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \attack, Pseq(attacks, 1), - \sustain, Pseq(fDurs, 1), - \release, Pseq(rels, 1), - //\amp, Pseq(amps, 1), - \amp, Pbrown(0.5, 1, 0.5), - \busIndex, v - ), - Pbind( - \instrument, \sine, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \sustain, Pseq(fDurs, 1), - \busIndex, v - ) - ] - }).flatten; - if(oneShot.not, { - msg = inSeq.collect({arg mSeq, m; mSeq[1..]}); - //ids = inSeq.collect({arg mSeq, m; mSeq[2]}); - sectionDurs = seq.collect({arg mSeq; mSeq.flatten2(mSeq.maxDepth - 5).flop[1].sum}); - pbinds = pbinds ++ - [ - Pbind( - \type, \osc, - \addr, addr, - \path, "/playing", - \msg, Pseq(msg, 1), - \dur, Pseq(sectionDurs, 1) - ); - ] - }); - res = Ppar(pbinds); - res -}; - -/* -genMidiPatterns = {arg seq; - var voices, durs, patterns, res, mOut, pbRange; - pbRange = 1; //semitones - change this as needed for your situation - mOut = MIDIOut.newByName("TiMidity", "TiMidity port 0").latency_(Server.default.latency); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - res = Ppar( - voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs; - - mOut.program(v, 70); - - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - - Pbind( - \type, \midi, - \chan, v, - \noteval, Pseq(freqs.cpsmidi - 24, 1), - \note, Pfunc({ | event | event[\noteval].floor }), - \dur, Pseq(fDurs, 1), - \midiout, mOut, - \amp, 1, - \bend, Pfunc({ - | event | - if (event[\note].isRest.not) { - var pitchbendvalue = event[\noteval].frac.linlin(0, pbRange, 8192, 8192*2).asInteger; - m.bend(v, pitchbendvalue); - }; - 0; // return something other than nil to avoid stopping the pattern - }), - ); - }); - ); - res -}; -*/ - - -//------resource management funcs - -genUID = {Date.seed.asHexString.toLower}; - -seedFunc = {arg func, seed; - var funcArgs, next; - next = Routine({loop{func.valueArray(funcArgs).yield }}); - next.randSeed_(seed); - {arg ...args; funcArgs = args; next.value} -}; - -stringifyToDepth = {arg data, maxDepth = 1; - var prettyString = "", rCount = 0, writeArray, indent; - - if(maxDepth == 0, { - data.asCompileString - }, { - indent = {arg size; size.collect({" "}).join("")}; - writeArray = {arg array; - prettyString = prettyString ++ indent.value(rCount) ++ "[\n"; - rCount = rCount + 1; - if(rCount < maxDepth, { - array.do({arg subArray; writeArray.value(subArray)}); - }, { - prettyString = prettyString ++ array.collect({arg subArray; - indent.value(rCount + 1) ++ subArray.asCompileString - }).join(",\n"); - }); - rCount = rCount - 1; - prettyString = prettyString ++ "\n" ++ indent.value(rCount) ++ "],\n"; - }; - - writeArray.value(data); - prettyString.replace(",\n\n", "\n").drop(-2); - }) -}; - -sanityCheck = {arg motif, index; - //print functions = very helpful - ("----------" + index + "------------").postln; - - motif.flatten.do({arg val, v; - if(v > 0, { - if(motif.flatten[v-1][0].hammingDistance(val[0]) > 1, {"problem 1".postln}); - if(motif.flatten[v-1][0].hammingDistance(val[0]) == 0, {"problem 2".postln}); - }); - val.postln - }); - "***********".postln; -}; - -msgInterpret = {arg in, escapeDoubleQuotes = true, escapeSingleQuotes = true; - var res; - - res = in; - if(res.isNil.not, { - if((res.isArray && res.isString.not), { - res = res.asCompileString; - res = res.replace(" ", "").replace("\n", "").replace("\t", ""); - if(escapeSingleQuotes, {res = res.replace("\'", "")}); - if(escapeDoubleQuotes, {res = res.replace("\"", "")}); - res = res.replace("Rest", "\"Rest\""); - res = res.interpret; - }, { - var tmpRes; - if(res.every({arg char; char.isDecDigit}), {tmpRes = res.asInteger}); - if(res.contains("."), {tmpRes = res.asFloat}); - if(tmpRes != nil, {res = tmpRes}); - }); - }); - res -}; - -writeResources = {arg path, dict; - var file, modelItems, resString; - file = File(path,"w"); - - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - - resString = nameSpaces.collect({arg nameSpace; - var depth = 0, insert = " "; - if(nameSpace == "music_data", {depth = 3; insert = "\n"}); - if(nameSpace == "last_changes", {depth = 1; insert = "\n"}); - if(nameSpace == "order", {depth = 1; insert = "\n"}); - if((nameSpace == "ref_uid") && (dict[nameSpace] == nil), {dict[nameSpace] = "nil"}); - "\"" ++ nameSpace ++ "\":" ++ insert ++ stringifyToDepth.value(dict[nameSpace], depth) - }).join(",\n"); - - resString = "{\n" ++ resString ++ "\n}"; - - file.write(resString); - file.close; - resString -}; - -loadModelFile = {arg path; loadModelJSON.value(File(path, "r").readAllString.parseJSON)}; - -loadModelJSON = {arg jsonObject; - var dict; - dict = Dictionary.with(*nameSpaces.collect({arg nS; nS->msgInterpret.value(jsonObject[nS])})); - dict -}; - -setGlobalVars = {arg dict, skipLastXChanges = false; - var tmpLastXChanges; - tmpLastXChanges = lastXChanges.deepCopy; - // order really matters!!!! - # seq, lastXChanges, curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited = nameSpaces.collect({arg nS; dict[nS]}); - if(skipLastXChanges, {lastXChanges = tmpLastXChanges}); - dict -}; - -globalVarsToDict = { - var modelItems, dict; - // order really matters!!!! - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - dict = Dictionary.with(*nameSpaces.collect({arg nS, n; nS->modelItems[n]})); -}; - -loadLedgerFile = {arg path; - ledgerPath = path; - resourceDir = path.splitext(".").drop(-1).join; - loadLedgerJSON.value(File(ledgerPath, "r").readAllString.parseJSON) -}; - -loadLedgerJSON = {arg jsonObject; ledger = jsonObject["ledger"]}; - -saveLedger = {arg ledger, path; - var file, curResourceDir; - file = File(path, "w"); - curResourceDir = resourceDir; - resourceDir = path.splitext(".").drop(-1).join; - if(curResourceDir != resourceDir, { - File.mkdir(resourceDir); - ledger.do({arg id; - File.copy(curResourceDir +/+ id, resourceDir +/+ id); - }); - }); - file.write("{\n\"ledger\":\n" ++ stringifyToDepth.value(ledger, 1) ++ "\n}"); - file.close; -}; - -//------global vars - -primes = [[2, 1], [3, 2], [5, 4], [7, 4], [11, 8], [13, 8]]; -//ranges = [[-2400, 0], [-1200, 1200], [0, 2400], [0, 2400]]; -exPath = thisProcess.nowExecutingPath; -dir = exPath.dirname; -//popSize = 4; -dims = primes.size; -tuples = genTuples.value(); -//refUID = nil; -group = Group.new; -~group = group; -loadLedgerFile.value(dir +/+ ".." +/+ "resources" +/+ "piece_ledger.json"); -resourceDir = (dir +/+ ".." +/+ "resources" +/+ "piece_ledger"); -//passagesWeights = [1, 1, 1, 1, 1]; -//susWeights = [1, 1, 1]; -// order really matters!!!! -nameSpaces = [ - "music_data", "last_changes", "cur_uid", "ref_uid", "order_seed", "dur_seed", "motifs_seed", - "entrances_probs_vals","passages_probs_vals", "exits_probs_vals", - "ranges", "step_probs_vals", "passages_weights", "hd_exp", "hd_invert", - "order", "sus_weights", "order_size", "passages_size", - "motif_edited", "order_edited" -]; - - -//------OSC funcs - -OSCdef(\load_ledger, {arg msg, time, addr, port; - loadLedgerFile.value(msg[1].asString); -}, \load_ledger); - -OSCdef(\load_model, {arg msg, time, addr, port; - var dict; - dict = loadModelFile.value(msg[1].asString); - setGlobalVars.value(dict); -}, \load_model); - -OSCdef(\save_ledger, {arg msg, time, addr, port; - msg.postln; - ledger = msgInterpret.value(msg[1].asString.parseJSON["ledger"], false).postln; - //loadLedgerJSON.value(msg[0]) - saveLedger.value(ledger, msg[2].asString); - //loadLedgerFile.value(msg[1].asString); -}, \save_ledger); - -OSCdef(\generate, {arg msg, time, addr, port; - var path, dict, durSeeds, musPath, modelString; - msg.postln; - - path = msg[1].asString; - - dict = loadModelFile.value(path); - setGlobalVars.value(dict, true); - - popSize = ranges.size; - - //refUID.postln; - - loadLedgerFile.value(ledgerPath); - if(ledger == nil, {ledger = ["tmp"]}); - if(ledger.last != "tmp", {ledger = ledger.add("tmp")}); - - if(refUID == nil, {lastXChanges = [initVoices.value().deepCopy]}); - if((refUID != nil) && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - lastXChanges = msgInterpret.value(file.readAllString.parseJSON["last_changes"]); - }); - - refUID.postln; - lastXChanges.collect({arg item; item.postln}); - - durSeeds = seedFunc.value({3.collect({rrand(100000, 999999)})}, durSeed).value.postln; - entrancesDurFunc = genDurFunc.valueArray(entrancesProbVals[..4] ++ [entrancesProbVals[5..]] ++ [durSeeds[0]]); - passagesDurFunc = genDurFunc.valueArray(passagesProbVals[..4] ++ [passagesProbVals[5..]] ++ [durSeeds[1]]); - exitsDurFunc = genDurFunc.valueArray(exitsProbVals[..4] ++ [exitsProbVals[5..]] ++ [durSeeds[2]]); - - if(orders == nil, { - orders = seedFunc.value(genOrders, orderSeed).valueArray(orderSize ++ passagesSize); - //addr.sendMsg("/order", stringifyToDepth.value(orders, 1)); - }); - - stepFunc = genStepFunc.valueArray(stepProbsVals[..1] ++ [stepProbsVals[2..]] ++ [motifSeed]); - seq = seedFunc.value(genMotif, motifSeed).value; - - lastXChanges.collect({arg item; item.postln}); - - dict = globalVarsToDict.value; - modelString = writeResources.value(path, dict); - - //addr.sendMsg("/generated", musPath, stringifyToDepth.value(seq, 3)); - //~seq = seq; - - addr.sendMsg("/generated", path, modelString, ledgerPath); -}, \generate); - - -OSCdef(\commit, {arg msg, time, addr, port; - var musicData, musicChanged, dict, newLedger, modelPath, musString, musFile, test1, test2, lastCurUID, commitType, commitPos, equalityLedger; - //msg.postln; - - /* - test1 = msg[1].asString.parseJSON; - test2 = (dir +/+ ".." +/+ "resources/tmp/tmp_music" ++ ".json").standardizePath.parseJSONFile; - msgInterpret.value(test1["music"])[0][0][0][1].class.postln; - msgInterpret.value(test2["music_data"])[0][0][0][1].class.postln; - (test1["music"] == test2["music_data"]).postln; - */ - - musicData = loadModelJSON.value(msg[1].asString.parseJSON)["music_data"].postln; - musicChanged = (musicData != seq).postln; - commitType = msg[2].asString; - commitPos = msg[3].postln.asInteger; - - lastCurUID = curUID.deepCopy; - curUID = genUID.value; - - File.mkdir((resourceDir +/+ curUID).standardizePath); - File.copy(exPath, (resourceDir +/+ curUID +/+ curUID ++ "_code" ++ ".scd").standardizePath); - - modelPath = (resourceDir +/+ curUID +/+ curUID ++ "_mus_model" ++ ".json").standardizePath; - dict = globalVarsToDict.value; - if(musicChanged, { - seq = musicData; - dict["music_data"] = seq; - dict["motif_edited"] = "true" - }); - dict["cur_uid"] = curUID; - - writeResources.value(modelPath, dict); - - File.delete(ledgerPath ++ "_bak"); - File.copy(ledgerPath, ledgerPath ++ "_bak"); - File.delete(ledgerPath); - - /* - if(commitType == "add", { - if(lastCurUID == "tmp", { - ledger = ledger.drop(-1).add(curUID); - }, { - ledger = ledger.add(curUID); - }) - }); - */ - - ledger.postln; - - if(commitType == "add", {ledger = ledger.add(curUID)}); - - if(commitType == "insert", {ledger = ledger.insert(commitPos + 1, curUID)}); - - if(commitType == "replace", {ledger = ledger.put(commitPos, curUID)}); - - equalityLedger = ledger.collect({arg item; item.asSymbol}); - if(equalityLedger.includes(\tmp).postln, {ledger.removeAt(equalityLedger.indexOf(\tmp).postln)}); - - ledger.postln; - - saveLedger.value(ledger, ledgerPath); - - addr.sendMsg("/committed", curUID, ledgerPath); - //refUID = curUID; - -}, \commit); - -OSCdef(\transport, {arg msg, time, addr, port; - msg.postln; - if(msg[1] == 0, { - group.set(\release, 2); - group.set(\gate, 0); - player.stop; - }, { - // the cued sequence can now be read from file, so this can be cleaned up - var cSize, patterns, pSeq, cuedSeek, indexStart, indexEnd, tmpLedger; - if(msg[1] == 1, { - pSeq = []; - cuedSeek = (seq != nil); - indexStart = msg[2].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.postln.parseJSON["music_data"]), path, indexStart + index, uid]); - file.close; - }); - }); - if(cuedSeek, { - var path, file; - path = (resourceDir +/+ "tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - patterns = genPatterns.value(pSeq, addr); - }, { - pSeq = [loadModelJSON.value(msg[2].asString.parseJSON)["music_data"].postln]; - patterns = genPatterns.value(pSeq, addr, true); - }); - player = Pfset(pattern: patterns, cleanupFunc: { - addr.sendMsg("/transport", 0); - addr.sendMsg("/one_shot", 0); - }); - player = player.play - }); -}, \transport); - - -OSCdef(\transcribe_motif, {arg msg, time, addr, port; - var tSeq, refChord, refUID; - - msg.postln; - - tSeq = [loadModelJSON.value(msg[1].asString.parseJSON)["music_data"]]; - refUID = msg[2].asString.postln; - - if((refUID != "nil") && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }, { - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - }); - - ~transcribe.value(tSeq, refChord, (dir +/+ ".." +/+ "lilypond" +/+ "includes").standardizePath, addr, "/transcribe_motif"); -}, \transcribe_motif); - - -OSCdef(\transcribe_all, {arg msg, time, addr, port; - var cSize, patterns, cuedSeek, indexStart, indexEnd, tmpLedger; - if(true, { - cuedSeek = (seq != nil); - indexStart = msg[1].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - - //tmp for testing transcription - //indexEnd = (indexStart+5); - - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - var lilyPartLedgerFiles; - - lilyPartLedgerFiles = 4.collect({arg p; - File((dir +/+ ".." +/+ "lilypond" +/+ "includes" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly").standardizePath, "w"); - }); - - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file, fileString, tSeq, refUID, refChord; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - fileString = file.readAllString; - tSeq = msgInterpret.value(fileString.parseJSON["music_data"]); - refUID = msgInterpret.value(fileString.parseJSON["ref_uid"]); - file.close; - - //uid.postln; - //(refUID == "nil").postln; - - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - - if(refUID != "nil", { - path = (resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }); - - if(index != indexEnd, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath); - }, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath, addr, "/transcribe_all"); - }); - - lilyPartLedgerFiles.do({arg f, p; - f.write("\\include \"" ++ resourceDir +/+ uid +/+ "lilypond" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly\"\n"); - }); - - }); - - lilyPartLedgerFiles.do({arg f; - f.close - }); - }); - /* - if(cuedSeek, { - var path, file; - path = (dir +/+ ".." +/+ "resources/tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - */ - }, { - - }); - -}, \transcribe_all); - -) - - diff --git a/resources/string_quartet_3/5201b8af/5201b8af_mus_model.json b/resources/string_quartet_3/5201b8af/5201b8af_mus_model.json deleted file mode 100644 index aa90760..0000000 --- a/resources/string_quartet_3/5201b8af/5201b8af_mus_model.json +++ /dev/null @@ -1,58 +0,0 @@ -{ -"music_data": -[ - [ - [ - [ [ [ 0, 0, 0, 0, 0, 0 ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 1 ], - [ [ [ 0, 0, 0, 0, 0, 0 ], [ "Rest" ], [ "Rest" ], [ 1, 0, 0, 0, 0, 0 ] ], 0 ], - [ [ [ 0, 0, 0, 0, 0, 0 ], [ "Rest" ], [ 0, 0, 1, 0, 0, 0 ], [ 1, 0, 0, 0, 0, 0 ] ], 0 ], - [ [ [ 0, 0, 0, 0, 0, 0 ], [ 1, 0, 0, 0, -1, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ 1, 0, 0, 0, 0, 0 ] ], 4.875 ] - ], - [ - [ [ [ 0, 0, 0, 0, 0, 0 ], [ 1, 0, 0, 0, -1, 0 ], [ 1, 0, 0, 0, 0, -1 ], [ 1, 0, 0, 0, 0, 0 ] ], 0 ], - [ [ [ 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0 ], [ 1, 0, 0, 0, 0, -1 ], [ 1, 0, 0, 0, 0, 0 ] ], 0 ], - [ [ [ 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0 ], [ 1, 0, 0, 0, 0, -1 ], [ 0, 0, 1, 0, 0, 0 ] ], 4.75 ] - ], - [ - [ [ [ 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0 ], [ 1, -1, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ] ], 0 ], - [ [ [ 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0 ], [ 1, -1, 0, 0, 0, 0 ], [ 1, 0, 0, 0, 0, -1 ] ], 0 ], - [ [ [ 0, 0, 0, 0, 0, 0 ], [ 1, 0, -1, 0, 0, 0 ], [ 1, -1, 0, 0, 0, 0 ], [ 1, 0, 0, 0, 0, -1 ] ], 4.125 ], - [ [ [ 0, 0, 0, 0, 0, 0 ], [ 1, 0, -1, 0, 0, 0 ], [ "Rest" ], [ 1, 0, 0, 0, 0, -1 ] ], 0 ], - [ [ [ "Rest" ], [ 1, 0, -1, 0, 0, 0 ], [ "Rest" ], [ 1, 0, 0, 0, 0, -1 ] ], 0 ], - [ [ [ "Rest" ], [ 1, 0, -1, 0, 0, 0 ], [ "Rest" ], [ "Rest" ] ], 0 ] - ] - ] -], -"last_changes": -[ - [ [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 1, 0, 0 ], [ 0, 0, 0, 0, 1, 0 ], [ 1, 0, 0, -1, 0, 0 ] ], - [ [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 1, 0, 0 ], [ 0, 0, 0, 0, 1, 0 ], [ 1, 0, 0, 0, 0, -1 ] ], - [ [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 1, 0, 0 ], [ 1, -1, 0, 0, 0, 0 ], [ 1, 0, 0, 0, 0, -1 ] ], - [ [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 1, 0, 0 ], [ 1, -1, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ] ], - [ [ 0, 0, 0, 0, 0, 0 ], [ 1, 0, 0, 0, 0, 0 ], [ 1, -1, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ] ] -], -"cur_uid": "5201b8af", -"ref_uid": "77b0d2dc", -"order_seed": 921767, -"dur_seed": 954688, -"motifs_seed": 995213, -"entrances_probs_vals": [ 1, 0, 0, 3.68, 5, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"passages_probs_vals": [ 1, 0, 0, 3.68, 5, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"exits_probs_vals": [ 1, 0, 0, 3.68, 5, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"ranges": [ [ -1315.1702786378, 338.08049535604 ], [ -200.61919504644, 1452.6315789474 ], [ -386, 1675.5417956656 ], [ -219, 1694.1176470588 ] ], -"step_probs_vals": [ 0, 1200, 0, 0, 0.063786008230453, 0.92613636363636, 0.12757201646091, 0, 0.54732510288066, 0, 0.71604938271605, 0, 1, 0 ], -"passages_weights": [ 0.7, 0.29, 0.66, 0.74, 0.68 ], -"hd_exp": 2, -"hd_invert": 0, -"order": -[ - [ [ 0 ], [ 3, 2, 1 ], [ ] ], - [ [ 0 ], [ 2, 1, 3 ], [ ] ], - [ [ 0 ], [ 2, 3, 1 ], [ ] ] -], -"sus_weights": [ 1, 0, 0 ], -"order_size": [ 8, 10 ], -"passages_size": [ 0, 10 ], -"motif_edited": "true", -"order_edited": "false" -} \ No newline at end of file diff --git a/resources/string_quartet_3/5201b8af/lilypond/part_I.ly b/resources/string_quartet_3/5201b8af/lilypond/part_I.ly deleted file mode 100644 index 01ab702..0000000 --- a/resources/string_quartet_3/5201b8af/lilypond/part_I.ly +++ /dev/null @@ -1,16 +0,0 @@ -{ - { r2 c''2^\markup { \pad-markup #0.2 "+0"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }} ~ } - \bar "|" - { c''1 ~ } - \bar "|" - { c''2. ~ c''8.[ e'16^\markup { \pad-markup #0.2 "-14"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↑" }}] ~ } - \bar "|" - { e'1 ~ } - \bar "|" - { e'1 ~ } - \bar "|" - { e'4 ~ e'16[ e'8.^\markup { \pad-markup #0.2 "-41"}] ~ e'2 ~ } - \bar "|" - { e'1} -\bar "||" -} \ No newline at end of file diff --git a/resources/string_quartet_3/5201b8af/lilypond/part_II.ly b/resources/string_quartet_3/5201b8af/lilypond/part_II.ly deleted file mode 100644 index f176e75..0000000 --- a/resources/string_quartet_3/5201b8af/lilypond/part_II.ly +++ /dev/null @@ -1,16 +0,0 @@ -{ - { r2 e'2^\markup { \pad-markup #0.2 "-14"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↑" }} ~ } - \bar "|" - { e'1 ~ } - \bar "|" - { e'2. ~ e'8.[ e'16^\markup { \pad-markup #0.2 "-41"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 13↓" }}] ~ } - \bar "|" - { e'1 ~ } - \bar "|" - { e'1 ~ } - \bar "|" - { e'4 ~ e'16[ f'8.^\markup { \pad-markup #0.2 "-2"}] ~ f'2 ~ } - \bar "|" - { f'1} -\bar "||" -} \ No newline at end of file diff --git a/resources/string_quartet_3/5201b8af/lilypond/part_III.ly b/resources/string_quartet_3/5201b8af/lilypond/part_III.ly deleted file mode 100644 index 5f83063..0000000 --- a/resources/string_quartet_3/5201b8af/lilypond/part_III.ly +++ /dev/null @@ -1,16 +0,0 @@ -{ - { r2 fis'2^\markup { \pad-markup #0.2 "+49"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 11↓" }} ~ } - \bar "|" - { fis'1 ~ } - \bar "|" - { fis'2. ~ fis'8.[ g'16^\markup { \pad-markup #0.2 "+2"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↑" }}] ~ } - \bar "|" - { g'1 ~ } - \bar "|" - { g'1 ~ } - \bar "|" - { g'4 ~ g'16[ gis'8.^\markup { \pad-markup #0.2 "+14"}] ~ gis'2 ~ } - \bar "|" - { gis'1} -\bar "||" -} \ No newline at end of file diff --git a/resources/string_quartet_3/5201b8af/lilypond/part_IV.ly b/resources/string_quartet_3/5201b8af/lilypond/part_IV.ly deleted file mode 100644 index 67fc5d0..0000000 --- a/resources/string_quartet_3/5201b8af/lilypond/part_IV.ly +++ /dev/null @@ -1,16 +0,0 @@ -{ - { c'1^\markup { \pad-markup #0.2 "+0"} ~ } - \bar "|" - { c'1 ~ } - \bar "|" - { c'1 ~ } - \bar "|" - { c'1 ~ } - \bar "|" - { c'1 ~ } - \bar "|" - { c'1 ~ } - \bar "|" - { c'1} -\bar "||" -} \ No newline at end of file diff --git a/resources/string_quartet_3/5488f7e9/5488f7e9_code.scd b/resources/string_quartet_3/5488f7e9/5488f7e9_code.scd deleted file mode 100644 index e5197a1..0000000 --- a/resources/string_quartet_3/5488f7e9/5488f7e9_code.scd +++ /dev/null @@ -1,945 +0,0 @@ -( -// helper funcs -var hsArrayToCents, pDist, hdSum, hsChordalDistance, hsArrayToFreq; - -// score funcs -var isInRange, spacingScore, rangeScore, intervalScore, inclusionScore; - -// subroutines -var genTuples, initVoices, genOrders, genSubMotif, updateVoices, genDurFunc, genStepFunc; - -// primary routines -var genMotif, genSecondarySeq; - -// audition funcs -var genPatterns, genMidiPatterns; - -// resource management funcs -var seedFunc, genUID, writeResources, stringifyToDepth, setSeeds, sanityCheck, -msgInterpret, loadLedgerFile, loadLedgerJSON, loadModelFile, loadModelJSON, -setGlobalVars, globalVarsToDict, saveLedger; - -// model vars -//(model and global vars mostly set by OSC funcs -var seq, lastXChanges, -curUID, refUID, orderSeed, durSeed, motifSeed, -entrancesProbVals, passagesProbVals, exitsProbVals, -ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, -orders, susWeights, orderSize, passagesSize, -motifEdited, orderEdited; - -// model aux vars -var entrancesDurFunc, passagesDurFunc, exitsDurFunc, stepFunc; - -// other global vars -var popSize, exPath, dir, primes, dims, tuples, -group, player, resourceDir, ledgerPath, ledger, currentlyPlayingUID, -nameSpaces; - -// install JSON quark (not used) -/* -if(Quarks.isInstalled("JSONlib").not, { - Quarks.install("https://github.com/musikinformatik/JSONlib.git"); - thisProcess.recompile; - //HelpBrowser.openHelpFor("Classes/JSONlib"); -}); -*/ - - -//------helper funcs - -hsArrayToCents = { - arg hsArray; - hsArray.collect({arg dist, p; dist * 1200 * log2(primes[p][0]/primes[p][1])}).sum -}; - -pDist = { - arg array1, array2, signed = false; - var pDistance; - pDistance = hsArrayToCents.value(array1) - hsArrayToCents.value(array2); - if(signed, {pDistance}, {abs(pDistance)}) -}; - -hdSum = { - arg hsArrays; - var size, distances, mean; - size = hsArrays.size; - distances = (size - 1).collect({arg i; - ((i + 1)..(size - 1)).collect({arg j; - abs(hsArrays[i] - hsArrays[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsChordalDistance = { - arg hsArrays1, hsArrays2; - var size, distances, mean; - size = hsArrays1.size; - distances = hsArrays1.size.collect({arg i; - hsArrays2.size.collect({arg j; - abs(hsArrays1[i] - hsArrays2[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsArrayToFreq = { - arg array; - array.collect({arg dim, d; pow(primes[d][0]/primes[d][1], dim)}).product -}; - -//------score funcs - -/* -isInRange = { - arg hsArray, min, max; - var cents; - cents = hsArrayToCents.value(hsArray); - (cents >= min) && (cents <= max) -}; -*/ - -spacingScore = { - arg hsArrays, min; - var centsArray; - centsArray = hsArrays.collect({arg hsArray; hsArrayToCents.value(hsArray)}).sort({arg a, b; a < b}); - centsArray.differentiate.drop(1).collect({arg pDistance; if(pDistance >= min, {1}, {0.01})}).sum; -}; - -rangeScore = { - arg hsArray1, hsArray2, min, max, low, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - if((pDistance >= min) && (pDistance <= max), {1}, {low}); -}; - -intervalScore = { - arg hsArray1, hsArray2, mean, sd, signed = true; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - //pDistance.gaussCurve(1, mean, sd) - if(pDistance < 0, {stepFunc.value(pDistance)}, {0.001}); -}; - -inclusionScore = { - arg array, test, min = 0.01; - if(array.collect({arg v; v.hash}).includes(test.hash), {min}, {1}); -}; - - -//------subroutines - -genTuples = { - var tuples; - tuples = dims.collect({[-1, 0, 1]}).allTuples.select({arg tuple; (abs(tuple.drop(1)).sum <= 1) && (tuple[0] == 0)}); - tuples = tuples ++ tuples.collect({arg tuple; [-3, -2, -1, 1, 2, 3].collect({arg octTrans; tuple.deepCopy.put(0, octTrans)})}).flatten; -}; - -initVoices = { - var init, voicesInit; - voicesInit = popSize.collect({dims.collect({0})}); - /* - voicesInit = [dims.collect({0})]; - (popSize - 1).do({ - arg rep, new; - rep = dims.rand; - new = voicesInit.last.deepCopy; - new[rep] = new[rep] + [-1, 1].choose(); - voicesInit = voicesInit.add(new); - }); - */ - voicesInit.deepCopy; -}; - -genDurFunc = {arg chordProb, minPad, maxPad, minDur, maxDur, envData, seed; - var env, pTable, durFunc; - env = Env.pairs([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).asSignal(256).asList.asArray; - pTable = env.asRandomTable; - [chordProb, minPad, maxPad, minDur, maxDur, envData].postln; - durFunc = {arg allowChord, pad = false; - var res; - res = if(allowChord.not, { - pTable.tableRand * (maxDur - minDur) + minDur - }, { - if(1.0.rand < chordProb, {0}, {pTable.tableRand * (maxDur - minDur) + minDur}); - }).round(0.125); - if(pad, {res = res + rrand(minPad.asFloat, maxPad.asFloat).round(0.125)}); - if(res.asInteger == res, {res = res.asInteger}); - res - }; - seedFunc.value(durFunc, seed); -}; - -genStepFunc = {arg minStep, maxStep, envData, seed; - var envDataNorm, env, pTable, stepFunc; - [minStep, maxStep, envData].postln; - envDataNorm = ([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).flop; - envDataNorm = [envDataNorm[0].normalize(minStep, maxStep), envDataNorm[1]].flop; - env = Env.pairs(envDataNorm); - stepFunc = {arg pDist; - env.at(pDist).clip(0.001, 1); - }; - seedFunc.value(stepFunc, seed); -}; - -genOrders = {arg minMotifLength = 1, maxMotifLength = 5, minProgLength = 0, maxProgLength = 5; - ((maxMotifLength - minMotifLength).rand + minMotifLength).collect({ - var noProgIns, noSusIns, noSilentIns, prog, sus, silent, order; - noSusIns = [1, 2, 3].wchoose(susWeights.normalizeSum); - noProgIns = (popSize - noSusIns).rand + 1; - noSilentIns = popSize - noSusIns - noProgIns; - - # prog, sus, silent = (0..(popSize-1)).scramble.clumps([noProgIns, noSusIns, noSilentIns]); - - prog = (prog.scramble ++ ((maxProgLength - minProgLength).rand + minProgLength).collect({prog.choose}).scramble); - if(silent == nil, {silent = []}); - [sus.scramble, prog, silent.scramble] - }); -}; - -updateVoices = {arg ins, sus; - var voices, candidates, nWeights, nProbs, sel; - - voices = lastXChanges.deepCopy.last; - - candidates = sus.collect({arg v; tuples.collect({arg t; voices[v] + t})}).flatten; - candidates = difference(candidates.asSet, voices.asSet).asList; - nProbs = candidates.collect({arg candidate; - var stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore; - - //stepScore = intervalScore.value(voices[ins], candidate, 30, 400, 0.1); - stepScore = intervalScore.value(voices[ins], candidate, 100, 100); - recentlySoundedScore = inclusionScore.value(lastXChanges.flop[ins], candidate, 0); - isInRangeScore = rangeScore.value(candidate, candidate.collect({0}), ranges[ins][0], ranges[ins][1], 0, true); - regScore = spacingScore.value(voices.deepCopy.put(ins, candidate), 300); - hdScore = pow(hdSum.value(voices.deepCopy.put(ins, candidate)), hdExp); - if(hdInvert == 0, {hdScore = 1/hdScore}); - //maybe what you want here is a vector to another root and then favoring movement towards it. - //distScore = pow(hsChordalDistance.value(voices, voices.put(ins, candidate)), 2); - - [stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore] - }); - - nWeights = passagesWeights; - - //this handles nWeights of 0; mainly for testing - nProbs = nProbs.flop.select({arg scores, s; nWeights[s] != 0}).flop; - nWeights = nWeights.select({arg weight; weight != 0}); - nProbs = nProbs.flop.collect({arg scores, s; - if(scores.sum == 0, {scores}, {scores.normalizeSum * nWeights[s]}) - }); - nProbs = nProbs.flop.collect({arg scores, s; scores.product}).normalizeSum; - - sel = candidates.wchoose(nProbs); - - voices[ins] = sel; - lastXChanges = lastXChanges.add(voices).keep(-5); -}; - -genSubMotif = {arg order, orderIndex, lastState, repeatLast = false, startFromLast = false, isLastOrder = false; - var sus, prog, silent, flatOrder, res, isInChord, allowChord, pad, lastXChangesHold, voices, adder; - # sus, prog, silent = order; - flatOrder = silent ++ sus ++ prog; - lastXChangesHold = lastXChanges.deepCopy; - voices = lastState.deepCopy; - isInChord = popSize.collect({false}); - allowChord = false; - pad = false; - res = []; - "------generating motif".postln; - //need to figure out here if voices move between motifs - flatOrder.do({arg ins, i; - - if(prog.includes(ins) && repeatLast.not, {updateVoices.value(ins, sus)}); - adder = if(silent.includes(ins), {["Rest"]}, {lastXChanges.last.deepCopy[ins]}); - - if(voices[ins] != adder, { - var dur; - - if((sus ++ silent).includes(ins), { - allowChord = (ins != sus.last); - pad = (ins == sus.last); - }, { - if(i < (flatOrder.size - 1), { - allowChord = (isInChord[flatOrder[i + 1]] || (ins == flatOrder[i + 1])).not; - pad = false; - }, { - allowChord = false; - pad = true - }); - }); - if((orderIndex == 0) && sus.includes(ins), { - dur = entrancesDurFunc.value(allowChord, pad); - }, { - dur = passagesDurFunc.value(allowChord, pad); - }); - if(dur == 0, {isInChord[ins] = true}, {isInChord = popSize.collect({false})}); - - voices[ins] = adder; - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - - // pad ending - if(orderIndex == (orders.size - 1), { - (0..(popSize-1)).scramble.do({arg ins; - if(res.last.first[ins] != ["Rest"], { - var dur; - voices[ins] = ["Rest"]; - allowChord = (voices != popSize.collect({["Rest"]})); - pad = allowChord.not; - dur = exitsDurFunc.value(allowChord, pad); - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - }); - - //format and return - if(startFromLast, {lastXChanges = lastXChangesHold.deepCopy}); - res; -}; - - -//------primary routines - -genMotif = { - var repeats, fSeq, fDur, durAdd; - - repeats = 1; - fSeq = []; - - repeats.do({arg index; - var motif; - - motif = []; - - orders.do({arg order, o; - var lastState, subMotif; - lastState = if(o == 0, {popSize.collect({["Rest"]})}, {motif.last.last.first}); - subMotif = genSubMotif.value(order, o, lastState, isLastOrder: o == (orders.size - 1)); - motif = motif.add(subMotif); - - }); - - sanityCheck.value(motif, index); - - fSeq = fSeq.add(motif); - }); - - //round last duration to measure - fDur = fSeq.flatten.flatten.slice(nil, 1).sum; - durAdd = fDur.round(4) - fDur; - if(durAdd < 0, {durAdd = 4 - durAdd}); - fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] = fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] + durAdd; - - fSeq -}; - -genSecondarySeq = {arg seq; - var curdles, fSeq; - curdles = []; - while({curdles.sum < seq.size}, {curdles = curdles ++ [3.rand + 1]}); - - fSeq = seq.clumps(curdles).collect({arg clump, m; - var repeats, paddedSeq; - - //add rest - paddedSeq = clump.add([[[popSize.collect({["Rest"]}), 0.5.rand]]]); - - //implement repeats - repeats = [0.rand + 1, 1].wchoose([1, 0].normalizeSum); - repeats.collect({paddedSeq}); - }); - fSeq -}; - - -//------audition funcs - -/* -Event.addEventType(\osc, { - if (~addr.postln.notNil) { - ~addr.sendMsg(~indexPath, ~indexMsg); - ~addr.sendMsg(~seqPath, stringifyToDepth.value(~seqMsg, 3)); - //~addr.sendMsg("/STATE/OPEN", (dir.replace("supercollider", "resources") +/+ ~idMsg +/+ ~idMsg ++ "_gui_state" ++ ".state").standardizePath.postln); - }; -}); -*/ - -Event.addEventType(\osc, { - if (~addr.notNil) { - ~msg; - ~addr.sendMsg(~path, *~msg); - }; -}); - -genPatterns = {arg inSeq, addr, oneShot = false; - var voices, durs, pbinds, res, indices, sectionDurs, msg, ids, seq; - seq = inSeq.collect({arg mSeq; mSeq[0]}); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - pbinds = voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs, attacks, rels, amps; - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - //attacks = 2.collect({rrand(1, 3)}) ++ freqs.drop(2).collect({rrand(0.3, 0.5)}); - attacks = fDurs.collect({arg dur; dur * rrand(0.2, 0.4)}); - //rels = freqs.drop(2).collect({rrand(0.3, 0.5)}) ++ 2.collect({rrand(1, 3)}); - rels = (clumps.size - 1).collect({arg c; - if(clumps[c + 1][0] == ["Rest"], {rrand(1.0, 3.0)}, {rrand(0.3, 0.5)}); - }); - rels = rels.add(rrand(1.0, 3.0)); - amps = freqs.collect({rrand(0.6, 0.99)}); - - [ - Pbind( - \instrument, \string_model, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \attack, Pseq(attacks, 1), - \sustain, Pseq(fDurs, 1), - \release, Pseq(rels, 1), - //\amp, Pseq(amps, 1), - \amp, Pbrown(0.5, 1, 0.5), - \busIndex, v - ), - Pbind( - \instrument, \sine, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \sustain, Pseq(fDurs, 1), - \busIndex, v - ) - ] - }).flatten; - if(oneShot.not, { - msg = inSeq.collect({arg mSeq, m; mSeq[1..]}); - //ids = inSeq.collect({arg mSeq, m; mSeq[2]}); - sectionDurs = seq.collect({arg mSeq; mSeq.flatten2(mSeq.maxDepth - 5).flop[1].sum}); - pbinds = pbinds ++ - [ - Pbind( - \type, \osc, - \addr, addr, - \path, "/playing", - \msg, Pseq(msg, 1), - \dur, Pseq(sectionDurs, 1) - ); - ] - }); - res = Ppar(pbinds); - res -}; - -/* -genMidiPatterns = {arg seq; - var voices, durs, patterns, res, mOut, pbRange; - pbRange = 1; //semitones - change this as needed for your situation - mOut = MIDIOut.newByName("TiMidity", "TiMidity port 0").latency_(Server.default.latency); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - res = Ppar( - voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs; - - mOut.program(v, 70); - - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - - Pbind( - \type, \midi, - \chan, v, - \noteval, Pseq(freqs.cpsmidi - 24, 1), - \note, Pfunc({ | event | event[\noteval].floor }), - \dur, Pseq(fDurs, 1), - \midiout, mOut, - \amp, 1, - \bend, Pfunc({ - | event | - if (event[\note].isRest.not) { - var pitchbendvalue = event[\noteval].frac.linlin(0, pbRange, 8192, 8192*2).asInteger; - m.bend(v, pitchbendvalue); - }; - 0; // return something other than nil to avoid stopping the pattern - }), - ); - }); - ); - res -}; -*/ - - -//------resource management funcs - -genUID = {Date.seed.asHexString.toLower}; - -seedFunc = {arg func, seed; - var funcArgs, next; - next = Routine({loop{func.valueArray(funcArgs).yield }}); - next.randSeed_(seed); - {arg ...args; funcArgs = args; next.value} -}; - -stringifyToDepth = {arg data, maxDepth = 1; - var prettyString = "", rCount = 0, writeArray, indent; - - if(maxDepth == 0, { - data.asCompileString - }, { - indent = {arg size; size.collect({" "}).join("")}; - writeArray = {arg array; - prettyString = prettyString ++ indent.value(rCount) ++ "[\n"; - rCount = rCount + 1; - if(rCount < maxDepth, { - array.do({arg subArray; writeArray.value(subArray)}); - }, { - prettyString = prettyString ++ array.collect({arg subArray; - indent.value(rCount + 1) ++ subArray.asCompileString - }).join(",\n"); - }); - rCount = rCount - 1; - prettyString = prettyString ++ "\n" ++ indent.value(rCount) ++ "],\n"; - }; - - writeArray.value(data); - prettyString.replace(",\n\n", "\n").drop(-2); - }) -}; - -sanityCheck = {arg motif, index; - //print functions = very helpful - ("----------" + index + "------------").postln; - - motif.flatten.do({arg val, v; - if(v > 0, { - if(motif.flatten[v-1][0].hammingDistance(val[0]) > 1, {"problem 1".postln}); - if(motif.flatten[v-1][0].hammingDistance(val[0]) == 0, {"problem 2".postln}); - }); - val.postln - }); - "***********".postln; -}; - -msgInterpret = {arg in, escapeDoubleQuotes = true, escapeSingleQuotes = true; - var res; - - res = in; - if(res.isNil.not, { - if((res.isArray && res.isString.not), { - res = res.asCompileString; - res = res.replace(" ", "").replace("\n", "").replace("\t", ""); - if(escapeSingleQuotes, {res = res.replace("\'", "")}); - if(escapeDoubleQuotes, {res = res.replace("\"", "")}); - res = res.replace("Rest", "\"Rest\""); - res = res.interpret; - }, { - var tmpRes; - if(res.every({arg char; char.isDecDigit}), {tmpRes = res.asInteger}); - if(res.contains("."), {tmpRes = res.asFloat}); - if(tmpRes != nil, {res = tmpRes}); - }); - }); - res -}; - -writeResources = {arg path, dict; - var file, modelItems, resString; - file = File(path,"w"); - - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - - resString = nameSpaces.collect({arg nameSpace; - var depth = 0, insert = " "; - if(nameSpace == "music_data", {depth = 3; insert = "\n"}); - if(nameSpace == "last_changes", {depth = 1; insert = "\n"}); - if(nameSpace == "order", {depth = 1; insert = "\n"}); - if((nameSpace == "ref_uid") && (dict[nameSpace] == nil), {dict[nameSpace] = "nil"}); - "\"" ++ nameSpace ++ "\":" ++ insert ++ stringifyToDepth.value(dict[nameSpace], depth) - }).join(",\n"); - - resString = "{\n" ++ resString ++ "\n}"; - - file.write(resString); - file.close; - resString -}; - -loadModelFile = {arg path; loadModelJSON.value(File(path, "r").readAllString.parseJSON)}; - -loadModelJSON = {arg jsonObject; - var dict; - dict = Dictionary.with(*nameSpaces.collect({arg nS; nS->msgInterpret.value(jsonObject[nS])})); - dict -}; - -setGlobalVars = {arg dict, skipLastXChanges = false; - var tmpLastXChanges; - tmpLastXChanges = lastXChanges.deepCopy; - // order really matters!!!! - # seq, lastXChanges, curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited = nameSpaces.collect({arg nS; dict[nS]}); - if(skipLastXChanges, {lastXChanges = tmpLastXChanges}); - dict -}; - -globalVarsToDict = { - var modelItems, dict; - // order really matters!!!! - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - dict = Dictionary.with(*nameSpaces.collect({arg nS, n; nS->modelItems[n]})); -}; - -loadLedgerFile = {arg path; - ledgerPath = path; - resourceDir = path.splitext(".").drop(-1).join; - loadLedgerJSON.value(File(ledgerPath, "r").readAllString.parseJSON) -}; - -loadLedgerJSON = {arg jsonObject; ledger = jsonObject["ledger"]}; - -saveLedger = {arg ledger, path; - var file, curResourceDir; - file = File(path, "w"); - curResourceDir = resourceDir; - resourceDir = path.splitext(".").drop(-1).join; - if(curResourceDir != resourceDir, { - File.mkdir(resourceDir); - ledger.do({arg id; - File.copy(curResourceDir +/+ id, resourceDir +/+ id); - }); - }); - file.write("{\n\"ledger\":\n" ++ stringifyToDepth.value(ledger, 1) ++ "\n}"); - file.close; -}; - -//------global vars - -primes = [[2, 1], [3, 2], [5, 4], [7, 4], [11, 8], [13, 8]]; -//ranges = [[-2400, 0], [-1200, 1200], [0, 2400], [0, 2400]]; -exPath = thisProcess.nowExecutingPath; -dir = exPath.dirname; -//popSize = 4; -dims = primes.size; -tuples = genTuples.value(); -//refUID = nil; -group = Group.new; -~group = group; -loadLedgerFile.value(dir +/+ ".." +/+ "resources" +/+ "piece_ledger.json"); -resourceDir = (dir +/+ ".." +/+ "resources" +/+ "piece_ledger"); -//passagesWeights = [1, 1, 1, 1, 1]; -//susWeights = [1, 1, 1]; -// order really matters!!!! -nameSpaces = [ - "music_data", "last_changes", "cur_uid", "ref_uid", "order_seed", "dur_seed", "motifs_seed", - "entrances_probs_vals","passages_probs_vals", "exits_probs_vals", - "ranges", "step_probs_vals", "passages_weights", "hd_exp", "hd_invert", - "order", "sus_weights", "order_size", "passages_size", - "motif_edited", "order_edited" -]; - - -//------OSC funcs - -OSCdef(\load_ledger, {arg msg, time, addr, port; - loadLedgerFile.value(msg[1].asString); -}, \load_ledger); - -OSCdef(\load_model, {arg msg, time, addr, port; - var dict; - dict = loadModelFile.value(msg[1].asString); - setGlobalVars.value(dict); -}, \load_model); - -OSCdef(\save_ledger, {arg msg, time, addr, port; - msg.postln; - ledger = msgInterpret.value(msg[1].asString.parseJSON["ledger"], false).postln; - //loadLedgerJSON.value(msg[0]) - saveLedger.value(ledger, msg[2].asString); - //loadLedgerFile.value(msg[1].asString); -}, \save_ledger); - -OSCdef(\generate, {arg msg, time, addr, port; - var path, dict, durSeeds, musPath, modelString; - msg.postln; - - path = msg[1].asString; - - dict = loadModelFile.value(path); - setGlobalVars.value(dict, true); - - popSize = ranges.size; - - //refUID.postln; - - loadLedgerFile.value(ledgerPath); - if(ledger == nil, {ledger = ["tmp"]}); - if(ledger.last != "tmp", {ledger = ledger.add("tmp")}); - - if(refUID == nil, {lastXChanges = [initVoices.value().deepCopy]}); - if((refUID != nil) && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - lastXChanges = msgInterpret.value(file.readAllString.parseJSON["last_changes"]); - }); - - refUID.postln; - lastXChanges.collect({arg item; item.postln}); - - durSeeds = seedFunc.value({3.collect({rrand(100000, 999999)})}, durSeed).value.postln; - entrancesDurFunc = genDurFunc.valueArray(entrancesProbVals[..4] ++ [entrancesProbVals[5..]] ++ [durSeeds[0]]); - passagesDurFunc = genDurFunc.valueArray(passagesProbVals[..4] ++ [passagesProbVals[5..]] ++ [durSeeds[1]]); - exitsDurFunc = genDurFunc.valueArray(exitsProbVals[..4] ++ [exitsProbVals[5..]] ++ [durSeeds[2]]); - - if(orders == nil, { - orders = seedFunc.value(genOrders, orderSeed).valueArray(orderSize ++ passagesSize); - //addr.sendMsg("/order", stringifyToDepth.value(orders, 1)); - }); - - stepFunc = genStepFunc.valueArray(stepProbsVals[..1] ++ [stepProbsVals[2..]] ++ [motifSeed]); - seq = seedFunc.value(genMotif, motifSeed).value; - - lastXChanges.collect({arg item; item.postln}); - - dict = globalVarsToDict.value; - modelString = writeResources.value(path, dict); - - //addr.sendMsg("/generated", musPath, stringifyToDepth.value(seq, 3)); - //~seq = seq; - - addr.sendMsg("/generated", path, modelString, ledgerPath); -}, \generate); - - -OSCdef(\commit, {arg msg, time, addr, port; - var musicData, musicChanged, dict, newLedger, modelPath, musString, musFile, test1, test2, lastCurUID, commitType, commitPos, equalityLedger; - //msg.postln; - - /* - test1 = msg[1].asString.parseJSON; - test2 = (dir +/+ ".." +/+ "resources/tmp/tmp_music" ++ ".json").standardizePath.parseJSONFile; - msgInterpret.value(test1["music"])[0][0][0][1].class.postln; - msgInterpret.value(test2["music_data"])[0][0][0][1].class.postln; - (test1["music"] == test2["music_data"]).postln; - */ - - musicData = loadModelJSON.value(msg[1].asString.parseJSON)["music_data"].postln; - musicChanged = (musicData != seq).postln; - commitType = msg[2].asString; - commitPos = msg[3].postln.asInteger; - - lastCurUID = curUID.deepCopy; - curUID = genUID.value; - - File.mkdir((resourceDir +/+ curUID).standardizePath); - File.copy(exPath, (resourceDir +/+ curUID +/+ curUID ++ "_code" ++ ".scd").standardizePath); - - modelPath = (resourceDir +/+ curUID +/+ curUID ++ "_mus_model" ++ ".json").standardizePath; - dict = globalVarsToDict.value; - if(musicChanged, { - seq = musicData; - dict["music_data"] = seq; - dict["motif_edited"] = "true" - }); - dict["cur_uid"] = curUID; - - writeResources.value(modelPath, dict); - - File.delete(ledgerPath ++ "_bak"); - File.copy(ledgerPath, ledgerPath ++ "_bak"); - File.delete(ledgerPath); - - /* - if(commitType == "add", { - if(lastCurUID == "tmp", { - ledger = ledger.drop(-1).add(curUID); - }, { - ledger = ledger.add(curUID); - }) - }); - */ - - ledger.postln; - - if(commitType == "add", {ledger = ledger.add(curUID)}); - - if(commitType == "insert", {ledger = ledger.insert(commitPos + 1, curUID)}); - - if(commitType == "replace", {ledger = ledger.put(commitPos, curUID)}); - - equalityLedger = ledger.collect({arg item; item.asSymbol}); - if(equalityLedger.includes(\tmp).postln, {ledger.removeAt(equalityLedger.indexOf(\tmp).postln)}); - - ledger.postln; - - saveLedger.value(ledger, ledgerPath); - - addr.sendMsg("/committed", curUID, ledgerPath); - //refUID = curUID; - -}, \commit); - -OSCdef(\transport, {arg msg, time, addr, port; - msg.postln; - if(msg[1] == 0, { - group.set(\release, 2); - group.set(\gate, 0); - player.stop; - }, { - // the cued sequence can now be read from file, so this can be cleaned up - var cSize, patterns, pSeq, cuedSeek, indexStart, indexEnd, tmpLedger; - if(msg[1] == 1, { - pSeq = []; - cuedSeek = (seq != nil); - indexStart = msg[2].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.postln.parseJSON["music_data"]), path, indexStart + index, uid]); - file.close; - }); - }); - if(cuedSeek, { - var path, file; - path = (resourceDir +/+ "tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - patterns = genPatterns.value(pSeq, addr); - }, { - pSeq = [loadModelJSON.value(msg[2].asString.parseJSON)["music_data"].postln]; - patterns = genPatterns.value(pSeq, addr, true); - }); - player = Pfset(pattern: patterns, cleanupFunc: { - addr.sendMsg("/transport", 0); - addr.sendMsg("/one_shot", 0); - }); - player = player.play - }); -}, \transport); - - -OSCdef(\transcribe_motif, {arg msg, time, addr, port; - var tSeq, refChord, refUID; - - msg.postln; - - tSeq = [loadModelJSON.value(msg[1].asString.parseJSON)["music_data"]]; - refUID = msg[2].asString.postln; - - if((refUID != "nil") && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }, { - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - }); - - ~transcribe.value(tSeq, refChord, (dir +/+ ".." +/+ "lilypond" +/+ "includes").standardizePath, addr, "/transcribe_motif"); -}, \transcribe_motif); - - -OSCdef(\transcribe_all, {arg msg, time, addr, port; - var cSize, patterns, cuedSeek, indexStart, indexEnd, tmpLedger; - if(true, { - cuedSeek = (seq != nil); - indexStart = msg[1].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - - //tmp for testing transcription - //indexEnd = (indexStart+5); - - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - var lilyPartLedgerFiles; - - lilyPartLedgerFiles = 4.collect({arg p; - File((dir +/+ ".." +/+ "lilypond" +/+ "includes" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly").standardizePath, "w"); - }); - - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file, fileString, tSeq, refUID, refChord; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - fileString = file.readAllString; - tSeq = msgInterpret.value(fileString.parseJSON["music_data"]); - refUID = msgInterpret.value(fileString.parseJSON["ref_uid"]); - file.close; - - //uid.postln; - //(refUID == "nil").postln; - - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - - if(refUID != "nil", { - path = (resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }); - - if(index != indexEnd, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath); - }, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath, addr, "/transcribe_all"); - }); - - lilyPartLedgerFiles.do({arg f, p; - f.write("\\include \"" ++ resourceDir +/+ uid +/+ "lilypond" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly\"\n"); - }); - - }); - - lilyPartLedgerFiles.do({arg f; - f.close - }); - }); - /* - if(cuedSeek, { - var path, file; - path = (dir +/+ ".." +/+ "resources/tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - */ - }, { - - }); - -}, \transcribe_all); - -) - - diff --git a/resources/string_quartet_3/5488f7e9/5488f7e9_mus_model.json b/resources/string_quartet_3/5488f7e9/5488f7e9_mus_model.json deleted file mode 100644 index cf2a424..0000000 --- a/resources/string_quartet_3/5488f7e9/5488f7e9_mus_model.json +++ /dev/null @@ -1,163 +0,0 @@ -{ -"music_data": -[ - [ - [ - [ [ [ "Rest" ], [ -3, -2, 0, 1, 0, -2 ], [ "Rest" ], [ "Rest" ] ], 0.75 ], - [ [ [ "Rest" ], [ -3, -2, 0, 1, 0, -2 ], [ -3, -1, 0, 0, 0, -1 ], [ "Rest" ] ], 0.75 ], - [ [ [ -3, -1, 0, 1, 0, -2 ], [ -3, -2, 0, 1, 0, -2 ], [ -3, -1, 0, 0, 0, -1 ], [ "Rest" ] ], 0.5 ], - [ [ [ -3, -1, 0, 1, 0, -2 ], [ -3, -2, 0, 1, 0, -2 ], [ -3, -1, 0, 0, 0, -1 ], [ 0, -1, 0, 2, 0, -2 ] ], 0.5 ] - ], - [ - [ [ [ -3, -1, 0, 1, 0, -2 ], [ 0, -1, 0, 1, 0, -1 ], [ -3, -1, 0, 0, 0, -1 ], [ 0, -1, 0, 2, 0, -2 ] ], 0.75 ] - ], - [ - [ [ [ -3, -1, 0, 1, 0, -2 ], [ 2, -1, 0, 2, -1, -2 ], [ -3, -1, 0, 0, 0, -1 ], [ 0, -1, 0, 2, 0, -2 ] ], 0.5 ] - ], - [ - [ [ [ -3, -1, 0, 1, 0, -2 ], [ 2, -1, 0, 2, -1, -2 ], [ 2, -1, 0, 1, 0, -2 ], [ 0, -1, 0, 2, 0, -2 ] ], 0.875 ] - ], - [ - [ [ [ 0, 0, 0, 1, 0, -2 ], [ 2, -1, 0, 2, -1, -2 ], [ 2, -1, 0, 1, 0, -2 ], [ 0, -1, 0, 2, 0, -2 ] ], 0.5 ] - ], - [ - [ [ [ 0, 0, 0, 1, 0, -2 ], [ 2, -1, 0, 2, -1, -2 ], [ 2, -1, 0, 1, 0, -2 ], [ 1, 0, 0, 1, 0, -2 ] ], 0.5 ] - ], - [ - [ [ [ 0, 0, 0, 1, 0, -2 ], [ 2, -1, 0, 2, -1, -2 ], [ 2, -1, 0, 1, 0, -2 ], [ 0, 0, 0, 2, 0, -2 ] ], 1.25 ] - ], - [ - [ [ [ 0, 0, 0, 1, 0, -2 ], [ 2, -1, 0, 2, -1, -2 ], [ 2, -1, 0, 1, 0, -2 ], [ 1, 1, 0, 1, 0, -2 ] ], 0.875 ] - ], - [ - [ [ [ 0, 0, 0, 1, 0, -2 ], [ 2, 0, 0, 1, -1, -2 ], [ 2, -1, 0, 1, 0, -2 ], [ 1, 1, 0, 1, 0, -2 ] ], 1.125 ] - ], - [ - [ [ [ 0, 0, 0, 1, 0, -2 ], [ 2, 0, 0, 1, -1, -2 ], [ 1, 1, 0, 1, 1, -2 ], [ 1, 1, 0, 1, 0, -2 ] ], 0.125 ] - ], - [ - [ [ [ 0, 0, 0, 1, 0, -2 ], [ 0, 1, 0, 1, -1, -2 ], [ 1, 1, 0, 1, 1, -2 ], [ 1, 1, 0, 1, 0, -2 ] ], 0.625 ] - ], - [ - [ [ [ 0, 0, 0, 1, 0, -2 ], [ 0, 1, 0, 1, -1, -2 ], [ 0, 1, -1, 1, 0, -2 ], [ 1, 1, 0, 1, 0, -2 ] ], 1.125 ] - ], - [ - [ [ [ 0, 0, 0, 1, 0, -2 ], [ 0, 1, 0, 1, -1, -2 ], [ 1, 0, 0, 0, 0, -2 ], [ 1, 1, 0, 1, 0, -2 ] ], 0.875 ] - ], - [ - [ [ [ 0, 0, 0, 1, 0, -2 ], [ 0, 1, 0, 1, 0, -3 ], [ 1, 0, 0, 0, 0, -2 ], [ 1, 1, 0, 1, 0, -2 ] ], 0.25 ] - ], - [ - [ [ [ 0, 0, 0, 1, 0, -2 ], [ 2, -1, 0, 1, 0, -2 ], [ 1, 0, 0, 0, 0, -2 ], [ 1, 1, 0, 1, 0, -2 ] ], 1.125 ] - ], - [ - [ [ [ 0, 0, 0, 1, 0, -2 ], [ 2, -1, 0, 1, 0, -2 ], [ 1, -1, 0, 1, -1, -2 ], [ 1, 1, 0, 1, 0, -2 ] ], 0.25 ] - ], - [ - [ [ [ 0, 0, 0, 1, 0, -2 ], [ 1, -1, 0, 2, -1, -2 ], [ 1, -1, 0, 1, -1, -2 ], [ 1, 1, 0, 1, 0, -2 ] ], 0.875 ] - ], - [ - [ [ [ 0, 1, 0, 1, 0, -1 ], [ 1, -1, 0, 2, -1, -2 ], [ 1, -1, 0, 1, -1, -2 ], [ 1, 1, 0, 1, 0, -2 ] ], 0.75 ] - ], - [ - [ [ [ 0, 1, 0, 1, 0, -1 ], [ 1, -1, 0, 2, -1, -2 ], [ -1, 1, 1, 1, 0, -2 ], [ 1, 1, 0, 1, 0, -2 ] ], 0.75 ] - ], - [ - [ [ [ 0, 1, 1, 1, 0, -3 ], [ 1, -1, 0, 2, -1, -2 ], [ -1, 1, 1, 1, 0, -2 ], [ 1, 1, 0, 1, 0, -2 ] ], 1 ] - ], - [ - [ [ [ 0, 1, 1, 1, 0, -3 ], [ 1, -1, 0, 2, -1, -2 ], [ 1, 1, 1, 1, -1, -3 ], [ 1, 1, 0, 1, 0, -2 ] ], 1.125 ] - ], - [ - [ [ [ 0, 1, 1, 1, 0, -3 ], [ 1, -1, 0, 2, -1, -2 ], [ 2, -1, 0, 2, -1, -3 ], [ 1, 1, 0, 1, 0, -2 ] ], 0.375 ] - ], - [ - [ [ [ 2, -1, 0, 3, -1, -3 ], [ 1, -1, 0, 2, -1, -2 ], [ 2, -1, 0, 2, -1, -3 ], [ 1, 1, 0, 1, 0, -2 ] ], 0.75 ] - ], - [ - [ [ [ 2, -1, 0, 3, -1, -3 ], [ 1, -1, 0, 2, -1, -2 ], [ 2, -1, 0, 2, -1, -3 ], [ 3, -1, 0, 1, -1, -2 ] ], 1.125 ] - ], - [ - [ [ [ 2, -1, 0, 3, -1, -3 ], [ 2, -2, 0, 3, -1, -3 ], [ 2, -1, 0, 2, -1, -3 ], [ 3, -1, 0, 1, -1, -2 ] ], 0.375 ] - ], - [ - [ [ [ 2, -1, 0, 3, -1, -3 ], [ 2, -2, 0, 3, -1, -3 ], [ 2, -1, 0, 2, -1, -3 ], [ 2, -2, 1, 3, -1, -3 ] ], 0.625 ] - ], - [ - [ [ [ 2, -1, 0, 3, -1, -3 ], [ 2, -2, 0, 3, -1, -3 ], [ 2, -1, 0, 2, -1, -3 ], [ 2, -2, 0, 2, -1, -3 ] ], 0.25 ] - ], - [ - [ [ [ 1, -1, -1, 2, -1, -3 ], [ 2, -2, 0, 3, -1, -3 ], [ 2, -1, 0, 2, -1, -3 ], [ 2, -2, 0, 2, -1, -3 ] ], 1.125 ] - ], - [ - [ [ [ 1, -1, -1, 2, -1, -3 ], [ 2, -2, 0, 3, -1, -3 ], [ 2, -1, 0, 2, -1, -3 ], [ 2, -1, -1, 2, -1, -2 ] ], 0.25 ] - ], - [ - [ [ [ 1, -1, -1, 2, -1, -3 ], [ 2, -1, -1, 3, -1, -3 ], [ 2, -1, 0, 2, -1, -3 ], [ 2, -1, -1, 2, -1, -2 ] ], 0.875 ], - [ [ [ "Rest" ], [ 2, -1, -1, 3, -1, -3 ], [ 2, -1, 0, 2, -1, -3 ], [ 2, -1, -1, 2, -1, -2 ] ], 0 ], - [ [ [ "Rest" ], [ 2, -1, -1, 3, -1, -3 ], [ 2, -1, 0, 2, -1, -3 ], [ "Rest" ] ], 0.5 ], - [ [ [ "Rest" ], [ "Rest" ], [ 2, -1, 0, 2, -1, -3 ], [ "Rest" ] ], 0.375 ], - [ [ [ "Rest" ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 6.625 ] - ] - ] -], -"last_changes": -[ - [ [ 2, -1, 0, 3, -1, -3 ], [ 2, -2, 0, 3, -1, -3 ], [ 2, -1, 0, 2, -1, -3 ], [ 2, -2, 1, 3, -1, -3 ] ], - [ [ 2, -1, 0, 3, -1, -3 ], [ 2, -2, 0, 3, -1, -3 ], [ 2, -1, 0, 2, -1, -3 ], [ 2, -2, 0, 2, -1, -3 ] ], - [ [ 1, -1, -1, 2, -1, -3 ], [ 2, -2, 0, 3, -1, -3 ], [ 2, -1, 0, 2, -1, -3 ], [ 2, -2, 0, 2, -1, -3 ] ], - [ [ 1, -1, -1, 2, -1, -3 ], [ 2, -2, 0, 3, -1, -3 ], [ 2, -1, 0, 2, -1, -3 ], [ 2, -1, -1, 2, -1, -2 ] ], - [ [ 1, -1, -1, 2, -1, -3 ], [ 2, -1, -1, 3, -1, -3 ], [ 2, -1, 0, 2, -1, -3 ], [ 2, -1, -1, 2, -1, -2 ] ] -], -"cur_uid": "5488f7e9", -"ref_uid": "7c2de94c", -"order_seed": 199804, -"dur_seed": 927098, -"motifs_seed": 741655, -"entrances_probs_vals": [ 0, 0, 0, 0, 1.2087912087912, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"passages_probs_vals": [ 0, 0, 0, 0, 1.2087912087912, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"exits_probs_vals": [ 0, 0, 0, 0, 1.2087912087912, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"ranges": [ [ -1147.9876160991, 1638 ], [ -1240.866873065, 1453 ], [ -980.80495356037, 1768 ], [ -850.77399380805, 1843 ] ], -"step_probs_vals": [ 0, 1200, 0, 0, 0.063786008230453, 0.92613636363636, 0.12757201646091, 0, 0.54732510288066, 0, 0.71604938271605, 0, 1, 0 ], -"passages_weights": [ 1, 0.34, 0.98, 0.74, 0.68 ], -"hd_exp": 2, -"hd_invert": 0, -"order": -[ - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 2, 0, 3 ], [ 1 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 1, 3, 2 ], [ 0 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 2, 0, 1 ], [ 3 ], [ ] ], - [ [ 2, 3, 0 ], [ 1 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 1, 3, 0 ], [ 2 ], [ ] ], - [ [ 3, 0, 1 ], [ 2 ], [ ] ], - [ [ 2, 3, 0 ], [ 1 ], [ ] ], - [ [ 2, 0, 3 ], [ 1 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 3, 2, 0 ], [ 1 ], [ ] ], - [ [ 2, 1, 3 ], [ 0 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 3, 0, 1 ], [ 2 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 2, 1, 3 ], [ 0 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 2, 1, 0 ], [ 3 ], [ ] ], - [ [ 2, 1, 0 ], [ 3 ], [ ] ], - [ [ 1, 2, 3 ], [ 0 ], [ ] ], - [ [ 2, 0, 1 ], [ 3 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ] -], -"sus_weights": [ 0, 0, 0.61 ], -"order_size": [ 30, 30 ], -"passages_size": [ 0, 0 ], -"motif_edited": "false", -"order_edited": "false" -} \ No newline at end of file diff --git a/resources/string_quartet_3/55bd25a1/55bd25a1_code.scd b/resources/string_quartet_3/55bd25a1/55bd25a1_code.scd deleted file mode 100644 index 49436ca..0000000 --- a/resources/string_quartet_3/55bd25a1/55bd25a1_code.scd +++ /dev/null @@ -1,973 +0,0 @@ -( -// helper funcs -var hsArrayToCents, pDist, hdSum, hsChordalDistance, hsArrayToFreq; - -// score funcs -var isInRange, spacingScore, rangeScore, intervalScore, inclusionScore; - -// subroutines -var genTuples, initVoices, genOrders, genSubMotif, updateVoices, genDurFunc, genStepFunc; - -// primary routines -var genMotif, genSecondarySeq; - -// audition funcs -var genPatterns, genMidiPatterns; - -// resource management funcs -var seedFunc, genUID, writeResources, stringifyToDepth, setSeeds, sanityCheck, -msgInterpret, loadLedgerFile, loadLedgerJSON, loadModelFile, loadModelJSON, -setGlobalVars, globalVarsToDict, saveLedger; - -// model vars -//(model and global vars mostly set by OSC funcs -var seq, lastXChanges, -curUID, refUID, orderSeed, durSeed, motifSeed, -entrancesProbVals, passagesProbVals, exitsProbVals, -ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, -orders, susWeights, orderSize, passagesSize, -motifEdited, orderEdited; - -// model aux vars -var entrancesDurFunc, passagesDurFunc, exitsDurFunc, stepFunc; - -// other global vars -var popSize, exPath, dir, primes, dims, tuples, -group, player, resourceDir, ledgerPath, ledger, currentlyPlayingUID, -nameSpaces; - -// install JSON quark (not used) -/* -if(Quarks.isInstalled("JSONlib").not, { - Quarks.install("https://github.com/musikinformatik/JSONlib.git"); - thisProcess.recompile; - //HelpBrowser.openHelpFor("Classes/JSONlib"); -}); -*/ - - -//------helper funcs - -hsArrayToCents = { - arg hsArray; - hsArray.collect({arg dist, p; dist * 1200 * log2(primes[p][0]/primes[p][1])}).sum -}; - -pDist = { - arg array1, array2, signed = false; - var pDistance; - pDistance = hsArrayToCents.value(array2) - hsArrayToCents.value(array1); - if(signed, {pDistance}, {abs(pDistance)}) -}; - -hdSum = { - arg hsArrays; - var size, distances, mean; - size = hsArrays.size; - distances = (size - 1).collect({arg i; - ((i + 1)..(size - 1)).collect({arg j; - abs(hsArrays[i] - hsArrays[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsChordalDistance = { - arg hsArrays1, hsArrays2; - var size, distances, mean; - size = hsArrays1.size; - distances = hsArrays1.size.collect({arg i; - hsArrays2.size.collect({arg j; - abs(hsArrays1[i] - hsArrays2[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsArrayToFreq = { - arg array; - array.collect({arg dim, d; pow(primes[d][0]/primes[d][1], dim)}).product -}; - -//------score funcs - -/* -isInRange = { - arg hsArray, min, max; - var cents; - cents = hsArrayToCents.value(hsArray); - (cents >= min) && (cents <= max) -}; -*/ - -spacingScore = { - arg hsArrays, min; - var centsArray; - centsArray = hsArrays.collect({arg hsArray; hsArrayToCents.value(hsArray)}).sort({arg a, b; a < b}); - centsArray.differentiate.drop(1).collect({arg pDistance; if(pDistance >= min, {1}, {0.01})}).sum; -}; - -rangeScore = { - arg hsArray1, hsArray2, min, max, low, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - if((pDistance >= min) && (pDistance <= max), {1}, {low}); -}; - -/* -intervalScore = { - arg hsArray1, hsArray2, mean, sd, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - //pDistance.gaussCurve(1, mean, sd) - stepFunc.value(pDistance) -}; -*/ - -intervalScore = { - arg hsArray1, hsArray2, mean, sd, signed = true; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - //pDistance.gaussCurve(1, mean, sd) - //if(pDistance >= 0, {stepFunc.value(abs(pDistance))}, {0.01}); - stepFunc.value(pDistance) -}; - -inclusionScore = { - arg array, test, min = 0.01; - if(array.collect({arg v; v.hash}).includes(test.hash), {min}, {1}); -}; - - -//------subroutines - -genTuples = { - var tuples; - tuples = dims.collect({[-1, 0, 1]}).allTuples.select({arg tuple; (abs(tuple.drop(1)).sum <= 1) && (tuple[0] == 0)}); - //tuples = dims.collect({[0, 1]}).allTuples.select({arg tuple; (abs(tuple.drop(1)).sum <= 1) && (tuple[0] == 0)}); - tuples = tuples ++ tuples.collect({arg tuple; [-3, -2, -1, 1, 2, 3].collect({arg octTrans; tuple.deepCopy.put(0, octTrans)})}).flatten; -}; - -initVoices = { - var init, voicesInit; - voicesInit = popSize.collect({dims.collect({0})}); - /* - voicesInit = [dims.collect({0})]; - (popSize - 1).do({ - arg rep, new; - rep = dims.rand; - new = voicesInit.last.deepCopy; - new[rep] = new[rep] + [-1, 1].choose(); - voicesInit = voicesInit.add(new); - }); - */ - voicesInit.deepCopy; -}; - -genDurFunc = {arg chordProb, minPad, maxPad, minDur, maxDur, envData, seed; - var env, pTable, durFunc; - env = Env.pairs([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).asSignal(256).asList.asArray; - pTable = env.asRandomTable; - [chordProb, minPad, maxPad, minDur, maxDur, envData].postln; - durFunc = {arg allowChord, pad = false; - var res; - res = if(allowChord.not, { - pTable.tableRand * (maxDur - minDur) + minDur - }, { - if(1.0.rand < chordProb, {0}, {pTable.tableRand * (maxDur - minDur) + minDur}); - }).round(0.125); - if(pad, {res = res + rrand(minPad.asFloat, maxPad.asFloat).round(0.125)}); - if(res.asInteger == res, {res = res.asInteger}); - res - }; - seedFunc.value(durFunc, seed); -}; - -genStepFunc = {arg minStep, maxStep, envData, seed; - var envDataNorm, env, pTable, stepFunc; - [minStep, maxStep, envData].postln; - envDataNorm = ([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).flop; - envDataNorm = [envDataNorm[0].normalize(minStep, maxStep), envDataNorm[1]].flop; - env = Env.pairs(envDataNorm); - stepFunc = {arg pDist; - env.at(pDist).clip(0.001, 1); - }; - seedFunc.value(stepFunc, seed); -}; - -genOrders = {arg minMotifLength = 1, maxMotifLength = 5, minProgLength = 0, maxProgLength = 5; - ((maxMotifLength.asInteger - minMotifLength.asInteger).rand + minMotifLength.asInteger).collect({ - var noProgIns, noSusIns, noSilentIns, prog, sus, silent, order; - noSusIns = [1, 2, 3].wchoose(susWeights.normalizeSum); - //noProgIns = (popSize - noSusIns).rand + 1; - noProgIns = (popSize - noSusIns); - noSilentIns = popSize - noSusIns - noProgIns; - - # prog, sus, silent = (0..(popSize-1)).scramble.clumps([noProgIns, noSusIns, noSilentIns]); - - prog = (prog.scramble ++ ((maxProgLength.asInteger - minProgLength.asInteger).rand + minProgLength.asInteger).collect({prog.choose}).scramble); - if(silent == nil, {silent = []}); - [sus.scramble, prog, silent.scramble] - }); -}; - -updateVoices = {arg ins, sus; - var voices, candidates, nWeights, nProbs, sel; - - voices = lastXChanges.deepCopy.last; - - candidates = sus.collect({arg v; tuples.collect({arg t; voices[v] + t})}).flatten; - candidates = difference(candidates.asSet, voices.asSet).asList; - nProbs = candidates.collect({arg candidate; - var stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore; - - //stepScore = intervalScore.value(voices[ins], candidate, 30, 400, 0.1); - stepScore = intervalScore.value(voices[ins], candidate, 100, 100); - recentlySoundedScore = inclusionScore.value(lastXChanges.flop[ins], candidate, 0.01); - - - - if(rangeScore.value(candidate.collect({0}), voices[ins], ranges[ins][1] - 500, ranges[ins][1], 0, true) == 1, { - isInRangeScore = 1 - rangeScore.value(candidate.collect({0}), candidate, ranges[ins][0] + 500, ranges[ins][1] - 500, 0, true); - isInRangeScore = isInRangeScore * rangeScore.value(candidate.collect({0}), candidate, ranges[ins][0], ranges[ins][1], 0, true) - }, { - isInRangeScore = rangeScore.value(candidate.collect({0}), candidate, ranges[ins][0], ranges[ins][1], 0, true); - }); - - - //isInRangeScore = rangeScore.value(candidate.collect({0}), candidate, ranges[ins][0], ranges[ins][1], 0, true); - //old way - worked but actually by accident (I think) - //isInRangeScore = rangeScore.value(candidate, candidate.collect({0}), ranges[ins][0], ranges[ins][1], 0, true); - - - regScore = spacingScore.value(voices.deepCopy.put(ins, candidate), 300); - hdScore = pow(hdSum.value(voices.deepCopy.put(ins, candidate)), hdExp); - if(hdInvert == 0, {hdScore = 1/hdScore}); - //maybe what you want here is a vector to another root and then favoring movement towards it. - //distScore = pow(hsChordalDistance.value(voices, voices.put(ins, candidate)), 2); - - [stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore] - }); - - nWeights = passagesWeights; - - //this handles nWeights of 0; mainly for testing - nProbs = nProbs.flop.select({arg scores, s; nWeights[s] != 0}).flop; - nWeights = nWeights.select({arg weight; weight != 0}); - nProbs = nProbs.flop.collect({arg scores, s; - if(scores.sum == 0, {scores}, {scores.normalizeSum * nWeights[s]}) - }); - nProbs = nProbs.flop.collect({arg scores, s; scores.product}).normalizeSum; - - sel = candidates.wchoose(nProbs); - - voices[ins] = sel; - lastXChanges = lastXChanges.add(voices).keep(-5); -}; - -genSubMotif = {arg order, orderIndex, lastState, repeatLast = false, startFromLast = false, isLastOrder = false; - var sus, prog, silent, flatOrder, res, isInChord, allowChord, pad, lastXChangesHold, voices, adder; - # sus, prog, silent = order; - flatOrder = silent ++ sus ++ prog; - lastXChangesHold = lastXChanges.deepCopy; - voices = lastState.deepCopy; - isInChord = popSize.collect({false}); - allowChord = false; - pad = false; - res = []; - "------generating motif".postln; - //need to figure out here if voices move between motifs - flatOrder.do({arg ins, i; - - if(prog.includes(ins) && repeatLast.not, {updateVoices.value(ins, sus)}); - adder = if(silent.includes(ins), {["Rest"]}, {lastXChanges.last.deepCopy[ins]}); - - if(voices[ins] != adder, { - var dur; - - if((sus ++ silent).includes(ins), { - allowChord = (ins != sus.last); - pad = (ins == sus.last); - }, { - if(i < (flatOrder.size - 1), { - allowChord = (isInChord[flatOrder[i + 1]] || (ins == flatOrder[i + 1])).not; - pad = false; - }, { - allowChord = false; - pad = true - }); - }); - if((orderIndex == 0) && sus.includes(ins), { - dur = entrancesDurFunc.value(allowChord, pad); - }, { - dur = passagesDurFunc.value(allowChord, pad); - }); - if(dur == 0, {isInChord[ins] = true}, {isInChord = popSize.collect({false})}); - - voices[ins] = adder; - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - - // pad ending - if(orderIndex == (orders.size - 1), { - (0..(popSize-1)).scramble.do({arg ins; - if(res.last.first[ins] != ["Rest"], { - var dur; - voices[ins] = ["Rest"]; - allowChord = (voices != popSize.collect({["Rest"]})); - pad = allowChord.not; - dur = exitsDurFunc.value(allowChord, pad); - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - }); - - //format and return - if(startFromLast, {lastXChanges = lastXChangesHold.deepCopy}); - res; -}; - - -//------primary routines - -genMotif = { - var repeats, fSeq, fDur, durAdd; - - repeats = 1; - fSeq = []; - - repeats.do({arg index; - var motif; - - motif = []; - - orders.do({arg order, o; - var lastState, subMotif; - lastState = if(o == 0, {popSize.collect({["Rest"]})}, {motif.last.last.first}); - subMotif = genSubMotif.value(order, o, lastState, isLastOrder: o == (orders.size - 1)); - motif = motif.add(subMotif); - - }); - - sanityCheck.value(motif, index); - - fSeq = fSeq.add(motif); - }); - - //round last duration to measure - fDur = fSeq.flatten.flatten.slice(nil, 1).sum; - durAdd = fDur.round(4) - fDur; - if(durAdd < 0, {durAdd = 4 - durAdd}); - fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] = fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] + durAdd; - - fSeq -}; - -genSecondarySeq = {arg seq; - var curdles, fSeq; - curdles = []; - while({curdles.sum < seq.size}, {curdles = curdles ++ [3.rand + 1]}); - - fSeq = seq.clumps(curdles).collect({arg clump, m; - var repeats, paddedSeq; - - //add rest - paddedSeq = clump.add([[[popSize.collect({["Rest"]}), 0.5.rand]]]); - - //implement repeats - repeats = [0.rand + 1, 1].wchoose([1, 0].normalizeSum); - repeats.collect({paddedSeq}); - }); - fSeq -}; - - -//------audition funcs - -/* -Event.addEventType(\osc, { - if (~addr.postln.notNil) { - ~addr.sendMsg(~indexPath, ~indexMsg); - ~addr.sendMsg(~seqPath, stringifyToDepth.value(~seqMsg, 3)); - //~addr.sendMsg("/STATE/OPEN", (dir.replace("supercollider", "resources") +/+ ~idMsg +/+ ~idMsg ++ "_gui_state" ++ ".state").standardizePath.postln); - }; -}); -*/ - -Event.addEventType(\osc, { - if (~addr.notNil) { - ~msg; - ~addr.sendMsg(~path, *~msg); - }; -}); - -genPatterns = {arg inSeq, addr, oneShot = false; - var voices, durs, pbinds, res, indices, sectionDurs, msg, ids, seq; - seq = inSeq.collect({arg mSeq; mSeq[0]}); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - pbinds = voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs, attacks, rels, amps; - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - //attacks = 2.collect({rrand(1, 3)}) ++ freqs.drop(2).collect({rrand(0.3, 0.5)}); - attacks = fDurs.collect({arg dur; dur * rrand(0.2, 0.4)}); - //rels = freqs.drop(2).collect({rrand(0.3, 0.5)}) ++ 2.collect({rrand(1, 3)}); - rels = (clumps.size - 1).collect({arg c; - if(clumps[c + 1][0] == ["Rest"], {rrand(1.0, 3.0)}, {rrand(0.3, 0.5)}); - }); - rels = rels.add(rrand(1.0, 3.0)); - amps = freqs.collect({rrand(0.6, 0.99)}); - - [ - Pbind( - \instrument, \string_model, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \attack, Pseq(attacks, 1), - \sustain, Pseq(fDurs, 1), - \release, Pseq(rels, 1), - //\amp, Pseq(amps, 1), - \amp, Pbrown(0.5, 1, 0.5), - \busIndex, v - ), - Pbind( - \instrument, \sine, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \sustain, Pseq(fDurs, 1), - \busIndex, v - ) - ] - }).flatten; - if(oneShot.not, { - msg = inSeq.collect({arg mSeq, m; mSeq[1..]}); - //ids = inSeq.collect({arg mSeq, m; mSeq[2]}); - sectionDurs = seq.collect({arg mSeq; mSeq.flatten2(mSeq.maxDepth - 5).flop[1].sum}); - pbinds = pbinds ++ - [ - Pbind( - \type, \osc, - \addr, addr, - \path, "/playing", - \msg, Pseq(msg, 1), - \dur, Pseq(sectionDurs, 1) - ); - ] - }); - res = Ppar(pbinds); - res -}; - -/* -genMidiPatterns = {arg seq; - var voices, durs, patterns, res, mOut, pbRange; - pbRange = 1; //semitones - change this as needed for your situation - mOut = MIDIOut.newByName("TiMidity", "TiMidity port 0").latency_(Server.default.latency); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - res = Ppar( - voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs; - - mOut.program(v, 70); - - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - - Pbind( - \type, \midi, - \chan, v, - \noteval, Pseq(freqs.cpsmidi - 24, 1), - \note, Pfunc({ | event | event[\noteval].floor }), - \dur, Pseq(fDurs, 1), - \midiout, mOut, - \amp, 1, - \bend, Pfunc({ - | event | - if (event[\note].isRest.not) { - var pitchbendvalue = event[\noteval].frac.linlin(0, pbRange, 8192, 8192*2).asInteger; - m.bend(v, pitchbendvalue); - }; - 0; // return something other than nil to avoid stopping the pattern - }), - ); - }); - ); - res -}; -*/ - - -//------resource management funcs - -genUID = {Date.seed.asHexString.toLower}; - -seedFunc = {arg func, seed; - var funcArgs, next; - next = Routine({loop{func.valueArray(funcArgs).yield }}); - next.randSeed_(seed); - {arg ...args; funcArgs = args; next.value} -}; - -stringifyToDepth = {arg data, maxDepth = 1; - var prettyString = "", rCount = 0, writeArray, indent; - - if(maxDepth == 0, { - data.asCompileString - }, { - indent = {arg size; size.collect({" "}).join("")}; - writeArray = {arg array; - prettyString = prettyString ++ indent.value(rCount) ++ "[\n"; - rCount = rCount + 1; - if(rCount < maxDepth, { - array.do({arg subArray; writeArray.value(subArray)}); - }, { - prettyString = prettyString ++ array.collect({arg subArray; - indent.value(rCount + 1) ++ subArray.asCompileString - }).join(",\n"); - }); - rCount = rCount - 1; - prettyString = prettyString ++ "\n" ++ indent.value(rCount) ++ "],\n"; - }; - - writeArray.value(data); - prettyString.replace(",\n\n", "\n").drop(-2); - }) -}; - -sanityCheck = {arg motif, index; - //print functions = very helpful - ("----------" + index + "------------").postln; - - motif.flatten.do({arg val, v; - if(v > 0, { - if(motif.flatten[v-1][0].hammingDistance(val[0]) > 1, {"problem 1".postln}); - if(motif.flatten[v-1][0].hammingDistance(val[0]) == 0, {"problem 2".postln}); - }); - val.postln - }); - "***********".postln; -}; - -msgInterpret = {arg in, escapeDoubleQuotes = true, escapeSingleQuotes = true; - var res; - - res = in; - if(res.isNil.not, { - if((res.isArray && res.isString.not), { - res = res.asCompileString; - res = res.replace(" ", "").replace("\n", "").replace("\t", ""); - if(escapeSingleQuotes, {res = res.replace("\'", "")}); - if(escapeDoubleQuotes, {res = res.replace("\"", "")}); - res = res.replace("Rest", "\"Rest\""); - res = res.interpret; - }, { - var tmpRes; - if(res.every({arg char; char.isDecDigit}), {tmpRes = res.asInteger}); - if(res.contains("."), {tmpRes = res.asFloat}); - if(tmpRes != nil, {res = tmpRes}); - }); - }); - res -}; - -writeResources = {arg path, dict; - var file, modelItems, resString; - file = File(path,"w"); - - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - - resString = nameSpaces.collect({arg nameSpace; - var depth = 0, insert = " "; - if(nameSpace == "music_data", {depth = 3; insert = "\n"}); - if(nameSpace == "last_changes", {depth = 1; insert = "\n"}); - if(nameSpace == "order", {depth = 1; insert = "\n"}); - if((nameSpace == "ref_uid") && (dict[nameSpace] == nil), {dict[nameSpace] = "nil"}); - "\"" ++ nameSpace ++ "\":" ++ insert ++ stringifyToDepth.value(dict[nameSpace], depth) - }).join(",\n"); - - resString = "{\n" ++ resString ++ "\n}"; - - file.write(resString); - file.close; - resString -}; - -loadModelFile = {arg path; loadModelJSON.value(File(path, "r").readAllString.parseJSON)}; - -loadModelJSON = {arg jsonObject; - var dict; - dict = Dictionary.with(*nameSpaces.collect({arg nS; nS->msgInterpret.value(jsonObject[nS])})); - dict -}; - -setGlobalVars = {arg dict, skipLastXChanges = false; - var tmpLastXChanges; - tmpLastXChanges = lastXChanges.deepCopy; - // order really matters!!!! - # seq, lastXChanges, curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited = nameSpaces.collect({arg nS; dict[nS]}); - if(skipLastXChanges, {lastXChanges = tmpLastXChanges}); - dict -}; - -globalVarsToDict = { - var modelItems, dict; - // order really matters!!!! - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - dict = Dictionary.with(*nameSpaces.collect({arg nS, n; nS->modelItems[n]})); -}; - -loadLedgerFile = {arg path; - ledgerPath = path; - resourceDir = path.splitext(".").drop(-1).join; - loadLedgerJSON.value(File(ledgerPath, "r").readAllString.parseJSON) -}; - -loadLedgerJSON = {arg jsonObject; ledger = jsonObject["ledger"]}; - -saveLedger = {arg ledger, path; - var file, curResourceDir; - file = File(path, "w"); - curResourceDir = resourceDir; - resourceDir = path.splitext(".").drop(-1).join; - if(curResourceDir != resourceDir, { - File.mkdir(resourceDir); - ledger.do({arg id; - File.copy(curResourceDir +/+ id, resourceDir +/+ id); - }); - }); - file.write("{\n\"ledger\":\n" ++ stringifyToDepth.value(ledger, 1) ++ "\n}"); - file.close; -}; - -//------global vars - -primes = [[2, 1], [3, 2], [5, 4], [7, 4], [11, 8], [13, 8]]; -//ranges = [[-2400, 0], [-1200, 1200], [0, 2400], [0, 2400]]; -exPath = thisProcess.nowExecutingPath; -dir = exPath.dirname; -//popSize = 4; -dims = primes.size; -tuples = genTuples.value(); -//refUID = nil; -group = Group.new; -~group = group; -loadLedgerFile.value(dir +/+ ".." +/+ "resources" +/+ "piece_ledger.json"); -resourceDir = (dir +/+ ".." +/+ "resources" +/+ "piece_ledger"); -//passagesWeights = [1, 1, 1, 1, 1]; -//susWeights = [1, 1, 1]; -// order really matters!!!! -nameSpaces = [ - "music_data", "last_changes", "cur_uid", "ref_uid", "order_seed", "dur_seed", "motifs_seed", - "entrances_probs_vals","passages_probs_vals", "exits_probs_vals", - "ranges", "step_probs_vals", "passages_weights", "hd_exp", "hd_invert", - "order", "sus_weights", "order_size", "passages_size", - "motif_edited", "order_edited" -]; - - -//------OSC funcs - -OSCdef(\load_ledger, {arg msg, time, addr, port; - loadLedgerFile.value(msg[1].asString); -}, \load_ledger); - -OSCdef(\load_model, {arg msg, time, addr, port; - var dict; - dict = loadModelFile.value(msg[1].asString); - setGlobalVars.value(dict); -}, \load_model); - -OSCdef(\save_ledger, {arg msg, time, addr, port; - msg.postln; - ledger = msgInterpret.value(msg[1].asString.parseJSON["ledger"], false).postln; - //loadLedgerJSON.value(msg[0]) - saveLedger.value(ledger, msg[2].asString); - //loadLedgerFile.value(msg[1].asString); -}, \save_ledger); - -OSCdef(\generate, {arg msg, time, addr, port; - var path, dict, durSeeds, musPath, modelString; - msg.postln; - - path = msg[1].asString; - - dict = loadModelFile.value(path); - setGlobalVars.value(dict, true); - - popSize = ranges.size; - - //refUID.postln; - - loadLedgerFile.value(ledgerPath); - if(ledger == nil, {ledger = ["tmp"]}); - if(ledger.last != "tmp", {ledger = ledger.add("tmp")}); - - if(refUID == nil, {lastXChanges = [initVoices.value().deepCopy]}); - if((refUID != nil) && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - lastXChanges = msgInterpret.value(file.readAllString.parseJSON["last_changes"]); - }); - - refUID.postln; - lastXChanges.collect({arg item; item.postln}); - - durSeeds = seedFunc.value({3.collect({rrand(100000, 999999)})}, durSeed).value.postln; - entrancesDurFunc = genDurFunc.valueArray(entrancesProbVals[..4] ++ [entrancesProbVals[5..]] ++ [durSeeds[0]]); - passagesDurFunc = genDurFunc.valueArray(passagesProbVals[..4] ++ [passagesProbVals[5..]] ++ [durSeeds[1]]); - exitsDurFunc = genDurFunc.valueArray(exitsProbVals[..4] ++ [exitsProbVals[5..]] ++ [durSeeds[2]]); - - if(orders == nil, { - orders = seedFunc.value(genOrders, orderSeed).valueArray(orderSize ++ passagesSize); - //addr.sendMsg("/order", stringifyToDepth.value(orders, 1)); - }); - - stepFunc = genStepFunc.valueArray(stepProbsVals[..1] ++ [stepProbsVals[2..]] ++ [motifSeed]); - seq = seedFunc.value(genMotif, motifSeed).value; - - lastXChanges.collect({arg item; item.postln}); - - dict = globalVarsToDict.value; - modelString = writeResources.value(path, dict); - - //addr.sendMsg("/generated", musPath, stringifyToDepth.value(seq, 3)); - //~seq = seq; - - addr.sendMsg("/generated", path, modelString, ledgerPath); -}, \generate); - - -OSCdef(\commit, {arg msg, time, addr, port; - var musicData, musicChanged, dict, newLedger, modelPath, musString, musFile, test1, test2, lastCurUID, commitType, commitPos, equalityLedger; - //msg.postln; - - /* - test1 = msg[1].asString.parseJSON; - test2 = (dir +/+ ".." +/+ "resources/tmp/tmp_music" ++ ".json").standardizePath.parseJSONFile; - msgInterpret.value(test1["music"])[0][0][0][1].class.postln; - msgInterpret.value(test2["music_data"])[0][0][0][1].class.postln; - (test1["music"] == test2["music_data"]).postln; - */ - - musicData = loadModelJSON.value(msg[1].asString.parseJSON)["music_data"].postln; - musicChanged = (musicData != seq).postln; - commitType = msg[2].asString; - commitPos = msg[3].postln.asInteger; - - lastCurUID = curUID.deepCopy; - curUID = genUID.value; - - File.mkdir((resourceDir +/+ curUID).standardizePath); - File.copy(exPath, (resourceDir +/+ curUID +/+ curUID ++ "_code" ++ ".scd").standardizePath); - - modelPath = (resourceDir +/+ curUID +/+ curUID ++ "_mus_model" ++ ".json").standardizePath; - dict = globalVarsToDict.value; - if(musicChanged, { - seq = musicData; - dict["music_data"] = seq; - dict["motif_edited"] = "true" - }); - dict["cur_uid"] = curUID; - - writeResources.value(modelPath, dict); - - File.delete(ledgerPath ++ "_bak"); - File.copy(ledgerPath, ledgerPath ++ "_bak"); - File.delete(ledgerPath); - - /* - if(commitType == "add", { - if(lastCurUID == "tmp", { - ledger = ledger.drop(-1).add(curUID); - }, { - ledger = ledger.add(curUID); - }) - }); - */ - - ledger.postln; - - if(commitType == "add", {ledger = ledger.add(curUID)}); - - if(commitType == "insert", {ledger = ledger.insert(commitPos + 1, curUID)}); - - if(commitType == "replace", {ledger = ledger.put(commitPos, curUID)}); - - equalityLedger = ledger.collect({arg item; item.asSymbol}); - if(equalityLedger.includes(\tmp).postln, {ledger.removeAt(equalityLedger.indexOf(\tmp).postln)}); - - ledger.postln; - - saveLedger.value(ledger, ledgerPath); - - addr.sendMsg("/committed", curUID, ledgerPath); - //refUID = curUID; - -}, \commit); - -OSCdef(\transport, {arg msg, time, addr, port; - msg.postln; - if(msg[1] == 0, { - group.set(\release, 2); - group.set(\gate, 0); - player.stop; - }, { - // the cued sequence can now be read from file, so this can be cleaned up - var cSize, patterns, pSeq, cuedSeek, indexStart, indexEnd, tmpLedger; - if(msg[1] == 1, { - pSeq = []; - cuedSeek = (seq != nil); - indexStart = msg[2].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.postln.parseJSON["music_data"]), path, indexStart + index, uid]); - file.close; - }); - }); - if(cuedSeek, { - var path, file; - path = (resourceDir +/+ "tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - patterns = genPatterns.value(pSeq, addr); - }, { - pSeq = [loadModelJSON.value(msg[2].asString.parseJSON)["music_data"].postln]; - patterns = genPatterns.value(pSeq, addr, true); - }); - player = Pfset(pattern: patterns, cleanupFunc: { - addr.sendMsg("/transport", 0); - addr.sendMsg("/one_shot", 0); - }); - player = player.play - }); -}, \transport); - - -OSCdef(\transcribe_motif, {arg msg, time, addr, port; - var tSeq, refChord, refUID; - - msg.postln; - - tSeq = [loadModelJSON.value(msg[1].asString.parseJSON)["music_data"]]; - refUID = msg[2].asString.postln; - - if((refUID != "nil") && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }, { - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - }); - - ~transcribe.value(tSeq, refChord, (dir +/+ ".." +/+ "lilypond" +/+ "includes").standardizePath, addr, "/transcribe_motif"); -}, \transcribe_motif); - - -OSCdef(\transcribe_all, {arg msg, time, addr, port; - var cSize, patterns, cuedSeek, indexStart, indexEnd, tmpLedger; - if(true, { - cuedSeek = (seq != nil); - indexStart = msg[1].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - - //tmp for testing transcription - //indexEnd = (indexStart+5); - - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - var lilyPartLedgerFiles; - - lilyPartLedgerFiles = 4.collect({arg p; - File((dir +/+ ".." +/+ "lilypond" +/+ "includes" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly").standardizePath, "w"); - }); - - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file, fileString, tSeq, refUID, refChord; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - fileString = file.readAllString; - tSeq = msgInterpret.value(fileString.parseJSON["music_data"]); - refUID = msgInterpret.value(fileString.parseJSON["ref_uid"]); - file.close; - - //uid.postln; - //(refUID == "nil").postln; - - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - - if(refUID != "nil", { - path = (resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }); - - if(index != indexEnd, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath); - }, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath, addr, "/transcribe_all"); - }); - - lilyPartLedgerFiles.do({arg f, p; - f.write("\\include \"" ++ resourceDir +/+ uid +/+ "lilypond" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly\"\n"); - }); - - }); - - lilyPartLedgerFiles.do({arg f; - f.close - }); - }); - /* - if(cuedSeek, { - var path, file; - path = (dir +/+ ".." +/+ "resources/tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - */ - }, { - - }); - -}, \transcribe_all); - -) - - diff --git a/resources/string_quartet_3/55bd25a1/55bd25a1_mus_model.json b/resources/string_quartet_3/55bd25a1/55bd25a1_mus_model.json deleted file mode 100644 index b0cec78..0000000 --- a/resources/string_quartet_3/55bd25a1/55bd25a1_mus_model.json +++ /dev/null @@ -1,548 +0,0 @@ -{ -"music_data": -[ - [ - [ - [ [ [ "Rest" ], [ 7, -5, -2, -1, -3, -2 ], [ "Rest" ], [ "Rest" ] ], 1.125 ], - [ [ [ "Rest" ], [ 7, -5, -2, -1, -3, -2 ], [ "Rest" ], [ 6, -6, -2, 0, -1, -2 ] ], 1.25 ], - [ [ [ 5, -5, -2, 0, -2, -2 ], [ 7, -5, -2, -1, -3, -2 ], [ "Rest" ], [ 6, -6, -2, 0, -1, -2 ] ], 1.25 ], - [ [ [ 5, -5, -2, 0, -2, -2 ], [ 7, -5, -2, -1, -3, -2 ], [ 6, -5, -2, 0, -1, -2 ], [ 6, -6, -2, 0, -1, -2 ] ], 1.5 ] - ], - [ - [ [ [ 5, -5, -2, 0, -2, -2 ], [ 6, -6, -2, 0, -2, -2 ], [ 6, -5, -2, 0, -1, -2 ], [ 6, -6, -2, 0, -1, -2 ] ], 0.625 ], - [ [ [ 5, -5, -2, 0, -2, -2 ], [ 6, -6, -2, 0, -2, -2 ], [ 6, -4, -2, 0, -2, -2 ], [ 6, -6, -2, 0, -1, -2 ] ], 0.5 ] - ], - [ - [ [ [ 4, -3, -2, 0, -2, -2 ], [ 6, -6, -2, 0, -2, -2 ], [ 6, -4, -2, 0, -2, -2 ], [ 6, -6, -2, 0, -1, -2 ] ], 0.625 ], - [ [ [ 4, -3, -2, 0, -2, -2 ], [ 5, -4, -2, 0, -2, -2 ], [ 6, -4, -2, 0, -2, -2 ], [ 6, -6, -2, 0, -1, -2 ] ], 1 ] - ], - [ - [ [ [ 4, -3, -2, 0, -2, -2 ], [ 5, -4, -2, 0, -2, -2 ], [ 7, -4, -2, -1, -2, -2 ], [ 6, -6, -2, 0, -1, -2 ] ], 1 ], - [ [ [ 5, -4, -3, 0, -2, -2 ], [ 5, -4, -2, 0, -2, -2 ], [ 7, -4, -2, -1, -2, -2 ], [ 6, -6, -2, 0, -1, -2 ] ], 0.75 ], - [ [ [ 5, -4, -3, 0, -2, -2 ], [ 5, -4, -2, 0, -2, -2 ], [ 7, -4, -2, -1, -2, -2 ], [ 6, -5, -2, 0, -2, -2 ] ], 0.5 ] - ], - [ - [ [ [ 6, -6, -2, 0, -2, -2 ], [ 5, -4, -2, 0, -2, -2 ], [ 7, -4, -2, -1, -2, -2 ], [ 6, -5, -2, 0, -2, -2 ] ], 0.625 ], - [ [ [ 6, -6, -2, 0, -2, -2 ], [ 6, -5, -3, 0, -2, -2 ], [ 7, -4, -2, -1, -2, -2 ], [ 6, -5, -2, 0, -2, -2 ] ], 1.25 ], - [ [ [ 6, -6, -2, 0, -2, -2 ], [ 6, -5, -3, 0, -2, -2 ], [ 7, -5, -3, 0, -2, -2 ], [ 6, -5, -2, 0, -2, -2 ] ], 1.5 ] - ], - [ - [ [ [ 6, -6, -2, 0, -2, -2 ], [ 6, -5, -3, 0, -2, -2 ], [ 6, -5, -2, 1, -2, -2 ], [ 6, -5, -2, 0, -2, -2 ] ], 0.625 ] - ], - [ - [ [ [ 6, -5, -2, 0, -3, -2 ], [ 6, -5, -3, 0, -2, -2 ], [ 6, -5, -2, 1, -2, -2 ], [ 6, -5, -2, 0, -2, -2 ] ], 0.5 ], - [ [ [ 6, -5, -2, 0, -3, -2 ], [ 5, -5, -2, 1, -2, -2 ], [ 6, -5, -2, 1, -2, -2 ], [ 6, -5, -2, 0, -2, -2 ] ], 0.75 ], - [ [ [ 6, -5, -2, 0, -3, -2 ], [ 5, -5, -2, 1, -2, -2 ], [ 6, -4, -2, 0, -2, -2 ], [ 6, -5, -2, 0, -2, -2 ] ], 0.75 ] - ], - [ - [ [ [ 5, -5, -1, 0, -2, -2 ], [ 5, -5, -2, 1, -2, -2 ], [ 6, -4, -2, 0, -2, -2 ], [ 6, -5, -2, 0, -2, -2 ] ], 0.875 ], - [ [ [ 5, -5, -1, 0, -2, -2 ], [ 5, -4, -2, 0, -2, -2 ], [ 6, -4, -2, 0, -2, -2 ], [ 6, -5, -2, 0, -2, -2 ] ], 0.875 ], - [ [ [ 5, -5, -1, 0, -2, -2 ], [ 5, -4, -2, 0, -2, -2 ], [ 6, -5, -2, 0, -2, -1 ], [ 6, -5, -2, 0, -2, -2 ] ], 0.875 ] - ], - [ - [ [ [ 5, -5, -1, 0, -2, -2 ], [ 5, -4, -2, 0, -2, -2 ], [ 6, -5, -2, 0, -2, -1 ], [ 5, -5, -1, 1, -2, -2 ] ], 1.625 ], - [ [ [ 5, -5, -1, 0, -2, -2 ], [ 6, -6, -1, 0, -2, -2 ], [ 6, -5, -2, 0, -2, -1 ], [ 5, -5, -1, 1, -2, -2 ] ], 0.75 ] - ], - [ - [ [ [ 5, -5, -1, 0, -2, -2 ], [ 6, -6, -1, 0, -2, -2 ], [ 6, -5, -2, 0, -2, -1 ], [ 6, -5, -1, 0, -2, -2 ] ], 1.75 ] - ], - [ - [ [ [ 5, -5, -1, 0, -2, -2 ], [ 5, -4, -1, 0, -2, -2 ], [ 6, -5, -2, 0, -2, -1 ], [ 6, -5, -1, 0, -2, -2 ] ], 1.75 ], - [ [ [ 6, -5, -1, -1, -2, -2 ], [ 5, -4, -1, 0, -2, -2 ], [ 6, -5, -2, 0, -2, -1 ], [ 6, -5, -1, 0, -2, -2 ] ], 1.125 ], - [ [ [ 6, -5, -1, -1, -2, -2 ], [ 5, -4, -1, 0, -2, -2 ], [ 6, -4, -1, 0, -2, -2 ], [ 6, -5, -1, 0, -2, -2 ] ], 1.75 ] - ], - [ - [ [ [ 5, -4, -2, 0, -2, -2 ], [ 5, -4, -1, 0, -2, -2 ], [ 6, -4, -1, 0, -2, -2 ], [ 6, -5, -1, 0, -2, -2 ] ], 0.875 ], - [ [ [ 5, -4, -2, 0, -2, -2 ], [ 5, -4, -1, 0, -2, -2 ], [ 6, -4, -1, 0, -2, -2 ], [ 5, -3, -1, 0, -2, -2 ] ], 1.25 ], - [ [ [ 5, -4, -2, 0, -2, -2 ], [ 6, -4, -1, -1, -2, -2 ], [ 6, -4, -1, 0, -2, -2 ], [ 5, -3, -1, 0, -2, -2 ] ], 1 ] - ], - [ - [ [ [ 5, -5, -1, 0, -2, -2 ], [ 6, -4, -1, -1, -2, -2 ], [ 6, -4, -1, 0, -2, -2 ], [ 5, -3, -1, 0, -2, -2 ] ], 1.25 ] - ], - [ - [ [ [ 4, -3, -1, 0, -2, -2 ], [ 6, -4, -1, -1, -2, -2 ], [ 6, -4, -1, 0, -2, -2 ], [ 5, -3, -1, 0, -2, -2 ] ], 1.5 ], - [ [ [ 4, -3, -1, 0, -2, -2 ], [ 6, -4, -1, -1, -2, -2 ], [ 6, -4, -1, 0, -2, -2 ], [ 6, -4, -2, 0, -2, -2 ] ], 0.75 ] - ], - [ - [ [ [ 4, -3, -1, 0, -2, -2 ], [ 6, -4, -1, 0, -2, -3 ], [ 6, -4, -1, 0, -2, -2 ], [ 6, -4, -2, 0, -2, -2 ] ], 1.375 ] - ], - [ - [ [ [ 4, -3, -1, 0, -2, -2 ], [ 6, -4, -1, 0, -2, -3 ], [ 6, -4, -1, 0, -2, -2 ], [ 4, -4, -1, 1, -2, -2 ] ], 0.75 ], - [ [ [ 5, -4, -2, 0, -2, -2 ], [ 6, -4, -1, 0, -2, -3 ], [ 6, -4, -1, 0, -2, -2 ], [ 4, -4, -1, 1, -2, -2 ] ], 1.375 ], - [ [ [ 5, -4, -2, 0, -2, -2 ], [ 6, -5, -1, 0, -2, -2 ], [ 6, -4, -1, 0, -2, -2 ], [ 4, -4, -1, 1, -2, -2 ] ], 0.375 ] - ], - [ - [ [ [ 4, -4, -1, 1, -3, -2 ], [ 6, -5, -1, 0, -2, -2 ], [ 6, -4, -1, 0, -2, -2 ], [ 4, -4, -1, 1, -2, -2 ] ], 0.5 ], - [ [ [ 4, -4, -1, 1, -3, -2 ], [ 4, -4, -1, 1, -2, -1 ], [ 6, -4, -1, 0, -2, -2 ], [ 4, -4, -1, 1, -2, -2 ] ], 1.625 ], - [ [ [ 4, -4, -1, 1, -3, -2 ], [ 4, -4, -1, 1, -2, -1 ], [ 5, -4, -1, 1, -2, -2 ], [ 4, -4, -1, 1, -2, -2 ] ], 1.5 ] - ], - [ - [ [ [ 4, -4, -1, 1, -3, -2 ], [ 4, -4, -1, 1, -2, -1 ], [ 5, -4, -1, 1, -2, -2 ], [ 5, -4, -1, 0, -2, -2 ] ], 1.25 ], - [ [ [ 4, -4, -1, 1, -3, -2 ], [ 4, -4, -1, 1, -2, -2 ], [ 5, -4, -1, 1, -2, -2 ], [ 5, -4, -1, 0, -2, -2 ] ], 1.625 ], - [ [ [ 4, -4, -2, 1, -2, -2 ], [ 4, -4, -1, 1, -2, -2 ], [ 5, -4, -1, 1, -2, -2 ], [ 5, -4, -1, 0, -2, -2 ] ], 0.5 ] - ], - [ - [ [ [ 4, -4, -2, 1, -2, -2 ], [ 4, -4, -1, 1, -2, -2 ], [ 6, -4, -2, 0, -2, -2 ], [ 5, -4, -1, 0, -2, -2 ] ], 0.875 ], - [ [ [ 4, -4, -2, 1, -2, -2 ], [ 4, -4, -1, 1, -2, -2 ], [ 6, -4, -2, 0, -2, -2 ], [ 4, -4, 0, 1, -2, -2 ] ], 0.875 ] - ], - [ - [ [ [ 4, -4, -2, 1, -2, -2 ], [ 4, -4, -1, 1, -2, -2 ], [ 4, -4, 0, 1, -2, -1 ], [ 4, -4, 0, 1, -2, -2 ] ], 1.75 ], - [ [ [ 3, -4, -1, 2, -2, -2 ], [ 4, -4, -1, 1, -2, -2 ], [ 4, -4, 0, 1, -2, -1 ], [ 4, -4, 0, 1, -2, -2 ] ], 1.625 ] - ], - [ - [ [ [ 3, -4, -1, 2, -2, -2 ], [ 4, -4, -1, 1, -2, -2 ], [ 4, -4, 0, 1, -2, -1 ], [ 3, -4, -1, 2, -2, -1 ] ], 1.375 ], - [ [ [ 3, -4, -1, 2, -2, -2 ], [ 3, -4, 0, 2, -2, -2 ], [ 4, -4, 0, 1, -2, -1 ], [ 3, -4, -1, 2, -2, -1 ] ], 1.625 ], - [ [ [ 3, -4, -1, 2, -2, -2 ], [ 3, -4, 0, 2, -2, -2 ], [ 4, -4, 0, 2, -2, -2 ], [ 3, -4, -1, 2, -2, -1 ] ], 1.5 ] - ], - [ - [ [ [ 3, -5, -1, 2, -2, -1 ], [ 3, -4, 0, 2, -2, -2 ], [ 4, -4, 0, 2, -2, -2 ], [ 3, -4, -1, 2, -2, -1 ] ], 1 ], - [ [ [ 3, -5, -1, 2, -2, -1 ], [ 2, -4, -1, 2, -2, 0 ], [ 4, -4, 0, 2, -2, -2 ], [ 3, -4, -1, 2, -2, -1 ] ], 1.25 ] - ], - [ - [ [ [ 2, -4, 0, 2, -1, -2 ], [ 2, -4, -1, 2, -2, 0 ], [ 4, -4, 0, 2, -2, -2 ], [ 3, -4, -1, 2, -2, -1 ] ], 1.25 ], - [ [ [ 2, -4, 0, 2, -1, -2 ], [ 2, -4, 0, 2, -2, -1 ], [ 4, -4, 0, 2, -2, -2 ], [ 3, -4, -1, 2, -2, -1 ] ], 0.875 ] - ], - [ - [ [ [ 2, -4, 0, 2, -1, -2 ], [ 2, -4, 0, 2, -2, -1 ], [ 4, -5, 0, 2, -2, -1 ], [ 3, -4, -1, 2, -2, -1 ] ], 1.75 ], - [ [ [ 2, -4, 0, 2, -1, -2 ], [ 2, -4, 0, 2, -2, -1 ], [ 4, -5, 0, 2, -2, -1 ], [ 2, -4, 0, 3, -2, -1 ] ], 1.5 ] - ], - [ - [ [ [ 2, -4, 0, 2, -1, -2 ], [ 2, -5, 0, 2, -2, 0 ], [ 4, -5, 0, 2, -2, -1 ], [ 2, -4, 0, 3, -2, -1 ] ], 0.625 ], - [ [ [ 2, -4, 0, 2, -1, -2 ], [ 2, -5, 0, 2, -2, 0 ], [ 4, -5, 0, 2, -2, -1 ], [ 3, -4, 0, 2, -2, -1 ] ], 1.25 ] - ], - [ - [ [ [ 2, -4, 0, 2, -1, -2 ], [ 3, -4, 0, 2, -2, -2 ], [ 4, -5, 0, 2, -2, -1 ], [ 3, -4, 0, 2, -2, -1 ] ], 0.625 ], - [ [ [ 2, -4, 0, 2, -1, -2 ], [ 3, -4, 0, 2, -2, -2 ], [ 4, -5, 0, 2, -2, -1 ], [ 4, -5, 0, 2, -1, -2 ] ], 1.625 ] - ], - [ - [ [ [ 2, -4, 0, 2, -1, -2 ], [ 3, -4, 0, 2, -2, -2 ], [ 4, -5, 0, 2, -2, -1 ], [ 4, -4, 0, 2, -2, -2 ] ], 1.5 ], - [ [ [ 2, -4, 0, 2, -1, -2 ], [ 3, -4, 0, 2, -2, -2 ], [ 3, -4, 0, 2, -2, -1 ], [ 4, -4, 0, 2, -2, -2 ] ], 1.5 ] - ], - [ - [ [ [ 2, -4, 0, 2, -1, -2 ], [ 3, -4, -1, 2, -1, -2 ], [ 3, -4, 0, 2, -2, -1 ], [ 4, -4, 0, 2, -2, -2 ] ], 1.625 ], - [ [ [ 2, -4, 0, 2, -1, -2 ], [ 3, -4, -1, 2, -1, -2 ], [ 4, -5, 0, 2, -1, -2 ], [ 4, -4, 0, 2, -2, -2 ] ], 1.25 ], - [ [ [ 2, -4, 0, 2, -1, -2 ], [ 3, -4, -1, 2, -1, -2 ], [ 4, -5, 0, 2, -1, -2 ], [ 4, -4, 0, 1, -1, -2 ] ], 1.75 ] - ], - [ - [ [ [ 2, -4, 0, 2, -1, -2 ], [ 3, -4, -1, 2, -1, -2 ], [ 3, -3, 0, 2, -1, -2 ], [ 4, -4, 0, 1, -1, -2 ] ], 0.75 ], - [ [ [ 2, -4, 0, 2, -1, -2 ], [ 3, -4, -1, 2, -1, -2 ], [ 3, -3, 0, 2, -1, -2 ], [ 3, -4, 1, 2, -1, -2 ] ], 1.5 ], - [ [ [ 2, -4, 0, 2, -1, -2 ], [ 2, -4, 0, 3, -1, -2 ], [ 3, -3, 0, 2, -1, -2 ], [ 3, -4, 1, 2, -1, -2 ] ], 1 ] - ], - [ - [ [ [ 2, -4, 0, 2, -1, -2 ], [ 2, -4, 0, 3, -1, -2 ], [ 2, -3, 0, 3, -1, -2 ], [ 3, -4, 1, 2, -1, -2 ] ], 1.625 ] - ], - [ - [ [ [ 1, -4, 1, 3, -1, -2 ], [ 2, -4, 0, 3, -1, -2 ], [ 2, -3, 0, 3, -1, -2 ], [ 3, -4, 1, 2, -1, -2 ] ], 1.25 ], - [ [ [ 1, -4, 1, 3, -1, -2 ], [ 2, -4, 0, 3, -1, -2 ], [ 4, -4, 1, 1, -1, -2 ], [ 3, -4, 1, 2, -1, -2 ] ], 0.5 ], - [ [ [ 1, -4, 1, 3, -1, -2 ], [ 2, -3, 1, 2, -1, -2 ], [ 4, -4, 1, 1, -1, -2 ], [ 3, -4, 1, 2, -1, -2 ] ], 1 ] - ], - [ - [ [ [ 1, -4, 1, 3, -1, -2 ], [ 2, -3, 1, 2, -1, -2 ], [ 4, -4, 1, 1, -1, -2 ], [ 2, -2, 1, 2, -1, -2 ] ], 1.5 ], - [ [ [ 1, -4, 1, 3, -1, -2 ], [ 2, -3, 1, 2, -1, -2 ], [ 3, -4, 1, 2, -1, -2 ], [ 2, -2, 1, 2, -1, -2 ] ], 1.125 ] - ], - [ - [ [ [ 1, -4, 1, 3, -1, -2 ], [ 2, -3, 1, 2, -1, -2 ], [ 3, -5, 1, 3, -1, -2 ], [ 2, -2, 1, 2, -1, -2 ] ], 1.125 ] - ], - [ - [ [ [ 1, -4, 1, 3, -1, -2 ], [ 2, -3, 1, 2, -1, -2 ], [ 1, -2, 1, 3, -1, -2 ], [ 2, -2, 1, 2, -1, -2 ] ], 1 ] - ], - [ - [ [ [ 1, -4, 1, 3, -1, -2 ], [ 2, -3, 1, 2, -1, -2 ], [ 2, -4, 2, 3, -1, -2 ], [ 2, -2, 1, 2, -1, -2 ] ], 1.25 ], - [ [ [ 1, -4, 1, 3, -1, -2 ], [ 2, -3, 1, 2, -1, -2 ], [ 2, -4, 2, 3, -1, -2 ], [ 3, -3, 0, 2, -1, -2 ] ], 0.875 ] - ], - [ - [ [ [ 1, -4, 1, 3, -1, -2 ], [ 2, -4, 1, 2, -1, -2 ], [ 2, -4, 2, 3, -1, -2 ], [ 3, -3, 0, 2, -1, -2 ] ], 0.875 ], - [ [ [ 1, -4, 1, 3, -1, -2 ], [ 2, -4, 1, 2, -1, -2 ], [ 3, -4, 1, 2, -1, -2 ], [ 3, -3, 0, 2, -1, -2 ] ], 0.5 ], - [ [ [ 1, -4, 1, 3, -1, -2 ], [ 2, -4, 1, 2, -1, -2 ], [ 3, -4, 1, 2, -1, -2 ], [ 2, -4, 2, 3, -1, -2 ] ], 1.25 ] - ], - [ - [ [ [ 1, -4, 1, 3, -1, -2 ], [ 2, -4, 1, 2, -1, -2 ], [ 3, -4, 1, 2, -1, -2 ], [ 4, -4, 1, 1, -1, -2 ] ], 0.5 ] - ], - [ - [ [ [ 1, -4, 1, 3, -1, -2 ], [ 3, -4, 1, 1, -1, -2 ], [ 3, -4, 1, 2, -1, -2 ], [ 4, -4, 1, 1, -1, -2 ] ], 1.625 ], - [ [ [ 2, -4, 1, 2, -1, -2 ], [ 3, -4, 1, 1, -1, -2 ], [ 3, -4, 1, 2, -1, -2 ], [ 4, -4, 1, 1, -1, -2 ] ], 1.25 ], - [ [ [ 2, -4, 1, 2, -1, -2 ], [ 3, -4, 1, 1, -1, -2 ], [ 3, -4, 1, 2, -1, -2 ], [ 1, -4, 1, 2, -1, -1 ] ], 0.625 ] - ], - [ - [ [ [ 2, -4, 1, 2, -1, -2 ], [ 3, -4, 1, 1, -1, -2 ], [ 3, -4, 1, 2, -1, -2 ], [ 3, -4, 0, 1, -1, -2 ] ], 1 ] - ], - [ - [ [ [ 2, -4, 0, 2, -1, -2 ], [ 3, -4, 1, 1, -1, -2 ], [ 3, -4, 1, 2, -1, -2 ], [ 3, -4, 0, 1, -1, -2 ] ], 1.125 ] - ], - [ - [ [ [ 2, -4, 0, 2, -1, -2 ], [ 3, -4, 1, 1, -1, -2 ], [ 4, -4, 1, 1, -1, -2 ], [ 3, -4, 0, 1, -1, -2 ] ], 1 ] - ], - [ - [ [ [ 2, -4, 0, 2, -1, -2 ], [ 3, -4, 1, 1, -1, -2 ], [ 4, -4, 1, 1, -1, -2 ], [ 2, -4, 1, 2, -1, -2 ] ], 1.625 ], - [ [ [ 2, -4, 0, 2, -1, -2 ], [ 2, -3, 0, 2, -1, -2 ], [ 4, -4, 1, 1, -1, -2 ], [ 2, -4, 1, 2, -1, -2 ] ], 1.625 ], - [ [ [ 2, -4, 0, 2, -1, -2 ], [ 2, -3, 0, 2, -1, -2 ], [ 3, -3, 0, 2, -1, -2 ], [ 2, -4, 1, 2, -1, -2 ] ], 1.375 ] - ], - [ - [ [ [ 1, -2, 0, 2, -1, -2 ], [ 2, -3, 0, 2, -1, -2 ], [ 3, -3, 0, 2, -1, -2 ], [ 2, -4, 1, 2, -1, -2 ] ], 0.625 ], - [ [ [ 1, -2, 0, 2, -1, -2 ], [ 2, -3, 0, 2, -1, -2 ], [ 2, -3, 0, 2, -1, -1 ], [ 2, -4, 1, 2, -1, -2 ] ], 1.375 ] - ], - [ - [ [ [ 1, -2, 0, 2, -1, -2 ], [ 2, -3, 0, 2, -1, -2 ], [ 2, -3, 0, 2, -1, -1 ], [ 2, -2, 0, 2, -1, -3 ] ], 1.375 ], - [ [ [ 1, -2, 0, 2, -1, -2 ], [ 1, -1, 0, 2, -1, -2 ], [ 2, -3, 0, 2, -1, -1 ], [ 2, -2, 0, 2, -1, -3 ] ], 1.375 ] - ], - [ - [ [ [ 0, 0, 0, 2, -1, -2 ], [ 1, -1, 0, 2, -1, -2 ], [ 2, -3, 0, 2, -1, -1 ], [ 2, -2, 0, 2, -1, -3 ] ], 1.25 ], - [ [ [ 0, 0, 0, 2, -1, -2 ], [ 1, -1, 0, 2, -1, -2 ], [ 2, -1, -1, 2, -1, -2 ], [ 2, -2, 0, 2, -1, -3 ] ], 1 ] - ], - [ - [ [ [ 2, -2, -1, 2, -1, -3 ], [ 1, -1, 0, 2, -1, -2 ], [ 2, -1, -1, 2, -1, -2 ], [ 2, -2, 0, 2, -1, -3 ] ], 1.75 ], - [ [ [ 2, -2, -1, 2, -1, -3 ], [ 2, -2, -1, 2, -1, -2 ], [ 2, -1, -1, 2, -1, -2 ], [ 2, -2, 0, 2, -1, -3 ] ], 0.625 ] - ], - [ - [ [ [ 2, -2, -1, 2, -1, -3 ], [ 2, -2, -1, 2, -1, -2 ], [ 2, -1, -1, 2, -1, -2 ], [ 1, -1, -2, 2, -1, -2 ] ], 0.5 ], - [ [ [ 2, -3, -1, 2, -1, -2 ], [ 2, -2, -1, 2, -1, -2 ], [ 2, -1, -1, 2, -1, -2 ], [ 1, -1, -2, 2, -1, -2 ] ], 0.875 ] - ], - [ - [ [ [ 2, -3, -1, 2, -1, -2 ], [ 2, -2, -1, 2, -1, -2 ], [ 3, -2, -2, 2, -1, -2 ], [ 1, -1, -2, 2, -1, -2 ] ], 0.875 ] - ], - [ - [ [ [ 2, -3, -1, 2, -1, -2 ], [ 2, -2, -1, 2, -1, -2 ], [ 3, -2, -2, 2, -1, -2 ], [ 2, -2, -3, 2, -1, -2 ] ], 1.125 ], - [ [ [ 2, -3, -2, 2, -1, -2 ], [ 2, -2, -1, 2, -1, -2 ], [ 3, -2, -2, 2, -1, -2 ], [ 2, -2, -3, 2, -1, -2 ] ], 0.5 ] - ], - [ - [ [ [ 2, -3, -2, 2, -1, -2 ], [ 2, -2, -1, 2, -1, -2 ], [ 2, -2, -1, 3, -1, -2 ], [ 2, -2, -3, 2, -1, -2 ] ], 0.875 ], - [ [ [ 2, -3, -2, 2, -1, -2 ], [ 2, -2, -1, 2, -1, -2 ], [ 2, -2, -1, 3, -1, -2 ], [ 2, -2, -1, 2, -2, -2 ] ], 0.875 ], - [ [ [ 2, -2, -1, 1, -1, -2 ], [ 2, -2, -1, 2, -1, -2 ], [ 2, -2, -1, 3, -1, -2 ], [ 2, -2, -1, 2, -2, -2 ] ], 1.375 ] - ], - [ - [ [ [ 2, -2, -1, 2, -1, -3 ], [ 2, -2, -1, 2, -1, -2 ], [ 2, -2, -1, 3, -1, -2 ], [ 2, -2, -1, 2, -2, -2 ] ], 0.875 ] - ], - [ - [ [ [ 2, -2, -1, 2, -1, -3 ], [ 2, -1, -1, 2, -2, -2 ], [ 2, -2, -1, 3, -1, -2 ], [ 2, -2, -1, 2, -2, -2 ] ], 0.875 ] - ], - [ - [ [ [ 2, -2, -1, 2, -1, -3 ], [ 2, -1, -1, 2, -2, -2 ], [ 3, -2, -1, 2, -2, -2 ], [ 2, -2, -1, 2, -2, -2 ] ], 1.75 ] - ], - [ - [ [ [ 2, -2, -1, 2, -1, -3 ], [ 2, -1, -1, 2, -2, -2 ], [ 4, -2, -1, 1, -2, -2 ], [ 2, -2, -1, 2, -2, -2 ] ], 0.875 ], - [ [ [ 2, -2, -1, 2, -1, -3 ], [ 1, -2, -1, 2, -2, -1 ], [ 4, -2, -1, 1, -2, -2 ], [ 2, -2, -1, 2, -2, -2 ] ], 1.5 ] - ], - [ - [ [ [ 2, -2, -1, 2, -1, -3 ], [ 1, -2, -1, 2, -2, -1 ], [ 4, -2, -1, 1, -2, -2 ], [ 1, -2, -1, 2, -1, -1 ] ], 1.625 ], - [ [ [ 2, -2, -1, 1, -2, -1 ], [ 1, -2, -1, 2, -2, -1 ], [ 4, -2, -1, 1, -2, -2 ], [ 1, -2, -1, 2, -1, -1 ] ], 0.625 ], - [ [ [ 2, -2, -1, 1, -2, -1 ], [ 1, -2, -1, 2, -2, -1 ], [ 3, -2, -1, 1, -2, -1 ], [ 1, -2, -1, 2, -1, -1 ] ], 0.875 ] - ], - [ - [ [ [ 2, -2, -1, 1, -2, -1 ], [ 1, -2, -1, 2, -2, -1 ], [ 4, -2, -1, 0, -2, -1 ], [ 1, -2, -1, 2, -1, -1 ] ], 0.625 ], - [ [ [ 2, -2, -1, 1, -2, -1 ], [ 1, -2, -1, 2, -2, -1 ], [ 4, -2, -1, 0, -2, -1 ], [ 3, -3, -1, 1, -2, -1 ] ], 1.75 ], - [ [ [ 2, -2, -1, 1, -2, -1 ], [ 1, -2, -1, 1, -2, 0 ], [ 4, -2, -1, 0, -2, -1 ], [ 3, -3, -1, 1, -2, -1 ] ], 1.25 ] - ], - [ - [ [ [ 2, -2, -1, 1, -2, -1 ], [ 1, -2, -1, 1, -2, 0 ], [ 4, -2, -1, 0, -2, -1 ], [ 3, -2, 0, 0, -2, -1 ] ], 1.375 ] - ], - [ - [ [ [ 2, -2, -1, 0, -2, 0 ], [ 1, -2, -1, 1, -2, 0 ], [ 4, -2, -1, 0, -2, -1 ], [ 3, -2, 0, 0, -2, -1 ] ], 1.875 ], - [ [ [ 2, -2, -1, 0, -2, 0 ], [ 1, -2, -1, 1, -2, 0 ], [ 4, -2, -1, 0, -2, -1 ], [ 2, -2, -1, 1, -2, 0 ] ], 0.5 ], - [ [ [ 2, -2, -1, 0, -2, 0 ], [ 1, -2, -1, 1, -2, 0 ], [ 2, -1, -1, 1, -2, 0 ], [ 2, -2, -1, 1, -2, 0 ] ], 0.875 ] - ], - [ - [ [ [ 2, -2, -1, 0, -2, 0 ], [ 0, 0, -1, 1, -2, 0 ], [ 2, -1, -1, 1, -2, 0 ], [ 2, -2, -1, 1, -2, 0 ] ], 1.625 ], - [ [ [ 1, -1, -2, 1, -2, 0 ], [ 0, 0, -1, 1, -2, 0 ], [ 2, -1, -1, 1, -2, 0 ], [ 2, -2, -1, 1, -2, 0 ] ], 1.625 ] - ], - [ - [ [ [ 1, -1, -2, 1, -2, 0 ], [ 1, -2, 0, 1, -2, 0 ], [ 2, -1, -1, 1, -2, 0 ], [ 2, -2, -1, 1, -2, 0 ] ], 1.5 ] - ], - [ - [ [ [ 1, -1, -2, 1, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ], [ 2, -1, -1, 1, -2, 0 ], [ 2, -2, -1, 1, -2, 0 ] ], 0.375 ], - [ [ [ 1, -1, -2, 1, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ], [ 2, -1, -1, 1, -2, 0 ], [ 1, 0, -1, 1, -2, 0 ] ], 1.375 ], - [ [ [ 1, -2, -1, 1, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ], [ 2, -1, -1, 1, -2, 0 ], [ 1, 0, -1, 1, -2, 0 ] ], 1 ] - ], - [ - [ [ [ 0, 0, -1, 1, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ], [ 2, -1, -1, 1, -2, 0 ], [ 1, 0, -1, 1, -2, 0 ] ], 0.5 ] - ], - [ - [ [ [ 0, 0, -1, 1, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ], [ 1, -1, -1, 2, -2, 0 ], [ 1, 0, -1, 1, -2, 0 ] ], 1.125 ] - ], - [ - [ [ [ 0, 0, -1, 1, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ], [ 2, -1, -1, 1, -2, 0 ], [ 1, 0, -1, 1, -2, 0 ] ], 0.875 ], - [ [ [ -1, 0, -1, 2, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ], [ 2, -1, -1, 1, -2, 0 ], [ 1, 0, -1, 1, -2, 0 ] ], 1 ], - [ [ [ -1, 0, -1, 2, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ], [ 2, -1, -1, 1, -2, 0 ], [ 1, -1, -1, 2, -2, 0 ] ], 1.125 ] - ], - [ - [ [ [ -1, 0, -1, 2, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ], [ 2, -1, -1, 1, -2, 0 ], [ 0, -1, -1, 3, -2, 0 ] ], 0.875 ], - [ [ [ 0, -1, -2, 2, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ], [ 2, -1, -1, 1, -2, 0 ], [ 0, -1, -1, 3, -2, 0 ] ], 1.625 ] - ], - [ - [ [ [ 1, -1, -2, 1, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ], [ 2, -1, -1, 1, -2, 0 ], [ 0, -1, -1, 3, -2, 0 ] ], 0.5 ] - ], - [ - [ [ [ 1, -1, -2, 1, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ], [ 1, -1, -1, 2, -2, 0 ], [ 0, -1, -1, 3, -2, 0 ] ], 0.5 ], - [ [ [ 1, -1, -2, 1, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ], [ 1, -1, -1, 2, -2, 0 ], [ 2, -1, -1, 1, -2, 0 ] ], 0.75 ], - [ [ [ -1, -1, -1, 2, -2, 1 ], [ 0, -1, -1, 2, -2, 0 ], [ 1, -1, -1, 2, -2, 0 ], [ 2, -1, -1, 1, -2, 0 ] ], 0.5 ] - ], - [ - [ [ [ -1, -1, -1, 2, -2, 1 ], [ 0, -1, -1, 2, -2, 0 ], [ 1, -1, -1, 1, -2, 1 ], [ 2, -1, -1, 1, -2, 0 ] ], 1.75 ], - [ [ [ -1, -1, -1, 2, -2, 1 ], [ 1, -1, -1, 1, -2, 0 ], [ 1, -1, -1, 1, -2, 1 ], [ 2, -1, -1, 1, -2, 0 ] ], 0.875 ], - [ [ [ 0, 0, -1, 1, -2, 0 ], [ 1, -1, -1, 1, -2, 0 ], [ 1, -1, -1, 1, -2, 1 ], [ 2, -1, -1, 1, -2, 0 ] ], 0.5 ] - ], - [ - [ [ [ 0, 0, -1, 1, -2, 0 ], [ 1, -1, -1, 1, -2, 0 ], [ 1, -1, -1, 1, -2, 1 ], [ 0, -1, -1, 2, -2, 0 ] ], 1.375 ], - [ [ [ 0, -1, -1, 1, -2, 1 ], [ 1, -1, -1, 1, -2, 0 ], [ 1, -1, -1, 1, -2, 1 ], [ 0, -1, -1, 2, -2, 0 ] ], 1.25 ] - ], - [ - [ [ [ 1, -2, -1, 1, -2, 0 ], [ 1, -1, -1, 1, -2, 0 ], [ 1, -1, -1, 1, -2, 1 ], [ 0, -1, -1, 2, -2, 0 ] ], 1.625 ] - ], - [ - [ [ [ 1, -2, -1, 1, -2, 0 ], [ 1, -1, -1, 1, -2, 0 ], [ 1, -1, -1, 2, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ] ], 0.75 ] - ], - [ - [ [ [ 1, -2, -1, 1, -2, 0 ], [ 1, -1, -1, 1, -2, 0 ], [ 2, -1, -1, 1, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ] ], 1.5 ], - [ [ [ 1, -1, -1, 1, -3, 0 ], [ 1, -1, -1, 1, -2, 0 ], [ 2, -1, -1, 1, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ] ], 0.5 ] - ], - [ - [ [ [ 1, -1, -1, 1, -3, 0 ], [ 1, -1, -1, 1, -2, 0 ], [ 2, -1, -2, 1, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ] ], 1.625 ], - [ [ [ 1, -1, -2, 1, -2, 0 ], [ 1, -1, -1, 1, -2, 0 ], [ 2, -1, -2, 1, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ] ], 1.625 ] - ], - [ - [ [ [ 1, -1, -2, 1, -2, 0 ], [ 1, -1, -1, 1, -2, 0 ], [ 1, -1, -1, 2, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ] ], 1.375 ], - [ [ [ -1, -1, -1, 3, -2, 0 ], [ 1, -1, -1, 1, -2, 0 ], [ 1, -1, -1, 2, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ] ], 1.375 ] - ], - [ - [ [ [ -1, -1, -1, 3, -2, 0 ], [ 1, -2, -1, 2, -2, 0 ], [ 1, -1, -1, 2, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ] ], 1.625 ], - [ [ [ -1, -1, -1, 3, -2, 0 ], [ 1, -2, -1, 2, -2, 0 ], [ 2, -1, -1, 1, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ] ], 1.25 ], - [ [ [ -1, -2, -1, 2, -2, 0 ], [ 1, -2, -1, 2, -2, 0 ], [ 2, -1, -1, 1, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ] ], 1.75 ] - ], - [ - [ [ [ 0, -2, -1, 1, -2, 0 ], [ 1, -2, -1, 2, -2, 0 ], [ 2, -1, -1, 1, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ] ], 1.5 ], - [ [ [ 0, -2, -1, 1, -2, 0 ], [ 1, -2, -1, 2, -2, 0 ], [ 2, -1, -1, 1, -2, 0 ], [ 1, -1, -1, 1, -2, 0 ] ], 0.5 ], - [ [ [ 0, -2, -1, 1, -2, 0 ], [ 2, -2, -1, 1, -2, 0 ], [ 2, -1, -1, 1, -2, 0 ], [ 1, -1, -1, 1, -2, 0 ] ], 0.5 ] - ], - [ - [ [ [ 0, -2, -1, 1, -2, 0 ], [ 2, -2, -1, 1, -2, 0 ], [ 1, -2, -1, 1, -2, 0 ], [ 1, -1, -1, 1, -2, 0 ] ], 0.875 ], - [ [ [ 1, -2, -1, 0, -2, 0 ], [ 2, -2, -1, 1, -2, 0 ], [ 1, -2, -1, 1, -2, 0 ], [ 1, -1, -1, 1, -2, 0 ] ], 1.625 ] - ], - [ - [ [ [ 0, -2, -2, 1, -2, 0 ], [ 2, -2, -1, 1, -2, 0 ], [ 1, -2, -1, 1, -2, 0 ], [ 1, -1, -1, 1, -2, 0 ] ], 1.375 ], - [ [ [ 0, -2, -2, 1, -2, 0 ], [ 2, -2, -1, 1, -2, 0 ], [ 2, -2, -1, 0, -2, 0 ], [ 1, -1, -1, 1, -2, 0 ] ], 1.75 ], - [ [ [ 0, -2, -2, 1, -2, 0 ], [ 2, -2, -1, 1, -2, 0 ], [ 2, -2, -1, 0, -2, 0 ], [ 2, -2, -2, 1, -2, 0 ] ], 1.5 ] - ], - [ - [ [ [ 0, -2, -2, 1, -2, 0 ], [ 2, -2, -1, 1, -2, 0 ], [ 1, -1, -2, 1, -2, 0 ], [ 2, -2, -2, 1, -2, 0 ] ], 1.5 ], - [ [ [ 0, -2, -2, 1, -2, 0 ], [ 2, -2, -1, 1, -2, 0 ], [ 1, -1, -2, 1, -2, 0 ], [ 3, -2, -2, 0, -2, 0 ] ], 0.5 ] - ], - [ - [ [ [ 0, -2, -2, 1, -2, 0 ], [ 2, -2, -1, 1, -2, 0 ], [ 1, -1, -2, 1, -2, 0 ], [ 1, -1, -2, 2, -2, 0 ] ], 1.625 ] - ], - [ - [ [ [ -1, 0, -2, 1, -2, 0 ], [ 2, -2, -1, 1, -2, 0 ], [ 1, -1, -2, 1, -2, 0 ], [ 1, -1, -2, 2, -2, 0 ] ], 1 ], - [ [ [ -1, 0, -2, 1, -2, 0 ], [ 2, -2, -1, 1, -2, 0 ], [ 1, -1, -2, 1, -2, 0 ], [ 2, -1, -2, 1, -2, 0 ] ], 1.75 ], - [ [ [ -1, 0, -2, 1, -2, 0 ], [ 1, 0, -2, 1, -2, 0 ], [ 1, -1, -2, 1, -2, 0 ], [ 2, -1, -2, 1, -2, 0 ] ], 1.75 ] - ], - [ - [ [ [ -1, 0, -2, 1, -2, 0 ], [ 1, 0, -2, 1, -2, 0 ], [ 0, 1, -2, 1, -2, 0 ], [ 2, -1, -2, 1, -2, 0 ] ], 0.875 ] - ], - [ - [ [ [ -1, 0, -2, 1, -2, 0 ], [ 0, 2, -2, 1, -2, 0 ], [ 0, 1, -2, 1, -2, 0 ], [ 2, -1, -2, 1, -2, 0 ] ], 0.75 ], - [ [ [ -2, 2, -2, 1, -2, 0 ], [ 0, 2, -2, 1, -2, 0 ], [ 0, 1, -2, 1, -2, 0 ], [ 2, -1, -2, 1, -2, 0 ] ], 0.5 ], - [ [ [ -2, 2, -2, 1, -2, 0 ], [ 0, 2, -2, 1, -2, 0 ], [ 0, 1, -2, 1, -2, 0 ], [ 1, 1, -2, 1, -2, 0 ] ], 0.875 ] - ], - [ - [ [ [ -2, 2, -2, 1, -2, 0 ], [ 0, 2, -2, 1, -2, 0 ], [ -1, 3, -2, 1, -2, 0 ], [ 1, 1, -2, 1, -2, 0 ] ], 1.375 ], - [ [ [ -1, 1, -3, 1, -2, 0 ], [ 0, 2, -2, 1, -2, 0 ], [ -1, 3, -2, 1, -2, 0 ], [ 1, 1, -2, 1, -2, 0 ] ], 1.375 ] - ], - [ - [ [ [ -1, 1, -3, 1, -2, 0 ], [ 0, 2, -2, 1, -2, 0 ], [ -1, 3, -2, 1, -2, 0 ], [ 0, 3, -2, 1, -2, 0 ] ], 1.875 ], - [ [ [ -1, 1, -3, 1, -2, 0 ], [ 0, 2, -2, 1, -2, 0 ], [ 0, 2, -3, 1, -2, 0 ], [ 0, 3, -2, 1, -2, 0 ] ], 1.5 ] - ], - [ - [ [ [ -1, 1, -3, 1, -2, 0 ], [ 1, 1, -3, 1, -2, 0 ], [ 0, 2, -3, 1, -2, 0 ], [ 0, 3, -2, 1, -2, 0 ] ], 0.875 ] - ], - [ - [ [ [ -2, 3, -3, 1, -2, 0 ], [ 1, 1, -3, 1, -2, 0 ], [ 0, 2, -3, 1, -2, 0 ], [ 0, 3, -2, 1, -2, 0 ] ], 1.25 ], - [ [ [ -2, 3, -3, 1, -2, 0 ], [ 1, 1, -3, 1, -2, 0 ], [ 0, 2, -3, 1, -2, 0 ], [ 0, 3, -3, 1, -2, 0 ] ], 1.625 ] - ], - [ - [ [ [ -1, 2, -4, 1, -2, 0 ], [ 1, 1, -3, 1, -2, 0 ], [ 0, 2, -3, 1, -2, 0 ], [ 0, 3, -3, 1, -2, 0 ] ], 0.5 ] - ], - [ - [ [ [ -1, 2, -4, 1, -2, 0 ], [ 1, 1, -3, 1, -2, 0 ], [ 0, 2, -3, 1, -2, 0 ], [ 1, 2, -4, 1, -2, 0 ] ], 1.25 ], - [ [ [ 0, 0, -3, 1, -2, 0 ], [ 1, 1, -3, 1, -2, 0 ], [ 0, 2, -3, 1, -2, 0 ], [ 1, 2, -4, 1, -2, 0 ] ], 1.25 ] - ], - [ - [ [ [ -1, 2, -3, 1, -2, 0 ], [ 1, 1, -3, 1, -2, 0 ], [ 0, 2, -3, 1, -2, 0 ], [ 1, 2, -4, 1, -2, 0 ] ], 0.75 ], - [ [ [ -1, 2, -3, 1, -2, 0 ], [ 1, 1, -3, 1, -2, 0 ], [ 0, 2, -3, 1, -2, 0 ], [ 2, 0, -3, 1, -2, 0 ] ], 1 ] - ], - [ - [ [ [ -1, 2, -3, 1, -2, 0 ], [ 1, 0, -3, 1, -2, 0 ], [ 0, 2, -3, 1, -2, 0 ], [ 2, 0, -3, 1, -2, 0 ] ], 0.75 ], - [ [ [ -1, 2, -3, 1, -2, 0 ], [ 1, 0, -3, 1, -2, 0 ], [ 1, 0, -2, 1, -2, 0 ], [ 2, 0, -3, 1, -2, 0 ] ], 1 ], - [ [ [ 0, 0, -2, 1, -2, 0 ], [ 1, 0, -3, 1, -2, 0 ], [ 1, 0, -2, 1, -2, 0 ], [ 2, 0, -3, 1, -2, 0 ] ], 1 ] - ], - [ - [ [ [ 0, 0, -2, 1, -2, 0 ], [ 1, 0, -3, 1, -2, 0 ], [ 1, 0, -2, 1, -2, 0 ], [ 1, -1, -2, 1, -2, 0 ] ], 0.5 ], - [ [ [ 0, 0, -2, 1, -2, 0 ], [ 0, 0, -2, 2, -2, 0 ], [ 1, 0, -2, 1, -2, 0 ], [ 1, -1, -2, 1, -2, 0 ] ], 0.75 ], - [ [ [ 0, 0, -2, 1, -2, 0 ], [ 0, 0, -2, 2, -2, 0 ], [ 0, 1, -2, 1, -2, 0 ], [ 1, -1, -2, 1, -2, 0 ] ], 0.625 ] - ], - [ - [ [ [ 0, 0, -2, 1, -2, 0 ], [ 0, 0, -2, 2, -2, 0 ], [ 1, 0, -3, 1, -2, 0 ], [ 1, -1, -2, 1, -2, 0 ] ], 0.75 ] - ], - [ - [ [ [ 0, -1, -2, 2, -2, 0 ], [ 0, 0, -2, 2, -2, 0 ], [ 1, 0, -3, 1, -2, 0 ], [ 1, -1, -2, 1, -2, 0 ] ], 0.625 ], - [ [ [ 0, -1, -2, 2, -2, 0 ], [ 1, 0, -2, 1, -2, 0 ], [ 1, 0, -3, 1, -2, 0 ], [ 1, -1, -2, 1, -2, 0 ] ], 0.875 ] - ], - [ - [ [ [ 0, -1, -2, 2, -2, 0 ], [ 1, 0, -2, 1, -2, 0 ], [ 1, 0, -3, 1, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ] ], 1.625 ], - [ [ [ 0, -1, -2, 2, -2, 0 ], [ 1, -1, -2, 2, -2, 0 ], [ 1, 0, -3, 1, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ] ], 0.75 ], - [ [ [ 0, -1, -2, 2, -2, 0 ], [ 1, -1, -2, 2, -2, 0 ], [ 0, 0, -2, 2, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ] ], 1.375 ] - ], - [ - [ [ [ 0, -1, -2, 2, -2, 0 ], [ 1, 0, -2, 2, -3, 0 ], [ 0, 0, -2, 2, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ] ], 1.25 ] - ], - [ - [ [ [ 0, -1, -2, 2, -2, 0 ], [ 1, -1, -1, 2, -2, 0 ], [ 0, 0, -2, 2, -2, 0 ], [ 0, -1, -1, 2, -2, 0 ] ], 1.25 ], - [ [ [ 0, -1, -2, 2, -2, 0 ], [ 1, -1, -1, 2, -2, 0 ], [ 0, 0, -2, 2, -2, 0 ], [ 1, -2, -2, 2, -2, 0 ] ], 0.875 ] - ], - [ - [ [ [ 0, -1, -2, 2, -2, 0 ], [ 1, -1, -1, 2, -2, 0 ], [ 0, 0, -2, 2, -2, 0 ], [ 1, -1, -2, 2, -2, 0 ] ], 1.375 ], - [ [ [ 0, -1, -2, 2, -2, 0 ], [ 1, -1, -1, 2, -2, 0 ], [ 1, -1, -3, 2, -2, 0 ], [ 1, -1, -2, 2, -2, 0 ] ], 0.625 ], - [ [ [ 0, -1, -2, 2, -2, 0 ], [ 2, -2, -2, 2, -2, 0 ], [ 1, -1, -3, 2, -2, 0 ], [ 1, -1, -2, 2, -2, 0 ] ], 1 ] - ], - [ - [ [ [ 1, -2, -3, 2, -2, 0 ], [ 2, -2, -2, 2, -2, 0 ], [ 1, -1, -3, 2, -2, 0 ], [ 1, -1, -2, 2, -2, 0 ] ], 0.875 ], - [ [ [ 1, -2, -3, 2, -2, 0 ], [ 2, -2, -2, 2, -2, 0 ], [ 1, -2, -2, 2, -2, 0 ], [ 1, -1, -2, 2, -2, 0 ] ], 0.75 ] - ], - [ - [ [ [ 1, -2, -3, 2, -2, 0 ], [ 2, -1, -2, 2, -3, 0 ], [ 1, -2, -2, 2, -2, 0 ], [ 1, -1, -2, 2, -2, 0 ] ], 1.125 ], - [ [ [ 1, -2, -3, 2, -2, 0 ], [ 2, -1, -2, 2, -3, 0 ], [ 0, 0, -2, 2, -2, 0 ], [ 1, -1, -2, 2, -2, 0 ] ], 1.5 ], - [ [ [ 1, -1, -2, 1, -2, 0 ], [ 2, -1, -2, 2, -3, 0 ], [ 0, 0, -2, 2, -2, 0 ], [ 1, -1, -2, 2, -2, 0 ] ], 1.625 ], - [ [ [ 1, -1, -2, 1, -2, 0 ], [ "Rest" ], [ 0, 0, -2, 2, -2, 0 ], [ 1, -1, -2, 2, -2, 0 ] ], 1.625 ], - [ [ [ "Rest" ], [ "Rest" ], [ 0, 0, -2, 2, -2, 0 ], [ 1, -1, -2, 2, -2, 0 ] ], 1.25 ], - [ [ [ "Rest" ], [ "Rest" ], [ 0, 0, -2, 2, -2, 0 ], [ "Rest" ] ], 1.25 ], - [ [ [ "Rest" ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 7.25 ] - ] - ] -], -"last_changes": -[ - [ [ 1, -2, -3, 2, -2, 0 ], [ 2, -2, -2, 2, -2, 0 ], [ 1, -1, -3, 2, -2, 0 ], [ 1, -1, -2, 2, -2, 0 ] ], - [ [ 1, -2, -3, 2, -2, 0 ], [ 2, -2, -2, 2, -2, 0 ], [ 1, -2, -2, 2, -2, 0 ], [ 1, -1, -2, 2, -2, 0 ] ], - [ [ 1, -2, -3, 2, -2, 0 ], [ 2, -1, -2, 2, -3, 0 ], [ 1, -2, -2, 2, -2, 0 ], [ 1, -1, -2, 2, -2, 0 ] ], - [ [ 1, -2, -3, 2, -2, 0 ], [ 2, -1, -2, 2, -3, 0 ], [ 0, 0, -2, 2, -2, 0 ], [ 1, -1, -2, 2, -2, 0 ] ], - [ [ 1, -1, -2, 1, -2, 0 ], [ 2, -1, -2, 2, -3, 0 ], [ 0, 0, -2, 2, -2, 0 ], [ 1, -1, -2, 2, -2, 0 ] ] -], -"cur_uid": "55bd25a1", -"ref_uid": "6a9928d6", -"order_seed": 807265, -"dur_seed": 754968, -"motifs_seed": 848720, -"entrances_probs_vals": [ 0, 0, 0, 0.41, 1.84, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"passages_probs_vals": [ 0, 0, 0, 0.41, 1.84, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"exits_probs_vals": [ 0, 0, 0, 0.41, 1.84, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"ranges": [ [ -2430, -293 ], [ -869, 1211 ], [ -832, 1285 ], [ -702, 1211 ] ], -"step_probs_vals": [ -1200, 1200, 0.0020576131687243, 0.068181818181818, 0.074074074074074, 0.0625, 0.20576131687243, 0.0625, 0.45679012345679, 0.011363636363636, 0.53086419753086, 0, 0.54320987654321, 0.92045454545455, 0.58641975308642, 0.92613636363636, 0.61316872427983, 0, 0.98971193415638, 0 ], -"passages_weights": [ 0.48, 0.46, 0.48, 1, 1 ], -"hd_exp": 9, -"hd_invert": 0, -"order": -[ - [ [ 1, 3, 0 ], [ 2 ], [ ] ], - [ [ 3, 0 ], [ 1, 2 ], [ ] ], - [ [ 3, 2 ], [ 0, 1 ], [ ] ], - [ [ 1 ], [ 2, 0, 3 ], [ ] ], - [ [ 3 ], [ 0, 1, 2 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 3 ], [ 0, 1, 2 ], [ ] ], - [ [ 3 ], [ 0, 1, 2 ], [ ] ], - [ [ 2, 0 ], [ 3, 1 ], [ ] ], - [ [ 0, 1, 2 ], [ 3 ], [ ] ], - [ [ 3 ], [ 1, 0, 2 ], [ ] ], - [ [ 2 ], [ 0, 3, 1 ], [ ] ], - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 2, 1 ], [ 0, 3 ], [ ] ], - [ [ 3, 2, 0 ], [ 1 ], [ ] ], - [ [ 2 ], [ 3, 0, 1 ], [ ] ], - [ [ 3 ], [ 0, 1, 2 ], [ ] ], - [ [ 2 ], [ 3, 1, 0 ], [ ] ], - [ [ 0, 1 ], [ 2, 3 ], [ ] ], - [ [ 3, 1 ], [ 2, 0 ], [ ] ], - [ [ 0 ], [ 3, 1, 2 ], [ ] ], - [ [ 3, 2 ], [ 0, 1 ], [ ] ], - [ [ 2, 3 ], [ 0, 1 ], [ ] ], - [ [ 1, 0 ], [ 2, 3 ], [ ] ], - [ [ 2, 0 ], [ 1, 3 ], [ ] ], - [ [ 0, 2 ], [ 1, 3 ], [ ] ], - [ [ 0, 1 ], [ 3, 2 ], [ ] ], - [ [ 0 ], [ 1, 2, 3 ], [ ] ], - [ [ 0 ], [ 2, 3, 1 ], [ ] ], - [ [ 3, 0, 1 ], [ 2 ], [ ] ], - [ [ 3 ], [ 0, 2, 1 ], [ ] ], - [ [ 1, 0 ], [ 3, 2 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 0, 1 ], [ 2, 3 ], [ ] ], - [ [ 0 ], [ 1, 2, 3 ], [ ] ], - [ [ 0, 2, 1 ], [ 3 ], [ ] ], - [ [ 2 ], [ 1, 0, 3 ], [ ] ], - [ [ 0, 1, 2 ], [ 3 ], [ ] ], - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 0 ], [ 3, 1, 2 ], [ ] ], - [ [ 3, 1 ], [ 0, 2 ], [ ] ], - [ [ 0, 2 ], [ 3, 1 ], [ ] ], - [ [ 1, 3 ], [ 0, 2 ], [ ] ], - [ [ 2, 3 ], [ 0, 1 ], [ ] ], - [ [ 1, 2 ], [ 3, 0 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 2, 1 ], [ 3, 0 ], [ ] ], - [ [ 1 ], [ 2, 3, 0 ], [ ] ], - [ [ 1, 3, 2 ], [ 0 ], [ ] ], - [ [ 3, 2, 0 ], [ 1 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 3, 0 ], [ 2, 1 ], [ ] ], - [ [ 1 ], [ 3, 0, 2 ], [ ] ], - [ [ 0 ], [ 2, 3, 1 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 1 ], [ 0, 3, 2 ], [ ] ], - [ [ 2, 3 ], [ 1, 0 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 2 ], [ 1, 3, 0 ], [ ] ], - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 1 ], [ 2, 0, 3 ], [ ] ], - [ [ 1, 2 ], [ 3, 0 ], [ ] ], - [ [ 2, 1, 3 ], [ 0 ], [ ] ], - [ [ 1 ], [ 2, 3, 0 ], [ ] ], - [ [ 3 ], [ 2, 1, 0 ], [ ] ], - [ [ 1, 2 ], [ 3, 0 ], [ ] ], - [ [ 2, 1, 3 ], [ 0 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 1, 3 ], [ 2, 0 ], [ ] ], - [ [ 3, 1 ], [ 2, 0 ], [ ] ], - [ [ 1, 3 ], [ 2, 0 ], [ ] ], - [ [ 3 ], [ 1, 2, 0 ], [ ] ], - [ [ 2 ], [ 0, 3, 1 ], [ ] ], - [ [ 1, 3 ], [ 2, 0 ], [ ] ], - [ [ 1 ], [ 0, 2, 3 ], [ ] ], - [ [ 1, 0 ], [ 2, 3 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 2 ], [ 0, 3, 1 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 2 ], [ 1, 0, 3 ], [ ] ], - [ [ 1, 3 ], [ 2, 0 ], [ ] ], - [ [ 1, 0 ], [ 3, 2 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 1, 2 ], [ 0, 3 ], [ ] ], - [ [ 3, 2, 1 ], [ 0 ], [ ] ], - [ [ 2, 1 ], [ 3, 0 ], [ ] ], - [ [ 2, 1 ], [ 0, 3 ], [ ] ], - [ [ 3 ], [ 1, 2, 0 ], [ ] ], - [ [ 0 ], [ 3, 1, 2 ], [ ] ], - [ [ 1, 3, 0 ], [ 2 ], [ ] ], - [ [ 3, 2 ], [ 0, 1 ], [ ] ], - [ [ 0 ], [ 3, 1, 2 ], [ ] ], - [ [ 2, 3, 0 ], [ 1 ], [ ] ], - [ [ 2, 0 ], [ 1, 3 ], [ ] ], - [ [ 0 ], [ 3, 2, 1 ], [ ] ], - [ [ 3, 1 ], [ 0, 2 ], [ ] ], - [ [ 3 ], [ 1, 2, 0 ], [ ] ] -], -"sus_weights": [ 0.35, 0.37, 0.38 ], -"order_size": [ 100, 100 ], -"passages_size": [ 0, 0 ], -"motif_edited": "false", -"order_edited": "false" -} \ No newline at end of file diff --git a/resources/string_quartet_3/55f9b81e/55f9b81e_code.scd b/resources/string_quartet_3/55f9b81e/55f9b81e_code.scd deleted file mode 100644 index 2dad11e..0000000 --- a/resources/string_quartet_3/55f9b81e/55f9b81e_code.scd +++ /dev/null @@ -1,958 +0,0 @@ -( -// helper funcs -var hsArrayToCents, pDist, hdSum, hsChordalDistance, hsArrayToFreq; - -// score funcs -var isInRange, spacingScore, rangeScore, intervalScore, inclusionScore; - -// subroutines -var genTuples, initVoices, genOrders, genSubMotif, updateVoices, genDurFunc, genStepFunc; - -// primary routines -var genMotif, genSecondarySeq; - -// audition funcs -var genPatterns, genMidiPatterns; - -// resource management funcs -var seedFunc, genUID, writeResources, stringifyToDepth, setSeeds, sanityCheck, -msgInterpret, loadLedgerFile, loadLedgerJSON, loadModelFile, loadModelJSON, -setGlobalVars, globalVarsToDict, saveLedger; - -// model vars -//(model and global vars mostly set by OSC funcs -var seq, lastXChanges, -curUID, refUID, orderSeed, durSeed, motifSeed, -entrancesProbVals, passagesProbVals, exitsProbVals, -ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, -orders, susWeights, orderSize, passagesSize, -motifEdited, orderEdited; - -// model aux vars -var entrancesDurFunc, passagesDurFunc, exitsDurFunc, stepFunc; - -// other global vars -var popSize, exPath, dir, primes, dims, tuples, -group, player, resourceDir, ledgerPath, ledger, currentlyPlayingUID, -nameSpaces; - -// install JSON quark (not used) -/* -if(Quarks.isInstalled("JSONlib").not, { - Quarks.install("https://github.com/musikinformatik/JSONlib.git"); - thisProcess.recompile; - //HelpBrowser.openHelpFor("Classes/JSONlib"); -}); -*/ - - -//------helper funcs - -hsArrayToCents = { - arg hsArray; - hsArray.collect({arg dist, p; dist * 1200 * log2(primes[p][0]/primes[p][1])}).sum -}; - -pDist = { - arg array1, array2, signed = false; - var pDistance; - pDistance = hsArrayToCents.value(array1) - hsArrayToCents.value(array2); - if(signed, {pDistance}, {abs(pDistance)}) -}; - -hdSum = { - arg hsArrays; - var size, distances, mean; - size = hsArrays.size; - distances = (size - 1).collect({arg i; - ((i + 1)..(size - 1)).collect({arg j; - abs(hsArrays[i] - hsArrays[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsChordalDistance = { - arg hsArrays1, hsArrays2; - var size, distances, mean; - size = hsArrays1.size; - distances = hsArrays1.size.collect({arg i; - hsArrays2.size.collect({arg j; - abs(hsArrays1[i] - hsArrays2[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsArrayToFreq = { - arg array; - array.collect({arg dim, d; pow(primes[d][0]/primes[d][1], dim)}).product -}; - -//------score funcs - -/* -isInRange = { - arg hsArray, min, max; - var cents; - cents = hsArrayToCents.value(hsArray); - (cents >= min) && (cents <= max) -}; -*/ - -spacingScore = { - arg hsArrays, min; - var centsArray; - centsArray = hsArrays.collect({arg hsArray; hsArrayToCents.value(hsArray)}).sort({arg a, b; a < b}); - centsArray.differentiate.drop(1).collect({arg pDistance; if(pDistance >= min, {1}, {0.01})}).sum; -}; - -rangeScore = { - arg hsArray1, hsArray2, min, max, low, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - if((pDistance >= min) && (pDistance <= max), {1}, {low}); -}; - -/* -intervalScore = { - arg hsArray1, hsArray2, mean, sd, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - //pDistance.gaussCurve(1, mean, sd) - stepFunc.value(pDistance) -}; -*/ - -intervalScore = { - arg hsArray1, hsArray2, mean, sd, signed = true; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - //pDistance.gaussCurve(1, mean, sd) - if(pDistance < 0, {stepFunc.value(abs(pDistance))}, {0.001}); - //stepFunc.value(pDistance) -}; - -inclusionScore = { - arg array, test, min = 0.01; - if(array.collect({arg v; v.hash}).includes(test.hash), {min}, {1}); -}; - - -//------subroutines - -genTuples = { - var tuples; - tuples = dims.collect({[-1, 0, 1]}).allTuples.select({arg tuple; (abs(tuple.drop(1)).sum <= 1) && (tuple[0] == 0)}); - //tuples = dims.collect({[0, 1]}).allTuples.select({arg tuple; (abs(tuple.drop(1)).sum <= 1) && (tuple[0] == 0)}); - tuples = tuples ++ tuples.collect({arg tuple; [-3, -2, -1, 1, 2, 3].collect({arg octTrans; tuple.deepCopy.put(0, octTrans)})}).flatten; -}; - -initVoices = { - var init, voicesInit; - voicesInit = popSize.collect({dims.collect({0})}); - /* - voicesInit = [dims.collect({0})]; - (popSize - 1).do({ - arg rep, new; - rep = dims.rand; - new = voicesInit.last.deepCopy; - new[rep] = new[rep] + [-1, 1].choose(); - voicesInit = voicesInit.add(new); - }); - */ - voicesInit.deepCopy; -}; - -genDurFunc = {arg chordProb, minPad, maxPad, minDur, maxDur, envData, seed; - var env, pTable, durFunc; - env = Env.pairs([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).asSignal(256).asList.asArray; - pTable = env.asRandomTable; - [chordProb, minPad, maxPad, minDur, maxDur, envData].postln; - durFunc = {arg allowChord, pad = false; - var res; - res = if(allowChord.not, { - pTable.tableRand * (maxDur - minDur) + minDur - }, { - if(1.0.rand < chordProb, {0}, {pTable.tableRand * (maxDur - minDur) + minDur}); - }).round(0.125); - if(pad, {res = res + rrand(minPad.asFloat, maxPad.asFloat).round(0.125)}); - if(res.asInteger == res, {res = res.asInteger}); - res - }; - seedFunc.value(durFunc, seed); -}; - -genStepFunc = {arg minStep, maxStep, envData, seed; - var envDataNorm, env, pTable, stepFunc; - [minStep, maxStep, envData].postln; - envDataNorm = ([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).flop; - envDataNorm = [envDataNorm[0].normalize(minStep, maxStep), envDataNorm[1]].flop; - env = Env.pairs(envDataNorm); - stepFunc = {arg pDist; - env.at(pDist).clip(0.001, 1); - }; - seedFunc.value(stepFunc, seed); -}; - -genOrders = {arg minMotifLength = 1, maxMotifLength = 5, minProgLength = 0, maxProgLength = 5; - ((maxMotifLength.asInteger - minMotifLength.asInteger).rand + minMotifLength.asInteger).collect({ - var noProgIns, noSusIns, noSilentIns, prog, sus, silent, order; - noSusIns = [1, 2, 3].wchoose(susWeights.normalizeSum); - //noProgIns = (popSize - noSusIns).rand + 1; - noProgIns = (popSize - noSusIns); - noSilentIns = popSize - noSusIns - noProgIns; - - # prog, sus, silent = (0..(popSize-1)).scramble.clumps([noProgIns, noSusIns, noSilentIns]); - - prog = (prog.scramble ++ ((maxProgLength.asInteger - minProgLength.asInteger).rand + minProgLength.asInteger).collect({prog.choose}).scramble); - if(silent == nil, {silent = []}); - [sus.scramble, prog, silent.scramble] - }); -}; - -updateVoices = {arg ins, sus; - var voices, candidates, nWeights, nProbs, sel; - - voices = lastXChanges.deepCopy.last; - - candidates = sus.collect({arg v; tuples.collect({arg t; voices[v] + t})}).flatten; - candidates = difference(candidates.asSet, voices.asSet).asList; - nProbs = candidates.collect({arg candidate; - var stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore; - - //stepScore = intervalScore.value(voices[ins], candidate, 30, 400, 0.1); - stepScore = intervalScore.value(voices[ins], candidate, 100, 100); - recentlySoundedScore = inclusionScore.value(lastXChanges.flop[ins], candidate, 0); - isInRangeScore = rangeScore.value(candidate, candidate.collect({0}), ranges[ins][0], ranges[ins][1], 0, true); - regScore = spacingScore.value(voices.deepCopy.put(ins, candidate), 300); - hdScore = pow(hdSum.value(voices.deepCopy.put(ins, candidate)), hdExp); - if(hdInvert == 0, {hdScore = 1/hdScore}); - //maybe what you want here is a vector to another root and then favoring movement towards it. - //distScore = pow(hsChordalDistance.value(voices, voices.put(ins, candidate)), 2); - - [stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore] - }); - - nWeights = passagesWeights; - - //this handles nWeights of 0; mainly for testing - nProbs = nProbs.flop.select({arg scores, s; nWeights[s] != 0}).flop; - nWeights = nWeights.select({arg weight; weight != 0}); - nProbs = nProbs.flop.collect({arg scores, s; - if(scores.sum == 0, {scores}, {scores.normalizeSum * nWeights[s]}) - }); - nProbs = nProbs.flop.collect({arg scores, s; scores.product}).normalizeSum; - - sel = candidates.wchoose(nProbs); - - voices[ins] = sel; - lastXChanges = lastXChanges.add(voices).keep(-5); -}; - -genSubMotif = {arg order, orderIndex, lastState, repeatLast = false, startFromLast = false, isLastOrder = false; - var sus, prog, silent, flatOrder, res, isInChord, allowChord, pad, lastXChangesHold, voices, adder; - # sus, prog, silent = order; - flatOrder = silent ++ sus ++ prog; - lastXChangesHold = lastXChanges.deepCopy; - voices = lastState.deepCopy; - isInChord = popSize.collect({false}); - allowChord = false; - pad = false; - res = []; - "------generating motif".postln; - //need to figure out here if voices move between motifs - flatOrder.do({arg ins, i; - - if(prog.includes(ins) && repeatLast.not, {updateVoices.value(ins, sus)}); - adder = if(silent.includes(ins), {["Rest"]}, {lastXChanges.last.deepCopy[ins]}); - - if(voices[ins] != adder, { - var dur; - - if((sus ++ silent).includes(ins), { - allowChord = (ins != sus.last); - pad = (ins == sus.last); - }, { - if(i < (flatOrder.size - 1), { - allowChord = (isInChord[flatOrder[i + 1]] || (ins == flatOrder[i + 1])).not; - pad = false; - }, { - allowChord = false; - pad = true - }); - }); - if((orderIndex == 0) && sus.includes(ins), { - dur = entrancesDurFunc.value(allowChord, pad); - }, { - dur = passagesDurFunc.value(allowChord, pad); - }); - if(dur == 0, {isInChord[ins] = true}, {isInChord = popSize.collect({false})}); - - voices[ins] = adder; - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - - // pad ending - if(orderIndex == (orders.size - 1), { - (0..(popSize-1)).scramble.do({arg ins; - if(res.last.first[ins] != ["Rest"], { - var dur; - voices[ins] = ["Rest"]; - allowChord = (voices != popSize.collect({["Rest"]})); - pad = allowChord.not; - dur = exitsDurFunc.value(allowChord, pad); - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - }); - - //format and return - if(startFromLast, {lastXChanges = lastXChangesHold.deepCopy}); - res; -}; - - -//------primary routines - -genMotif = { - var repeats, fSeq, fDur, durAdd; - - repeats = 1; - fSeq = []; - - repeats.do({arg index; - var motif; - - motif = []; - - orders.do({arg order, o; - var lastState, subMotif; - lastState = if(o == 0, {popSize.collect({["Rest"]})}, {motif.last.last.first}); - subMotif = genSubMotif.value(order, o, lastState, isLastOrder: o == (orders.size - 1)); - motif = motif.add(subMotif); - - }); - - sanityCheck.value(motif, index); - - fSeq = fSeq.add(motif); - }); - - //round last duration to measure - fDur = fSeq.flatten.flatten.slice(nil, 1).sum; - durAdd = fDur.round(4) - fDur; - if(durAdd < 0, {durAdd = 4 - durAdd}); - fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] = fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] + durAdd; - - fSeq -}; - -genSecondarySeq = {arg seq; - var curdles, fSeq; - curdles = []; - while({curdles.sum < seq.size}, {curdles = curdles ++ [3.rand + 1]}); - - fSeq = seq.clumps(curdles).collect({arg clump, m; - var repeats, paddedSeq; - - //add rest - paddedSeq = clump.add([[[popSize.collect({["Rest"]}), 0.5.rand]]]); - - //implement repeats - repeats = [0.rand + 1, 1].wchoose([1, 0].normalizeSum); - repeats.collect({paddedSeq}); - }); - fSeq -}; - - -//------audition funcs - -/* -Event.addEventType(\osc, { - if (~addr.postln.notNil) { - ~addr.sendMsg(~indexPath, ~indexMsg); - ~addr.sendMsg(~seqPath, stringifyToDepth.value(~seqMsg, 3)); - //~addr.sendMsg("/STATE/OPEN", (dir.replace("supercollider", "resources") +/+ ~idMsg +/+ ~idMsg ++ "_gui_state" ++ ".state").standardizePath.postln); - }; -}); -*/ - -Event.addEventType(\osc, { - if (~addr.notNil) { - ~msg; - ~addr.sendMsg(~path, *~msg); - }; -}); - -genPatterns = {arg inSeq, addr, oneShot = false; - var voices, durs, pbinds, res, indices, sectionDurs, msg, ids, seq; - seq = inSeq.collect({arg mSeq; mSeq[0]}); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - pbinds = voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs, attacks, rels, amps; - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - //attacks = 2.collect({rrand(1, 3)}) ++ freqs.drop(2).collect({rrand(0.3, 0.5)}); - attacks = fDurs.collect({arg dur; dur * rrand(0.2, 0.4)}); - //rels = freqs.drop(2).collect({rrand(0.3, 0.5)}) ++ 2.collect({rrand(1, 3)}); - rels = (clumps.size - 1).collect({arg c; - if(clumps[c + 1][0] == ["Rest"], {rrand(1.0, 3.0)}, {rrand(0.3, 0.5)}); - }); - rels = rels.add(rrand(1.0, 3.0)); - amps = freqs.collect({rrand(0.6, 0.99)}); - - [ - Pbind( - \instrument, \string_model, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \attack, Pseq(attacks, 1), - \sustain, Pseq(fDurs, 1), - \release, Pseq(rels, 1), - //\amp, Pseq(amps, 1), - \amp, Pbrown(0.5, 1, 0.5), - \busIndex, v - ), - Pbind( - \instrument, \sine, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \sustain, Pseq(fDurs, 1), - \busIndex, v - ) - ] - }).flatten; - if(oneShot.not, { - msg = inSeq.collect({arg mSeq, m; mSeq[1..]}); - //ids = inSeq.collect({arg mSeq, m; mSeq[2]}); - sectionDurs = seq.collect({arg mSeq; mSeq.flatten2(mSeq.maxDepth - 5).flop[1].sum}); - pbinds = pbinds ++ - [ - Pbind( - \type, \osc, - \addr, addr, - \path, "/playing", - \msg, Pseq(msg, 1), - \dur, Pseq(sectionDurs, 1) - ); - ] - }); - res = Ppar(pbinds); - res -}; - -/* -genMidiPatterns = {arg seq; - var voices, durs, patterns, res, mOut, pbRange; - pbRange = 1; //semitones - change this as needed for your situation - mOut = MIDIOut.newByName("TiMidity", "TiMidity port 0").latency_(Server.default.latency); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - res = Ppar( - voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs; - - mOut.program(v, 70); - - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - - Pbind( - \type, \midi, - \chan, v, - \noteval, Pseq(freqs.cpsmidi - 24, 1), - \note, Pfunc({ | event | event[\noteval].floor }), - \dur, Pseq(fDurs, 1), - \midiout, mOut, - \amp, 1, - \bend, Pfunc({ - | event | - if (event[\note].isRest.not) { - var pitchbendvalue = event[\noteval].frac.linlin(0, pbRange, 8192, 8192*2).asInteger; - m.bend(v, pitchbendvalue); - }; - 0; // return something other than nil to avoid stopping the pattern - }), - ); - }); - ); - res -}; -*/ - - -//------resource management funcs - -genUID = {Date.seed.asHexString.toLower}; - -seedFunc = {arg func, seed; - var funcArgs, next; - next = Routine({loop{func.valueArray(funcArgs).yield }}); - next.randSeed_(seed); - {arg ...args; funcArgs = args; next.value} -}; - -stringifyToDepth = {arg data, maxDepth = 1; - var prettyString = "", rCount = 0, writeArray, indent; - - if(maxDepth == 0, { - data.asCompileString - }, { - indent = {arg size; size.collect({" "}).join("")}; - writeArray = {arg array; - prettyString = prettyString ++ indent.value(rCount) ++ "[\n"; - rCount = rCount + 1; - if(rCount < maxDepth, { - array.do({arg subArray; writeArray.value(subArray)}); - }, { - prettyString = prettyString ++ array.collect({arg subArray; - indent.value(rCount + 1) ++ subArray.asCompileString - }).join(",\n"); - }); - rCount = rCount - 1; - prettyString = prettyString ++ "\n" ++ indent.value(rCount) ++ "],\n"; - }; - - writeArray.value(data); - prettyString.replace(",\n\n", "\n").drop(-2); - }) -}; - -sanityCheck = {arg motif, index; - //print functions = very helpful - ("----------" + index + "------------").postln; - - motif.flatten.do({arg val, v; - if(v > 0, { - if(motif.flatten[v-1][0].hammingDistance(val[0]) > 1, {"problem 1".postln}); - if(motif.flatten[v-1][0].hammingDistance(val[0]) == 0, {"problem 2".postln}); - }); - val.postln - }); - "***********".postln; -}; - -msgInterpret = {arg in, escapeDoubleQuotes = true, escapeSingleQuotes = true; - var res; - - res = in; - if(res.isNil.not, { - if((res.isArray && res.isString.not), { - res = res.asCompileString; - res = res.replace(" ", "").replace("\n", "").replace("\t", ""); - if(escapeSingleQuotes, {res = res.replace("\'", "")}); - if(escapeDoubleQuotes, {res = res.replace("\"", "")}); - res = res.replace("Rest", "\"Rest\""); - res = res.interpret; - }, { - var tmpRes; - if(res.every({arg char; char.isDecDigit}), {tmpRes = res.asInteger}); - if(res.contains("."), {tmpRes = res.asFloat}); - if(tmpRes != nil, {res = tmpRes}); - }); - }); - res -}; - -writeResources = {arg path, dict; - var file, modelItems, resString; - file = File(path,"w"); - - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - - resString = nameSpaces.collect({arg nameSpace; - var depth = 0, insert = " "; - if(nameSpace == "music_data", {depth = 3; insert = "\n"}); - if(nameSpace == "last_changes", {depth = 1; insert = "\n"}); - if(nameSpace == "order", {depth = 1; insert = "\n"}); - if((nameSpace == "ref_uid") && (dict[nameSpace] == nil), {dict[nameSpace] = "nil"}); - "\"" ++ nameSpace ++ "\":" ++ insert ++ stringifyToDepth.value(dict[nameSpace], depth) - }).join(",\n"); - - resString = "{\n" ++ resString ++ "\n}"; - - file.write(resString); - file.close; - resString -}; - -loadModelFile = {arg path; loadModelJSON.value(File(path, "r").readAllString.parseJSON)}; - -loadModelJSON = {arg jsonObject; - var dict; - dict = Dictionary.with(*nameSpaces.collect({arg nS; nS->msgInterpret.value(jsonObject[nS])})); - dict -}; - -setGlobalVars = {arg dict, skipLastXChanges = false; - var tmpLastXChanges; - tmpLastXChanges = lastXChanges.deepCopy; - // order really matters!!!! - # seq, lastXChanges, curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited = nameSpaces.collect({arg nS; dict[nS]}); - if(skipLastXChanges, {lastXChanges = tmpLastXChanges}); - dict -}; - -globalVarsToDict = { - var modelItems, dict; - // order really matters!!!! - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - dict = Dictionary.with(*nameSpaces.collect({arg nS, n; nS->modelItems[n]})); -}; - -loadLedgerFile = {arg path; - ledgerPath = path; - resourceDir = path.splitext(".").drop(-1).join; - loadLedgerJSON.value(File(ledgerPath, "r").readAllString.parseJSON) -}; - -loadLedgerJSON = {arg jsonObject; ledger = jsonObject["ledger"]}; - -saveLedger = {arg ledger, path; - var file, curResourceDir; - file = File(path, "w"); - curResourceDir = resourceDir; - resourceDir = path.splitext(".").drop(-1).join; - if(curResourceDir != resourceDir, { - File.mkdir(resourceDir); - ledger.do({arg id; - File.copy(curResourceDir +/+ id, resourceDir +/+ id); - }); - }); - file.write("{\n\"ledger\":\n" ++ stringifyToDepth.value(ledger, 1) ++ "\n}"); - file.close; -}; - -//------global vars - -primes = [[2, 1], [3, 2], [5, 4], [7, 4], [11, 8], [13, 8]]; -//ranges = [[-2400, 0], [-1200, 1200], [0, 2400], [0, 2400]]; -exPath = thisProcess.nowExecutingPath; -dir = exPath.dirname; -//popSize = 4; -dims = primes.size; -tuples = genTuples.value(); -//refUID = nil; -group = Group.new; -~group = group; -loadLedgerFile.value(dir +/+ ".." +/+ "resources" +/+ "piece_ledger.json"); -resourceDir = (dir +/+ ".." +/+ "resources" +/+ "piece_ledger"); -//passagesWeights = [1, 1, 1, 1, 1]; -//susWeights = [1, 1, 1]; -// order really matters!!!! -nameSpaces = [ - "music_data", "last_changes", "cur_uid", "ref_uid", "order_seed", "dur_seed", "motifs_seed", - "entrances_probs_vals","passages_probs_vals", "exits_probs_vals", - "ranges", "step_probs_vals", "passages_weights", "hd_exp", "hd_invert", - "order", "sus_weights", "order_size", "passages_size", - "motif_edited", "order_edited" -]; - - -//------OSC funcs - -OSCdef(\load_ledger, {arg msg, time, addr, port; - loadLedgerFile.value(msg[1].asString); -}, \load_ledger); - -OSCdef(\load_model, {arg msg, time, addr, port; - var dict; - dict = loadModelFile.value(msg[1].asString); - setGlobalVars.value(dict); -}, \load_model); - -OSCdef(\save_ledger, {arg msg, time, addr, port; - msg.postln; - ledger = msgInterpret.value(msg[1].asString.parseJSON["ledger"], false).postln; - //loadLedgerJSON.value(msg[0]) - saveLedger.value(ledger, msg[2].asString); - //loadLedgerFile.value(msg[1].asString); -}, \save_ledger); - -OSCdef(\generate, {arg msg, time, addr, port; - var path, dict, durSeeds, musPath, modelString; - msg.postln; - - path = msg[1].asString; - - dict = loadModelFile.value(path); - setGlobalVars.value(dict, true); - - popSize = ranges.size; - - //refUID.postln; - - loadLedgerFile.value(ledgerPath); - if(ledger == nil, {ledger = ["tmp"]}); - if(ledger.last != "tmp", {ledger = ledger.add("tmp")}); - - if(refUID == nil, {lastXChanges = [initVoices.value().deepCopy]}); - if((refUID != nil) && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - lastXChanges = msgInterpret.value(file.readAllString.parseJSON["last_changes"]); - }); - - refUID.postln; - lastXChanges.collect({arg item; item.postln}); - - durSeeds = seedFunc.value({3.collect({rrand(100000, 999999)})}, durSeed).value.postln; - entrancesDurFunc = genDurFunc.valueArray(entrancesProbVals[..4] ++ [entrancesProbVals[5..]] ++ [durSeeds[0]]); - passagesDurFunc = genDurFunc.valueArray(passagesProbVals[..4] ++ [passagesProbVals[5..]] ++ [durSeeds[1]]); - exitsDurFunc = genDurFunc.valueArray(exitsProbVals[..4] ++ [exitsProbVals[5..]] ++ [durSeeds[2]]); - - if(orders == nil, { - orders = seedFunc.value(genOrders, orderSeed).valueArray(orderSize ++ passagesSize); - //addr.sendMsg("/order", stringifyToDepth.value(orders, 1)); - }); - - stepFunc = genStepFunc.valueArray(stepProbsVals[..1] ++ [stepProbsVals[2..]] ++ [motifSeed]); - seq = seedFunc.value(genMotif, motifSeed).value; - - lastXChanges.collect({arg item; item.postln}); - - dict = globalVarsToDict.value; - modelString = writeResources.value(path, dict); - - //addr.sendMsg("/generated", musPath, stringifyToDepth.value(seq, 3)); - //~seq = seq; - - addr.sendMsg("/generated", path, modelString, ledgerPath); -}, \generate); - - -OSCdef(\commit, {arg msg, time, addr, port; - var musicData, musicChanged, dict, newLedger, modelPath, musString, musFile, test1, test2, lastCurUID, commitType, commitPos, equalityLedger; - //msg.postln; - - /* - test1 = msg[1].asString.parseJSON; - test2 = (dir +/+ ".." +/+ "resources/tmp/tmp_music" ++ ".json").standardizePath.parseJSONFile; - msgInterpret.value(test1["music"])[0][0][0][1].class.postln; - msgInterpret.value(test2["music_data"])[0][0][0][1].class.postln; - (test1["music"] == test2["music_data"]).postln; - */ - - musicData = loadModelJSON.value(msg[1].asString.parseJSON)["music_data"].postln; - musicChanged = (musicData != seq).postln; - commitType = msg[2].asString; - commitPos = msg[3].postln.asInteger; - - lastCurUID = curUID.deepCopy; - curUID = genUID.value; - - File.mkdir((resourceDir +/+ curUID).standardizePath); - File.copy(exPath, (resourceDir +/+ curUID +/+ curUID ++ "_code" ++ ".scd").standardizePath); - - modelPath = (resourceDir +/+ curUID +/+ curUID ++ "_mus_model" ++ ".json").standardizePath; - dict = globalVarsToDict.value; - if(musicChanged, { - seq = musicData; - dict["music_data"] = seq; - dict["motif_edited"] = "true" - }); - dict["cur_uid"] = curUID; - - writeResources.value(modelPath, dict); - - File.delete(ledgerPath ++ "_bak"); - File.copy(ledgerPath, ledgerPath ++ "_bak"); - File.delete(ledgerPath); - - /* - if(commitType == "add", { - if(lastCurUID == "tmp", { - ledger = ledger.drop(-1).add(curUID); - }, { - ledger = ledger.add(curUID); - }) - }); - */ - - ledger.postln; - - if(commitType == "add", {ledger = ledger.add(curUID)}); - - if(commitType == "insert", {ledger = ledger.insert(commitPos + 1, curUID)}); - - if(commitType == "replace", {ledger = ledger.put(commitPos, curUID)}); - - equalityLedger = ledger.collect({arg item; item.asSymbol}); - if(equalityLedger.includes(\tmp).postln, {ledger.removeAt(equalityLedger.indexOf(\tmp).postln)}); - - ledger.postln; - - saveLedger.value(ledger, ledgerPath); - - addr.sendMsg("/committed", curUID, ledgerPath); - //refUID = curUID; - -}, \commit); - -OSCdef(\transport, {arg msg, time, addr, port; - msg.postln; - if(msg[1] == 0, { - group.set(\release, 2); - group.set(\gate, 0); - player.stop; - }, { - // the cued sequence can now be read from file, so this can be cleaned up - var cSize, patterns, pSeq, cuedSeek, indexStart, indexEnd, tmpLedger; - if(msg[1] == 1, { - pSeq = []; - cuedSeek = (seq != nil); - indexStart = msg[2].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.postln.parseJSON["music_data"]), path, indexStart + index, uid]); - file.close; - }); - }); - if(cuedSeek, { - var path, file; - path = (resourceDir +/+ "tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - patterns = genPatterns.value(pSeq, addr); - }, { - pSeq = [loadModelJSON.value(msg[2].asString.parseJSON)["music_data"].postln]; - patterns = genPatterns.value(pSeq, addr, true); - }); - player = Pfset(pattern: patterns, cleanupFunc: { - addr.sendMsg("/transport", 0); - addr.sendMsg("/one_shot", 0); - }); - player = player.play - }); -}, \transport); - - -OSCdef(\transcribe_motif, {arg msg, time, addr, port; - var tSeq, refChord, refUID; - - msg.postln; - - tSeq = [loadModelJSON.value(msg[1].asString.parseJSON)["music_data"]]; - refUID = msg[2].asString.postln; - - if((refUID != "nil") && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }, { - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - }); - - ~transcribe.value(tSeq, refChord, (dir +/+ ".." +/+ "lilypond" +/+ "includes").standardizePath, addr, "/transcribe_motif"); -}, \transcribe_motif); - - -OSCdef(\transcribe_all, {arg msg, time, addr, port; - var cSize, patterns, cuedSeek, indexStart, indexEnd, tmpLedger; - if(true, { - cuedSeek = (seq != nil); - indexStart = msg[1].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - - //tmp for testing transcription - //indexEnd = (indexStart+5); - - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - var lilyPartLedgerFiles; - - lilyPartLedgerFiles = 4.collect({arg p; - File((dir +/+ ".." +/+ "lilypond" +/+ "includes" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly").standardizePath, "w"); - }); - - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file, fileString, tSeq, refUID, refChord; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - fileString = file.readAllString; - tSeq = msgInterpret.value(fileString.parseJSON["music_data"]); - refUID = msgInterpret.value(fileString.parseJSON["ref_uid"]); - file.close; - - //uid.postln; - //(refUID == "nil").postln; - - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - - if(refUID != "nil", { - path = (resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }); - - if(index != indexEnd, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath); - }, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath, addr, "/transcribe_all"); - }); - - lilyPartLedgerFiles.do({arg f, p; - f.write("\\include \"" ++ resourceDir +/+ uid +/+ "lilypond" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly\"\n"); - }); - - }); - - lilyPartLedgerFiles.do({arg f; - f.close - }); - }); - /* - if(cuedSeek, { - var path, file; - path = (dir +/+ ".." +/+ "resources/tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - */ - }, { - - }); - -}, \transcribe_all); - -) - - diff --git a/resources/string_quartet_3/55f9b81e/55f9b81e_mus_model.json b/resources/string_quartet_3/55f9b81e/55f9b81e_mus_model.json deleted file mode 100644 index 52fe7d6..0000000 --- a/resources/string_quartet_3/55f9b81e/55f9b81e_mus_model.json +++ /dev/null @@ -1,443 +0,0 @@ -{ -"music_data": -[ - [ - [ - [ [ [ "Rest" ], [ "Rest" ], [ -3, 1, 1, 4, 1, -2 ], [ "Rest" ] ], 1.125 ], - [ [ [ -2, 0, 0, 3, 1, -2 ], [ "Rest" ], [ -3, 1, 1, 4, 1, -2 ], [ "Rest" ] ], 1.75 ], - [ [ [ -2, 0, 0, 3, 1, -2 ], [ -2, 1, 1, 3, 1, -2 ], [ -3, 1, 1, 4, 1, -2 ], [ "Rest" ] ], 1.375 ], - [ [ [ -2, 0, 0, 3, 1, -2 ], [ -2, 1, 1, 3, 1, -2 ], [ -3, 1, 1, 4, 1, -2 ], [ -2, 1, 1, 4, 1, -2 ] ], 1 ] - ], - [ - [ [ [ -2, 0, 0, 3, 1, -2 ], [ -2, 1, 1, 3, 1, -2 ], [ -2, 0, 0, 4, 1, -2 ], [ -2, 1, 1, 4, 1, -2 ] ], 1.5 ] - ], - [ - [ [ [ -2, 0, 0, 3, 1, -2 ], [ -2, 1, 1, 3, 1, -2 ], [ -1, 0, 0, 3, 1, -2 ], [ -2, 1, 1, 4, 1, -2 ] ], 0.875 ] - ], - [ - [ [ [ -2, 0, 0, 3, 1, -2 ], [ -3, 1, 2, 4, 1, -2 ], [ -1, 0, 0, 3, 1, -2 ], [ -2, 1, 1, 4, 1, -2 ] ], 1.125 ] - ], - [ - [ [ [ -4, 1, 2, 4, 1, -2 ], [ -3, 1, 2, 4, 1, -2 ], [ -1, 0, 0, 3, 1, -2 ], [ -2, 1, 1, 4, 1, -2 ] ], 0.75 ] - ], - [ - [ [ [ -4, 1, 1, 4, 2, -2 ], [ -3, 1, 2, 4, 1, -2 ], [ -1, 0, 0, 3, 1, -2 ], [ -2, 1, 1, 4, 1, -2 ] ], 1.25 ] - ], - [ - [ [ [ -4, 1, 1, 4, 2, -2 ], [ -2, 0, 1, 4, 1, -2 ], [ -1, 0, 0, 3, 1, -2 ], [ -2, 1, 1, 4, 1, -2 ] ], 1.125 ] - ], - [ - [ [ [ -4, 1, 1, 4, 2, -2 ], [ -2, 0, 1, 4, 1, -2 ], [ -3, 1, 2, 4, 1, -2 ], [ -2, 1, 1, 4, 1, -2 ] ], 1 ] - ], - [ - [ [ [ -4, 2, 1, 4, 1, -2 ], [ -2, 0, 1, 4, 1, -2 ], [ -3, 1, 2, 4, 1, -2 ], [ -2, 1, 1, 4, 1, -2 ] ], 1.75 ] - ], - [ - [ [ [ -4, 2, 1, 4, 1, -2 ], [ -2, 1, 2, 3, 1, -2 ], [ -3, 1, 2, 4, 1, -2 ], [ -2, 1, 1, 4, 1, -2 ] ], 1.75 ] - ], - [ - [ [ [ -4, 2, 1, 4, 1, -2 ], [ -2, 1, 2, 3, 1, -2 ], [ -2, 0, 1, 4, 1, -2 ], [ -2, 1, 1, 4, 1, -2 ] ], 1.25 ] - ], - [ - [ [ [ -4, 2, 1, 4, 1, -2 ], [ -2, 1, 2, 3, 1, -2 ], [ -2, 1, 1, 4, 0, -2 ], [ -2, 1, 1, 4, 1, -2 ] ], 0.875 ] - ], - [ - [ [ [ -2, 1, 1, 3, 0, -2 ], [ -2, 1, 2, 3, 1, -2 ], [ -2, 1, 1, 4, 0, -2 ], [ -2, 1, 1, 4, 1, -2 ] ], 1 ] - ], - [ - [ [ [ -2, 1, 1, 3, 0, -2 ], [ -2, 1, 2, 3, 1, -2 ], [ -3, 2, 2, 3, 1, -2 ], [ -2, 1, 1, 4, 1, -2 ] ], 1.625 ] - ], - [ - [ [ [ -2, 1, 1, 3, 0, -2 ], [ -2, 2, 2, 3, 0, -2 ], [ -3, 2, 2, 3, 1, -2 ], [ -2, 1, 1, 4, 1, -2 ] ], 1 ] - ], - [ - [ [ [ -2, 1, 1, 3, 0, -2 ], [ -2, 2, 2, 3, 0, -2 ], [ -3, 3, 2, 3, 0, -2 ], [ -2, 1, 1, 4, 1, -2 ] ], 1.75 ] - ], - [ - [ [ [ -2, 1, 1, 3, 0, -2 ], [ -2, 2, 2, 3, 0, -2 ], [ -3, 3, 2, 3, 0, -2 ], [ -2, 2, 2, 3, 1, -2 ] ], 1.25 ] - ], - [ - [ [ [ -2, 1, 1, 3, 0, -2 ], [ -2, 2, 2, 3, 0, -2 ], [ -2, 1, 1, 3, 0, -1 ], [ -2, 2, 2, 3, 1, -2 ] ], 1.625 ] - ], - [ - [ [ [ -2, 0, 1, 3, 0, -1 ], [ -2, 2, 2, 3, 0, -2 ], [ -2, 1, 1, 3, 0, -1 ], [ -2, 2, 2, 3, 1, -2 ] ], 1.375 ] - ], - [ - [ [ [ -2, 0, 1, 3, 0, -1 ], [ -2, 2, 2, 3, 0, -2 ], [ -1, 0, 0, 3, 0, -1 ], [ -2, 2, 2, 3, 1, -2 ] ], 1.75 ] - ], - [ - [ [ [ -2, 0, 1, 3, 0, -1 ], [ -2, 2, 2, 3, 0, -2 ], [ -2, 0, 1, 3, 0, 0 ], [ -2, 2, 2, 3, 1, -2 ] ], 1 ] - ], - [ - [ [ [ -2, 0, 1, 3, 0, -1 ], [ -2, 2, 2, 3, 0, -2 ], [ -2, 0, 1, 3, 0, 0 ], [ -1, 2, 2, 3, -1, -2 ] ], 1.375 ] - ], - [ - [ [ [ -2, -1, 1, 3, 0, 0 ], [ -2, 2, 2, 3, 0, -2 ], [ -2, 0, 1, 3, 0, 0 ], [ -1, 2, 2, 3, -1, -2 ] ], 1.375 ] - ], - [ - [ [ [ -2, -1, 1, 3, 0, 0 ], [ -1, 0, 1, 2, 0, 0 ], [ -2, 0, 1, 3, 0, 0 ], [ -1, 2, 2, 3, -1, -2 ] ], 1.625 ] - ], - [ - [ [ [ -2, -1, 1, 3, 0, 0 ], [ -1, 0, 1, 2, 0, 0 ], [ -2, 0, 1, 3, 0, 0 ], [ -2, 0, 1, 3, 0, 1 ] ], 1.25 ] - ], - [ - [ [ [ -2, -1, 1, 3, 0, 0 ], [ -1, 0, 1, 2, 0, 0 ], [ -2, 0, 1, 3, 0, 0 ], [ -2, 0, 1, 4, 0, 0 ] ], 1.625 ] - ], - [ - [ [ [ -2, -1, 1, 3, 0, 0 ], [ -1, 0, 1, 2, 0, 0 ], [ -2, 0, 1, 3, 0, 0 ], [ -1, -1, 1, 3, 1, 0 ] ], 1.25 ] - ], - [ - [ [ [ -2, -1, 1, 3, 0, 0 ], [ -1, 0, 1, 2, 0, 0 ], [ -1, -1, 0, 3, 0, 0 ], [ -1, -1, 1, 3, 1, 0 ] ], 0.75 ] - ], - [ - [ [ [ -2, -1, 1, 3, 0, 0 ], [ -1, 0, 1, 2, 0, 0 ], [ -1, -1, 0, 3, 0, 0 ], [ -1, -1, 0, 4, 0, 0 ] ], 1.125 ] - ], - [ - [ [ [ -1, 0, 1, 2, 0, -1 ], [ -1, 0, 1, 2, 0, 0 ], [ -1, -1, 0, 3, 0, 0 ], [ -1, -1, 0, 4, 0, 0 ] ], 0.875 ] - ], - [ - [ [ [ -1, -1, 1, 2, 0, 0 ], [ -1, 0, 1, 2, 0, 0 ], [ -1, -1, 0, 3, 0, 0 ], [ -1, -1, 0, 4, 0, 0 ] ], 1.625 ] - ], - [ - [ [ [ -2, 0, 0, 3, 0, 0 ], [ -1, 0, 1, 2, 0, 0 ], [ -1, -1, 0, 3, 0, 0 ], [ -1, -1, 0, 4, 0, 0 ] ], 1.5 ] - ], - [ - [ [ [ -2, -1, 0, 4, 0, 0 ], [ -1, 0, 1, 2, 0, 0 ], [ -1, -1, 0, 3, 0, 0 ], [ -1, -1, 0, 4, 0, 0 ] ], 1.625 ] - ], - [ - [ [ [ -2, -1, 0, 4, 0, 0 ], [ -1, -1, 1, 3, 0, 0 ], [ -1, -1, 0, 3, 0, 0 ], [ -1, -1, 0, 4, 0, 0 ] ], 1.75 ] - ], - [ - [ [ [ -2, -1, 0, 4, 0, 0 ], [ -1, -1, 1, 3, 0, 0 ], [ -1, -1, 0, 3, 0, 0 ], [ -1, -1, 1, 4, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -2, -1, 0, 4, 0, 0 ], [ -1, -1, 1, 3, 0, 0 ], [ -1, -1, 0, 3, 0, 0 ], [ -1, 0, 0, 3, 0, 0 ] ], 1.25 ] - ], - [ - [ [ [ -1, -1, 1, 3, -1, 0 ], [ -1, -1, 1, 3, 0, 0 ], [ -1, -1, 0, 3, 0, 0 ], [ -1, 0, 0, 3, 0, 0 ] ], 0.75 ] - ], - [ - [ [ [ -1, -1, 1, 3, -1, 0 ], [ -1, -1, 1, 3, 0, 0 ], [ -2, -1, 1, 3, 0, 1 ], [ -1, 0, 0, 3, 0, 0 ] ], 1.5 ] - ], - [ - [ [ [ -1, -1, 1, 3, -1, 0 ], [ -1, -1, 1, 3, 0, 0 ], [ -1, 0, 0, 3, -1, 0 ], [ -1, 0, 0, 3, 0, 0 ] ], 1.75 ] - ], - [ - [ [ [ -1, -1, 1, 3, -1, 0 ], [ 0, -1, 1, 3, -2, 0 ], [ -1, 0, 0, 3, -1, 0 ], [ -1, 0, 0, 3, 0, 0 ] ], 1.25 ] - ], - [ - [ [ [ -1, -1, 1, 3, -1, 0 ], [ -1, 0, 1, 3, -1, 0 ], [ -1, 0, 0, 3, -1, 0 ], [ -1, 0, 0, 3, 0, 0 ] ], 1.5 ] - ], - [ - [ [ [ -1, -1, 1, 3, -1, 0 ], [ 0, -1, 0, 3, -1, 0 ], [ -1, 0, 0, 3, -1, 0 ], [ -1, 0, 0, 3, 0, 0 ] ], 1.75 ] - ], - [ - [ [ [ -1, -1, 0, 3, 0, 0 ], [ 0, -1, 0, 3, -1, 0 ], [ -1, 0, 0, 3, -1, 0 ], [ -1, 0, 0, 3, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -2, 0, 0, 3, 1, 0 ], [ 0, -1, 0, 3, -1, 0 ], [ -1, 0, 0, 3, -1, 0 ], [ -1, 0, 0, 3, 0, 0 ] ], 1.375 ] - ], - [ - [ [ [ -2, 0, 0, 3, 1, 0 ], [ 0, -1, 0, 3, -1, 0 ], [ -1, 0, 0, 3, -1, 0 ], [ -1, 1, 0, 3, -1, 0 ] ], 1.875 ] - ], - [ - [ [ [ -2, 1, 0, 3, 0, 0 ], [ 0, -1, 0, 3, -1, 0 ], [ -1, 0, 0, 3, -1, 0 ], [ -1, 1, 0, 3, -1, 0 ] ], 1.375 ] - ], - [ - [ [ [ -2, 1, 0, 3, 0, 0 ], [ 0, -1, 0, 3, -1, 0 ], [ -1, 0, 0, 3, -1, 0 ], [ -1, 0, 0, 3, -1, 1 ] ], 1.75 ] - ], - [ - [ [ [ -2, 1, 0, 3, 0, 0 ], [ 0, -1, 0, 3, -1, 0 ], [ -1, -1, 0, 4, -1, 0 ], [ -1, 0, 0, 3, -1, 1 ] ], 1.625 ] - ], - [ - [ [ [ 0, -1, -1, 3, -1, 0 ], [ 0, -1, 0, 3, -1, 0 ], [ -1, -1, 0, 4, -1, 0 ], [ -1, 0, 0, 3, -1, 1 ] ], 0.625 ] - ], - [ - [ [ [ 0, -1, -1, 3, -1, 0 ], [ 0, -1, 0, 3, -1, 0 ], [ -1, -1, 0, 4, -1, 0 ], [ 1, -2, 0, 3, -1, 0 ] ], 1.125 ] - ], - [ - [ [ [ 0, -1, -1, 3, -1, 0 ], [ 0, -1, 0, 3, -1, 0 ], [ 1, -2, 0, 3, -2, 0 ], [ 1, -2, 0, 3, -1, 0 ] ], 0.75 ] - ], - [ - [ [ [ 1, -3, 0, 3, -1, 0 ], [ 0, -1, 0, 3, -1, 0 ], [ 1, -2, 0, 3, -2, 0 ], [ 1, -2, 0, 3, -1, 0 ] ], 0.875 ] - ], - [ - [ [ [ 1, -3, 0, 3, -1, 0 ], [ 0, -1, 0, 3, -1, 0 ], [ 0, -2, 0, 3, -1, 1 ], [ 1, -2, 0, 3, -1, 0 ] ], 0.875 ] - ], - [ - [ [ [ 1, -3, 0, 3, -1, 0 ], [ 0, -1, 0, 3, -1, 0 ], [ 2, -3, 0, 3, -1, -1 ], [ 1, -2, 0, 3, -1, 0 ] ], 1.375 ] - ], - [ - [ [ [ 1, -2, 0, 3, -2, 0 ], [ 0, -1, 0, 3, -1, 0 ], [ 2, -3, 0, 3, -1, -1 ], [ 1, -2, 0, 3, -1, 0 ] ], 1.125 ] - ], - [ - [ [ [ 1, -2, 0, 3, -2, 0 ], [ 1, -2, -1, 3, -1, 0 ], [ 2, -3, 0, 3, -1, -1 ], [ 1, -2, 0, 3, -1, 0 ] ], 1 ] - ], - [ - [ [ [ 1, -2, 0, 3, -2, 0 ], [ 2, -2, 0, 2, -2, 0 ], [ 2, -3, 0, 3, -1, -1 ], [ 1, -2, 0, 3, -1, 0 ] ], 0.75 ] - ], - [ - [ [ [ 1, -2, 0, 3, -2, 0 ], [ 2, -2, 0, 2, -2, 0 ], [ 0, -2, 0, 4, -1, 0 ], [ 1, -2, 0, 3, -1, 0 ] ], 1.75 ] - ], - [ - [ [ [ 1, -2, 0, 3, -2, 0 ], [ 2, -2, 0, 2, -2, 0 ], [ 0, -2, 0, 4, -1, 0 ], [ 2, -2, 0, 3, -3, 0 ] ], 1.5 ] - ], - [ - [ [ [ 1, -2, 0, 3, -2, 0 ], [ 1, -2, 1, 3, -2, 0 ], [ 0, -2, 0, 4, -1, 0 ], [ 2, -2, 0, 3, -3, 0 ] ], 1.625 ] - ], - [ - [ [ [ 1, -2, 0, 3, -2, 0 ], [ 1, -2, 0, 3, -1, 0 ], [ 0, -2, 0, 4, -1, 0 ], [ 2, -2, 0, 3, -3, 0 ] ], 1 ] - ], - [ - [ [ [ 1, -1, 0, 3, -3, 0 ], [ 1, -2, 0, 3, -1, 0 ], [ 0, -2, 0, 4, -1, 0 ], [ 2, -2, 0, 3, -3, 0 ] ], 1.625 ] - ], - [ - [ [ [ 2, -2, -1, 3, -3, 0 ], [ 1, -2, 0, 3, -1, 0 ], [ 0, -2, 0, 4, -1, 0 ], [ 2, -2, 0, 3, -3, 0 ] ], 0.75 ] - ], - [ - [ [ [ -1, -3, 0, 3, -1, 0 ], [ 1, -2, 0, 3, -1, 0 ], [ 0, -2, 0, 4, -1, 0 ], [ 2, -2, 0, 3, -3, 0 ] ], 1.125 ] - ], - [ - [ [ [ -1, -3, 0, 3, -1, 0 ], [ 1, -2, 0, 3, -1, 0 ], [ 2, -4, 0, 3, -1, 0 ], [ 2, -2, 0, 3, -3, 0 ] ], 0.875 ] - ], - [ - [ [ [ -1, -3, 0, 3, -1, 0 ], [ 1, -3, 0, 3, -1, 1 ], [ 2, -4, 0, 3, -1, 0 ], [ 2, -2, 0, 3, -3, 0 ] ], 1.25 ] - ], - [ - [ [ [ -1, -3, 0, 3, -1, 0 ], [ 1, -3, 0, 3, -1, 1 ], [ 2, -4, 0, 3, -1, 0 ], [ 2, -4, 1, 3, -1, 0 ] ], 0.875 ] - ], - [ - [ [ [ -1, -3, 0, 3, -1, 0 ], [ 1, -3, 0, 3, -1, 1 ], [ 2, -4, 0, 3, -1, 0 ], [ 1, -4, 0, 3, -1, 0 ] ], 1.875 ] - ], - [ - [ [ [ -1, -3, 0, 3, -1, 0 ], [ 2, -4, 1, 3, -1, 0 ], [ 2, -4, 0, 3, -1, 0 ], [ 1, -4, 0, 3, -1, 0 ] ], 1.625 ] - ], - [ - [ [ [ -1, -3, 0, 3, -1, 0 ], [ 0, -4, 0, 3, -1, 0 ], [ 2, -4, 0, 3, -1, 0 ], [ 1, -4, 0, 3, -1, 0 ] ], 0.875 ] - ], - [ - [ [ [ -1, -3, 0, 3, -1, 0 ], [ -1, -2, 0, 3, -1, 0 ], [ 2, -4, 0, 3, -1, 0 ], [ 1, -4, 0, 3, -1, 0 ] ], 1.625 ] - ], - [ - [ [ [ -1, -3, 0, 3, -1, 0 ], [ -1, -2, 0, 3, -1, 0 ], [ 2, -4, 0, 3, -1, 0 ], [ 0, -2, 0, 3, -1, 0 ] ], 1.75 ] - ], - [ - [ [ [ -1, -3, 0, 3, -1, 0 ], [ 0, -3, -1, 3, -1, 0 ], [ 2, -4, 0, 3, -1, 0 ], [ 0, -2, 0, 3, -1, 0 ] ], 0.875 ] - ], - [ - [ [ [ -2, -2, 0, 3, 0, 0 ], [ 0, -3, -1, 3, -1, 0 ], [ 2, -4, 0, 3, -1, 0 ], [ 0, -2, 0, 3, -1, 0 ] ], 0.625 ] - ], - [ - [ [ [ -1, -4, 0, 3, -1, 1 ], [ 0, -3, -1, 3, -1, 0 ], [ 2, -4, 0, 3, -1, 0 ], [ 0, -2, 0, 3, -1, 0 ] ], 0.875 ] - ], - [ - [ [ [ -1, -4, 0, 3, -1, 1 ], [ 1, -5, 0, 3, -1, 0 ], [ 2, -4, 0, 3, -1, 0 ], [ 0, -2, 0, 3, -1, 0 ] ], 1.375 ] - ], - [ - [ [ [ -1, -4, 0, 3, -1, 1 ], [ 1, -5, 0, 3, -1, 0 ], [ 2, -4, 0, 3, -1, 0 ], [ 1, -5, 0, 4, -1, 0 ] ], 1.625 ] - ], - [ - [ [ [ -1, -4, 0, 3, -1, 1 ], [ 1, -5, 0, 3, -1, 0 ], [ 2, -4, 0, 3, -1, 0 ], [ 2, -4, 0, 3, -1, -1 ] ], 1 ] - ], - [ - [ [ [ 1, -6, 0, 3, -1, 0 ], [ 1, -5, 0, 3, -1, 0 ], [ 2, -4, 0, 3, -1, 0 ], [ 2, -4, 0, 3, -1, -1 ] ], 0.625 ] - ], - [ - [ [ [ 1, -6, 0, 3, -1, 0 ], [ 1, -5, 0, 3, -1, 0 ], [ 3, -5, -1, 3, -1, 0 ], [ 2, -4, 0, 3, -1, -1 ] ], 0.625 ] - ], - [ - [ [ [ 1, -6, 0, 3, -1, 0 ], [ 1, -5, 0, 3, -1, 0 ], [ 3, -6, 1, 3, -1, 0 ], [ 2, -4, 0, 3, -1, -1 ] ], 1.625 ] - ], - [ - [ [ [ 0, -6, 1, 3, -1, 1 ], [ 1, -5, 0, 3, -1, 0 ], [ 3, -6, 1, 3, -1, 0 ], [ 2, -4, 0, 3, -1, -1 ] ], 1.25 ] - ], - [ - [ [ [ 0, -6, 1, 3, -1, 1 ], [ 0, -5, 1, 3, -1, 1 ], [ 3, -6, 1, 3, -1, 0 ], [ 2, -4, 0, 3, -1, -1 ] ], 0.75 ] - ], - [ - [ [ [ 0, -6, 1, 4, -1, 0 ], [ 0, -5, 1, 3, -1, 1 ], [ 3, -6, 1, 3, -1, 0 ], [ 2, -4, 0, 3, -1, -1 ] ], 0.75 ] - ], - [ - [ [ [ 0, -6, 1, 4, -1, 0 ], [ 0, -5, 1, 4, -1, 0 ], [ 3, -6, 1, 3, -1, 0 ], [ 2, -4, 0, 3, -1, -1 ] ], 0.875 ] - ], - [ - [ [ [ 0, -6, 1, 4, -1, 0 ], [ 0, -5, 1, 4, -1, 0 ], [ 2, -6, 2, 4, -1, 0 ], [ 2, -4, 0, 3, -1, -1 ] ], 1 ] - ], - [ - [ [ [ 0, -6, 1, 4, -1, 0 ], [ 0, -5, 1, 4, -1, 0 ], [ 3, -7, 1, 4, -1, 0 ], [ 2, -4, 0, 3, -1, -1 ] ], 1 ] - ], - [ - [ [ [ 0, -6, 1, 4, -1, 0 ], [ 2, -7, 1, 3, -1, 0 ], [ 3, -7, 1, 4, -1, 0 ], [ 2, -4, 0, 3, -1, -1 ] ], 1.25 ] - ], - [ - [ [ [ 1, -7, 0, 4, -1, 0 ], [ 2, -7, 1, 3, -1, 0 ], [ 3, -7, 1, 4, -1, 0 ], [ 2, -4, 0, 3, -1, -1 ] ], 0.625 ] - ], - [ - [ [ [ 0, -7, 1, 5, -1, 0 ], [ 2, -7, 1, 3, -1, 0 ], [ 3, -7, 1, 4, -1, 0 ], [ 2, -4, 0, 3, -1, -1 ] ], 0.75 ] - ], - [ - [ [ [ 0, -7, 1, 5, -1, 0 ], [ 2, -7, 1, 3, -1, 0 ], [ 4, -7, 1, 2, -1, 0 ], [ 2, -4, 0, 3, -1, -1 ] ], 1 ] - ], - [ - [ [ [ 0, -7, 1, 5, -1, 0 ], [ 2, -5, 0, 3, -1, -1 ], [ 4, -7, 1, 2, -1, 0 ], [ 2, -4, 0, 3, -1, -1 ] ], 1.625 ] - ], - [ - [ [ [ 3, -7, 1, 2, -2, 0 ], [ 2, -5, 0, 3, -1, -1 ], [ 4, -7, 1, 2, -1, 0 ], [ 2, -4, 0, 3, -1, -1 ] ], 1.75 ] - ], - [ - [ [ [ 3, -7, 1, 2, -2, 0 ], [ 2, -5, 0, 3, -1, -1 ], [ 5, -7, 1, 2, -3, 0 ], [ 2, -4, 0, 3, -1, -1 ] ], 0.875 ] - ], - [ - [ [ [ 3, -7, 1, 2, -2, 0 ], [ 2, -5, 0, 3, -1, -1 ], [ 2, -3, 0, 3, -1, -1 ], [ 2, -4, 0, 3, -1, -1 ] ], 1.25 ] - ], - [ - [ [ [ 3, -7, 1, 2, -2, 0 ], [ 2, -5, 0, 3, -1, -1 ], [ 2, -4, 0, 3, -1, 0 ], [ 2, -4, 0, 3, -1, -1 ] ], 1.75 ] - ], - [ - [ [ [ 2, -5, -1, 3, -1, -1 ], [ 2, -5, 0, 3, -1, -1 ], [ 2, -4, 0, 3, -1, 0 ], [ 2, -4, 0, 3, -1, -1 ] ], 1.625 ] - ], - [ - [ [ [ 2, -5, -1, 3, -1, -1 ], [ 2, -5, 0, 3, -1, -1 ], [ 2, -4, 0, 3, -1, 0 ], [ 3, -5, -1, 3, -1, -1 ] ], 1.25 ] - ], - [ - [ [ [ 2, -5, -1, 3, -1, -1 ], [ 2, -5, 0, 3, -1, -1 ], [ 2, -4, 0, 3, -1, 0 ], [ 2, -5, 0, 4, -1, -1 ] ], 1.375 ] - ], - [ - [ [ [ 2, -5, -1, 3, -1, -1 ], [ 2, -5, 0, 3, -1, -1 ], [ 2, -4, 0, 3, -1, 0 ], [ 4, -5, -1, 2, -1, -1 ] ], 1.625 ], - [ [ [ "Rest" ], [ 2, -5, 0, 3, -1, -1 ], [ 2, -4, 0, 3, -1, 0 ], [ 4, -5, -1, 2, -1, -1 ] ], 1.125 ], - [ [ [ "Rest" ], [ 2, -5, 0, 3, -1, -1 ], [ "Rest" ], [ 4, -5, -1, 2, -1, -1 ] ], 1.75 ], - [ [ [ "Rest" ], [ 2, -5, 0, 3, -1, -1 ], [ "Rest" ], [ "Rest" ] ], 1.5 ], - [ [ [ "Rest" ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 3.0 ] - ] - ] -], -"last_changes": -[ - [ [ 3, -7, 1, 2, -2, 0 ], [ 2, -5, 0, 3, -1, -1 ], [ 2, -4, 0, 3, -1, 0 ], [ 2, -4, 0, 3, -1, -1 ] ], - [ [ 2, -5, -1, 3, -1, -1 ], [ 2, -5, 0, 3, -1, -1 ], [ 2, -4, 0, 3, -1, 0 ], [ 2, -4, 0, 3, -1, -1 ] ], - [ [ 2, -5, -1, 3, -1, -1 ], [ 2, -5, 0, 3, -1, -1 ], [ 2, -4, 0, 3, -1, 0 ], [ 3, -5, -1, 3, -1, -1 ] ], - [ [ 2, -5, -1, 3, -1, -1 ], [ 2, -5, 0, 3, -1, -1 ], [ 2, -4, 0, 3, -1, 0 ], [ 2, -5, 0, 4, -1, -1 ] ], - [ [ 2, -5, -1, 3, -1, -1 ], [ 2, -5, 0, 3, -1, -1 ], [ 2, -4, 0, 3, -1, 0 ], [ 4, -5, -1, 2, -1, -1 ] ] -], -"cur_uid": "55f9b81e", -"ref_uid": "726a40c7", -"order_seed": 540514, -"dur_seed": 331257, -"motifs_seed": 728928, -"entrances_probs_vals": [ 0, 0, 0, 0.66, 1.8406593406593, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"passages_probs_vals": [ 0, 0, 0, 0.66, 1.8406593406593, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"exits_probs_vals": [ 0, 0, 0, 0.66, 1.8406593406593, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"ranges": [ [ -2467, 2400 ], [ -1167, 2400 ], [ -702, 2400 ], [ -702, 2400 ] ], -"step_probs_vals": [ 0, 1200, 0, 0, 0.090534979423868, 0.92613636363636, 0.17489711934156, 0.079545454545455, 0.37037037037037, 0, 0.7201646090535, 0, 1, 0 ], -"passages_weights": [ 0.63, 0.62, 1, 0.41, 1 ], -"hd_exp": 3.09, -"hd_invert": 0, -"order": -[ - [ [ 2, 0, 1 ], [ 3 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 1, 2, 3 ], [ 0 ], [ ] ], - [ [ 2, 1, 3 ], [ 0 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 2, 1, 3 ], [ 0 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 3, 2, 1 ], [ 0 ], [ ] ], - [ [ 3, 0, 1 ], [ 2 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 1, 2, 3 ], [ 0 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 0, 1, 2 ], [ 3 ], [ ] ], - [ [ 1, 3, 2 ], [ 0 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 0, 1, 2 ], [ 3 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 1, 3, 2 ], [ 0 ], [ ] ], - [ [ 3, 2, 1 ], [ 0 ], [ ] ], - [ [ 2, 3, 0 ], [ 1 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 2, 1, 0 ], [ 3 ], [ ] ], - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 2, 3, 0 ], [ 1 ], [ ] ], - [ [ 3, 2, 0 ], [ 1 ], [ ] ], - [ [ 1, 2, 3 ], [ 0 ], [ ] ], - [ [ 1, 2, 3 ], [ 0 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 2, 1, 3 ], [ 0 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 3, 0, 1 ], [ 2 ], [ ] ], - [ [ 2, 1, 3 ], [ 0 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 3, 0, 1 ], [ 2 ], [ ] ], - [ [ 2, 1, 0 ], [ 3 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 2, 0, 3 ], [ 1 ], [ ] ], - [ [ 2, 1, 3 ], [ 0 ], [ ] ], - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 2, 3, 0 ], [ 1 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 2, 0, 1 ], [ 3 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 3, 2, 0 ], [ 1 ], [ ] ], - [ [ 2, 0, 1 ], [ 3 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 1, 3, 2 ], [ 0 ], [ ] ], - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 2, 3, 0 ], [ 1 ], [ ] ], - [ [ 0, 2, 1 ], [ 3 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 1, 2, 3 ], [ 0 ], [ ] ], - [ [ 3, 2, 0 ], [ 1 ], [ ] ], - [ [ 2, 1, 3 ], [ 0 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 1, 3, 0 ], [ 2 ], [ ] ], - [ [ 3, 0, 1 ], [ 2 ], [ ] ], - [ [ 2, 3, 0 ], [ 1 ], [ ] ], - [ [ 2, 1, 3 ], [ 0 ], [ ] ], - [ [ 1, 2, 3 ], [ 0 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 3, 0, 1 ], [ 2 ], [ ] ], - [ [ 3, 0, 1 ], [ 2 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 1, 3, 2 ], [ 0 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 0, 2, 1 ], [ 3 ], [ ] ], - [ [ 0, 2, 1 ], [ 3 ], [ ] ] -], -"sus_weights": [ 0, 0, 0.61 ], -"order_size": [ 100, 100 ], -"passages_size": [ 0, 0 ], -"motif_edited": "false", -"order_edited": "false" -} \ No newline at end of file diff --git a/resources/string_quartet_3/577cf188/577cf188_code.scd b/resources/string_quartet_3/577cf188/577cf188_code.scd deleted file mode 100644 index 5a3854b..0000000 --- a/resources/string_quartet_3/577cf188/577cf188_code.scd +++ /dev/null @@ -1,945 +0,0 @@ -( -// helper funcs -var hsArrayToCents, pDist, hdSum, hsChordalDistance, hsArrayToFreq; - -// score funcs -var isInRange, spacingScore, rangeScore, intervalScore, inclusionScore; - -// subroutines -var genTuples, initVoices, genOrders, genSubMotif, updateVoices, genDurFunc, genStepFunc; - -// primary routines -var genMotif, genSecondarySeq; - -// audition funcs -var genPatterns, genMidiPatterns; - -// resource management funcs -var seedFunc, genUID, writeResources, stringifyToDepth, setSeeds, sanityCheck, -msgInterpret, loadLedgerFile, loadLedgerJSON, loadModelFile, loadModelJSON, -setGlobalVars, globalVarsToDict, saveLedger; - -// model vars -//(model and global vars mostly set by OSC funcs -var seq, lastXChanges, -curUID, refUID, orderSeed, durSeed, motifSeed, -entrancesProbVals, passagesProbVals, exitsProbVals, -ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, -orders, susWeights, orderSize, passagesSize, -motifEdited, orderEdited; - -// model aux vars -var entrancesDurFunc, passagesDurFunc, exitsDurFunc, stepFunc; - -// other global vars -var popSize, exPath, dir, primes, dims, tuples, -group, player, resourceDir, ledgerPath, ledger, currentlyPlayingUID, -nameSpaces; - -// install JSON quark (not used) -/* -if(Quarks.isInstalled("JSONlib").not, { - Quarks.install("https://github.com/musikinformatik/JSONlib.git"); - thisProcess.recompile; - //HelpBrowser.openHelpFor("Classes/JSONlib"); -}); -*/ - - -//------helper funcs - -hsArrayToCents = { - arg hsArray; - hsArray.collect({arg dist, p; dist * 1200 * log2(primes[p][0]/primes[p][1])}).sum -}; - -pDist = { - arg array1, array2, signed = false; - var pDistance; - pDistance = hsArrayToCents.value(array1) - hsArrayToCents.value(array2); - if(signed, {pDistance}, {abs(pDistance)}) -}; - -hdSum = { - arg hsArrays; - var size, distances, mean; - size = hsArrays.size; - distances = (size - 1).collect({arg i; - ((i + 1)..(size - 1)).collect({arg j; - abs(hsArrays[i] - hsArrays[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsChordalDistance = { - arg hsArrays1, hsArrays2; - var size, distances, mean; - size = hsArrays1.size; - distances = hsArrays1.size.collect({arg i; - hsArrays2.size.collect({arg j; - abs(hsArrays1[i] - hsArrays2[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsArrayToFreq = { - arg array; - array.collect({arg dim, d; pow(primes[d][0]/primes[d][1], dim)}).product -}; - -//------score funcs - -/* -isInRange = { - arg hsArray, min, max; - var cents; - cents = hsArrayToCents.value(hsArray); - (cents >= min) && (cents <= max) -}; -*/ - -spacingScore = { - arg hsArrays, min; - var centsArray; - centsArray = hsArrays.collect({arg hsArray; hsArrayToCents.value(hsArray)}).sort({arg a, b; a < b}); - centsArray.differentiate.drop(1).collect({arg pDistance; if(pDistance >= min, {1}, {0.01})}).sum; -}; - -rangeScore = { - arg hsArray1, hsArray2, min, max, low, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - if((pDistance >= min) && (pDistance <= max), {1}, {low}); -}; - -intervalScore = { - arg hsArray1, hsArray2, mean, sd, signed = true; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - //pDistance.gaussCurve(1, mean, sd) - stepFunc.value(pDistance); -}; - -inclusionScore = { - arg array, test, min = 0.01; - if(array.collect({arg v; v.hash}).includes(test.hash), {min}, {1}); -}; - - -//------subroutines - -genTuples = { - var tuples; - tuples = dims.collect({[-1, 0, 1]}).allTuples.select({arg tuple; (abs(tuple.drop(1)).sum <= 1) && (tuple[0] == 0)}); - tuples = tuples ++ tuples.collect({arg tuple; [-3, -2, -1, 1, 2, 3].collect({arg octTrans; tuple.deepCopy.put(0, octTrans)})}).flatten; -}; - -initVoices = { - var init, voicesInit; - voicesInit = popSize.collect({dims.collect({0})}); - /* - voicesInit = [dims.collect({0})]; - (popSize - 1).do({ - arg rep, new; - rep = dims.rand; - new = voicesInit.last.deepCopy; - new[rep] = new[rep] + [-1, 1].choose(); - voicesInit = voicesInit.add(new); - }); - */ - voicesInit.deepCopy; -}; - -genDurFunc = {arg chordProb, minPad, maxPad, minDur, maxDur, envData, seed; - var env, pTable, durFunc; - env = Env.pairs([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).asSignal(256).asList.asArray; - pTable = env.asRandomTable; - [chordProb, minPad, maxPad, minDur, maxDur, envData].postln; - durFunc = {arg allowChord, pad = false; - var res; - res = if(allowChord.not, { - pTable.tableRand * (maxDur - minDur) + minDur - }, { - if(1.0.rand < chordProb, {0}, {pTable.tableRand * (maxDur - minDur) + minDur}); - }).round(0.125); - if(pad, {res = res + rrand(minPad.asFloat, maxPad.asFloat).round(0.125)}); - if(res.asInteger == res, {res = res.asInteger}); - res - }; - seedFunc.value(durFunc, seed); -}; - -genStepFunc = {arg minStep, maxStep, envData, seed; - var envDataNorm, env, pTable, stepFunc; - [minStep, maxStep, envData].postln; - envDataNorm = ([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).flop; - envDataNorm = [envDataNorm[0].normalize(minStep, maxStep), envDataNorm[1]].flop; - env = Env.pairs(envDataNorm); - stepFunc = {arg pDist; - env.at(pDist).clip(0.001, 1); - }; - seedFunc.value(stepFunc, seed); -}; - -genOrders = {arg minMotifLength = 1, maxMotifLength = 5, minProgLength = 0, maxProgLength = 5; - ((maxMotifLength - minMotifLength).rand + minMotifLength).collect({ - var noProgIns, noSusIns, noSilentIns, prog, sus, silent, order; - noSusIns = [1, 2, 3].wchoose(susWeights.normalizeSum); - noProgIns = (popSize - noSusIns).rand + 1; - noSilentIns = popSize - noSusIns - noProgIns; - - # prog, sus, silent = (0..(popSize-1)).scramble.clumps([noProgIns, noSusIns, noSilentIns]); - - prog = (prog.scramble ++ ((maxProgLength - minProgLength).rand + minProgLength).collect({prog.choose}).scramble); - if(silent == nil, {silent = []}); - [sus.scramble, prog, silent.scramble] - }); -}; - -updateVoices = {arg ins, sus; - var voices, candidates, nWeights, nProbs, sel; - - voices = lastXChanges.deepCopy.last; - - candidates = sus.collect({arg v; tuples.collect({arg t; voices[v] + t})}).flatten; - candidates = difference(candidates.asSet, voices.asSet).asList; - nProbs = candidates.collect({arg candidate; - var stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore; - - //stepScore = intervalScore.value(voices[ins], candidate, 30, 400, 0.1); - stepScore = intervalScore.value(voices[ins], candidate, 100, 100); - recentlySoundedScore = inclusionScore.value(lastXChanges.flop[ins], candidate, 0); - isInRangeScore = rangeScore.value(candidate, candidate.collect({0}), ranges[ins][0], ranges[ins][1], 0, true); - regScore = spacingScore.value(voices.deepCopy.put(ins, candidate), 300); - hdScore = pow(hdSum.value(voices.deepCopy.put(ins, candidate)), hdExp); - if(hdInvert == 0, {hdScore = 1/hdScore}); - //maybe what you want here is a vector to another root and then favoring movement towards it. - //distScore = pow(hsChordalDistance.value(voices, voices.put(ins, candidate)), 2); - - [stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore] - }); - - nWeights = passagesWeights; - - //this handles nWeights of 0; mainly for testing - nProbs = nProbs.flop.select({arg scores, s; nWeights[s] != 0}).flop; - nWeights = nWeights.select({arg weight; weight != 0}); - nProbs = nProbs.flop.collect({arg scores, s; - if(scores.sum == 0, {scores}, {scores.normalizeSum * nWeights[s]}) - }); - nProbs = nProbs.flop.collect({arg scores, s; scores.product}).normalizeSum; - - sel = candidates.wchoose(nProbs); - - voices[ins] = sel; - lastXChanges = lastXChanges.add(voices).keep(-5); -}; - -genSubMotif = {arg order, orderIndex, lastState, repeatLast = false, startFromLast = false, isLastOrder = false; - var sus, prog, silent, flatOrder, res, isInChord, allowChord, pad, lastXChangesHold, voices, adder; - # sus, prog, silent = order; - flatOrder = silent ++ sus ++ prog; - lastXChangesHold = lastXChanges.deepCopy; - voices = lastState.deepCopy; - isInChord = popSize.collect({false}); - allowChord = false; - pad = false; - res = []; - "------generating motif".postln; - //need to figure out here if voices move between motifs - flatOrder.do({arg ins, i; - - if(prog.includes(ins) && repeatLast.not, {updateVoices.value(ins, sus)}); - adder = if(silent.includes(ins), {["Rest"]}, {lastXChanges.last.deepCopy[ins]}); - - if(voices[ins] != adder, { - var dur; - - if((sus ++ silent).includes(ins), { - allowChord = (ins != sus.last); - pad = (ins == sus.last); - }, { - if(i < (flatOrder.size - 1), { - allowChord = (isInChord[flatOrder[i + 1]] || (ins == flatOrder[i + 1])).not; - pad = false; - }, { - allowChord = false; - pad = true - }); - }); - if((orderIndex == 0) && sus.includes(ins), { - dur = entrancesDurFunc.value(allowChord, pad); - }, { - dur = passagesDurFunc.value(allowChord, pad); - }); - if(dur == 0, {isInChord[ins] = true}, {isInChord = popSize.collect({false})}); - - voices[ins] = adder; - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - - // pad ending - if(orderIndex == (orders.size - 1), { - (0..(popSize-1)).scramble.do({arg ins; - if(res.last.first[ins] != ["Rest"], { - var dur; - voices[ins] = ["Rest"]; - allowChord = (voices != popSize.collect({["Rest"]})); - pad = allowChord.not; - dur = exitsDurFunc.value(allowChord, pad); - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - }); - - //format and return - if(startFromLast, {lastXChanges = lastXChangesHold.deepCopy}); - res; -}; - - -//------primary routines - -genMotif = { - var repeats, fSeq, fDur, durAdd; - - repeats = 1; - fSeq = []; - - repeats.do({arg index; - var motif; - - motif = []; - - orders.do({arg order, o; - var lastState, subMotif; - lastState = if(o == 0, {popSize.collect({["Rest"]})}, {motif.last.last.first}); - subMotif = genSubMotif.value(order, o, lastState, isLastOrder: o == (orders.size - 1)); - motif = motif.add(subMotif); - - }); - - sanityCheck.value(motif, index); - - fSeq = fSeq.add(motif); - }); - - //round last duration to measure - fDur = fSeq.flatten.flatten.slice(nil, 1).sum; - durAdd = fDur.round(4) - fDur; - if(durAdd < 0, {durAdd = 4 - durAdd}); - fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] = fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] + durAdd; - - fSeq -}; - -genSecondarySeq = {arg seq; - var curdles, fSeq; - curdles = []; - while({curdles.sum < seq.size}, {curdles = curdles ++ [3.rand + 1]}); - - fSeq = seq.clumps(curdles).collect({arg clump, m; - var repeats, paddedSeq; - - //add rest - paddedSeq = clump.add([[[popSize.collect({["Rest"]}), 0.5.rand]]]); - - //implement repeats - repeats = [0.rand + 1, 1].wchoose([1, 0].normalizeSum); - repeats.collect({paddedSeq}); - }); - fSeq -}; - - -//------audition funcs - -/* -Event.addEventType(\osc, { - if (~addr.postln.notNil) { - ~addr.sendMsg(~indexPath, ~indexMsg); - ~addr.sendMsg(~seqPath, stringifyToDepth.value(~seqMsg, 3)); - //~addr.sendMsg("/STATE/OPEN", (dir.replace("supercollider", "resources") +/+ ~idMsg +/+ ~idMsg ++ "_gui_state" ++ ".state").standardizePath.postln); - }; -}); -*/ - -Event.addEventType(\osc, { - if (~addr.notNil) { - ~msg; - ~addr.sendMsg(~path, *~msg); - }; -}); - -genPatterns = {arg inSeq, addr, oneShot = false; - var voices, durs, pbinds, res, indices, sectionDurs, msg, ids, seq; - seq = inSeq.collect({arg mSeq; mSeq[0]}); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - pbinds = voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs, attacks, rels, amps; - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - //attacks = 2.collect({rrand(1, 3)}) ++ freqs.drop(2).collect({rrand(0.3, 0.5)}); - attacks = fDurs.collect({arg dur; dur * rrand(0.2, 0.4)}); - //rels = freqs.drop(2).collect({rrand(0.3, 0.5)}) ++ 2.collect({rrand(1, 3)}); - rels = (clumps.size - 1).collect({arg c; - if(clumps[c + 1][0] == ["Rest"], {rrand(1.0, 3.0)}, {rrand(0.3, 0.5)}); - }); - rels = rels.add(rrand(1.0, 3.0)); - amps = freqs.collect({rrand(0.6, 0.99)}); - - [ - Pbind( - \instrument, \string_model, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \attack, Pseq(attacks, 1), - \sustain, Pseq(fDurs, 1), - \release, Pseq(rels, 1), - //\amp, Pseq(amps, 1), - \amp, Pbrown(0.5, 1, 0.5), - \busIndex, v - ), - Pbind( - \instrument, \sine, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \sustain, Pseq(fDurs, 1), - \busIndex, v - ) - ] - }).flatten; - if(oneShot.not, { - msg = inSeq.collect({arg mSeq, m; mSeq[1..]}); - //ids = inSeq.collect({arg mSeq, m; mSeq[2]}); - sectionDurs = seq.collect({arg mSeq; mSeq.flatten2(mSeq.maxDepth - 5).flop[1].sum}); - pbinds = pbinds ++ - [ - Pbind( - \type, \osc, - \addr, addr, - \path, "/playing", - \msg, Pseq(msg, 1), - \dur, Pseq(sectionDurs, 1) - ); - ] - }); - res = Ppar(pbinds); - res -}; - -/* -genMidiPatterns = {arg seq; - var voices, durs, patterns, res, mOut, pbRange; - pbRange = 1; //semitones - change this as needed for your situation - mOut = MIDIOut.newByName("TiMidity", "TiMidity port 0").latency_(Server.default.latency); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - res = Ppar( - voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs; - - mOut.program(v, 70); - - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - - Pbind( - \type, \midi, - \chan, v, - \noteval, Pseq(freqs.cpsmidi - 24, 1), - \note, Pfunc({ | event | event[\noteval].floor }), - \dur, Pseq(fDurs, 1), - \midiout, mOut, - \amp, 1, - \bend, Pfunc({ - | event | - if (event[\note].isRest.not) { - var pitchbendvalue = event[\noteval].frac.linlin(0, pbRange, 8192, 8192*2).asInteger; - m.bend(v, pitchbendvalue); - }; - 0; // return something other than nil to avoid stopping the pattern - }), - ); - }); - ); - res -}; -*/ - - -//------resource management funcs - -genUID = {Date.seed.asHexString.toLower}; - -seedFunc = {arg func, seed; - var funcArgs, next; - next = Routine({loop{func.valueArray(funcArgs).yield }}); - next.randSeed_(seed); - {arg ...args; funcArgs = args; next.value} -}; - -stringifyToDepth = {arg data, maxDepth = 1; - var prettyString = "", rCount = 0, writeArray, indent; - - if(maxDepth == 0, { - data.asCompileString - }, { - indent = {arg size; size.collect({" "}).join("")}; - writeArray = {arg array; - prettyString = prettyString ++ indent.value(rCount) ++ "[\n"; - rCount = rCount + 1; - if(rCount < maxDepth, { - array.do({arg subArray; writeArray.value(subArray)}); - }, { - prettyString = prettyString ++ array.collect({arg subArray; - indent.value(rCount + 1) ++ subArray.asCompileString - }).join(",\n"); - }); - rCount = rCount - 1; - prettyString = prettyString ++ "\n" ++ indent.value(rCount) ++ "],\n"; - }; - - writeArray.value(data); - prettyString.replace(",\n\n", "\n").drop(-2); - }) -}; - -sanityCheck = {arg motif, index; - //print functions = very helpful - ("----------" + index + "------------").postln; - - motif.flatten.do({arg val, v; - if(v > 0, { - if(motif.flatten[v-1][0].hammingDistance(val[0]) > 1, {"problem 1".postln}); - if(motif.flatten[v-1][0].hammingDistance(val[0]) == 0, {"problem 2".postln}); - }); - val.postln - }); - "***********".postln; -}; - -msgInterpret = {arg in, escapeDoubleQuotes = true, escapeSingleQuotes = true; - var res; - - res = in; - if(res.isNil.not, { - if((res.isArray && res.isString.not), { - res = res.asCompileString; - res = res.replace(" ", "").replace("\n", "").replace("\t", ""); - if(escapeSingleQuotes, {res = res.replace("\'", "")}); - if(escapeDoubleQuotes, {res = res.replace("\"", "")}); - res = res.replace("Rest", "\"Rest\""); - res = res.interpret; - }, { - var tmpRes; - if(res.every({arg char; char.isDecDigit}), {tmpRes = res.asInteger}); - if(res.contains("."), {tmpRes = res.asFloat}); - if(tmpRes != nil, {res = tmpRes}); - }); - }); - res -}; - -writeResources = {arg path, dict; - var file, modelItems, resString; - file = File(path,"w"); - - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - - resString = nameSpaces.collect({arg nameSpace; - var depth = 0, insert = " "; - if(nameSpace == "music_data", {depth = 3; insert = "\n"}); - if(nameSpace == "last_changes", {depth = 1; insert = "\n"}); - if(nameSpace == "order", {depth = 1; insert = "\n"}); - if((nameSpace == "ref_uid") && (dict[nameSpace] == nil), {dict[nameSpace] = "nil"}); - "\"" ++ nameSpace ++ "\":" ++ insert ++ stringifyToDepth.value(dict[nameSpace], depth) - }).join(",\n"); - - resString = "{\n" ++ resString ++ "\n}"; - - file.write(resString); - file.close; - resString -}; - -loadModelFile = {arg path; loadModelJSON.value(File(path, "r").readAllString.parseJSON)}; - -loadModelJSON = {arg jsonObject; - var dict; - dict = Dictionary.with(*nameSpaces.collect({arg nS; nS->msgInterpret.value(jsonObject[nS])})); - dict -}; - -setGlobalVars = {arg dict, skipLastXChanges = false; - var tmpLastXChanges; - tmpLastXChanges = lastXChanges.deepCopy; - // order really matters!!!! - # seq, lastXChanges, curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited = nameSpaces.collect({arg nS; dict[nS]}); - if(skipLastXChanges, {lastXChanges = tmpLastXChanges}); - dict -}; - -globalVarsToDict = { - var modelItems, dict; - // order really matters!!!! - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - dict = Dictionary.with(*nameSpaces.collect({arg nS, n; nS->modelItems[n]})); -}; - -loadLedgerFile = {arg path; - ledgerPath = path; - resourceDir = path.splitext(".").drop(-1).join; - loadLedgerJSON.value(File(ledgerPath, "r").readAllString.parseJSON) -}; - -loadLedgerJSON = {arg jsonObject; ledger = jsonObject["ledger"]}; - -saveLedger = {arg ledger, path; - var file, curResourceDir; - file = File(path, "w"); - curResourceDir = resourceDir; - resourceDir = path.splitext(".").drop(-1).join; - if(curResourceDir != resourceDir, { - File.mkdir(resourceDir); - ledger.do({arg id; - File.copy(curResourceDir +/+ id, resourceDir +/+ id); - }); - }); - file.write("{\n\"ledger\":\n" ++ stringifyToDepth.value(ledger, 1) ++ "\n}"); - file.close; -}; - -//------global vars - -primes = [[2, 1], [3, 2], [5, 4], [7, 4], [11, 8], [13, 8]]; -//ranges = [[-2400, 0], [-1200, 1200], [0, 2400], [0, 2400]]; -exPath = thisProcess.nowExecutingPath; -dir = exPath.dirname; -//popSize = 4; -dims = primes.size; -tuples = genTuples.value(); -//refUID = nil; -group = Group.new; -~group = group; -loadLedgerFile.value(dir +/+ ".." +/+ "resources" +/+ "piece_ledger.json"); -resourceDir = (dir +/+ ".." +/+ "resources" +/+ "piece_ledger"); -//passagesWeights = [1, 1, 1, 1, 1]; -//susWeights = [1, 1, 1]; -// order really matters!!!! -nameSpaces = [ - "music_data", "last_changes", "cur_uid", "ref_uid", "order_seed", "dur_seed", "motifs_seed", - "entrances_probs_vals","passages_probs_vals", "exits_probs_vals", - "ranges", "step_probs_vals", "passages_weights", "hd_exp", "hd_invert", - "order", "sus_weights", "order_size", "passages_size", - "motif_edited", "order_edited" -]; - - -//------OSC funcs - -OSCdef(\load_ledger, {arg msg, time, addr, port; - loadLedgerFile.value(msg[1].asString); -}, \load_ledger); - -OSCdef(\load_model, {arg msg, time, addr, port; - var dict; - dict = loadModelFile.value(msg[1].asString); - setGlobalVars.value(dict); -}, \load_model); - -OSCdef(\save_ledger, {arg msg, time, addr, port; - msg.postln; - ledger = msgInterpret.value(msg[1].asString.parseJSON["ledger"], false).postln; - //loadLedgerJSON.value(msg[0]) - saveLedger.value(ledger, msg[2].asString); - //loadLedgerFile.value(msg[1].asString); -}, \save_ledger); - -OSCdef(\generate, {arg msg, time, addr, port; - var path, dict, durSeeds, musPath, modelString; - msg.postln; - - path = msg[1].asString; - - dict = loadModelFile.value(path); - setGlobalVars.value(dict, true); - - popSize = ranges.size; - - //refUID.postln; - - loadLedgerFile.value(ledgerPath); - if(ledger == nil, {ledger = ["tmp"]}); - if(ledger.last != "tmp", {ledger = ledger.add("tmp")}); - - if(refUID == nil, {lastXChanges = [initVoices.value().deepCopy]}); - if((refUID != nil) && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - lastXChanges = msgInterpret.value(file.readAllString.parseJSON["last_changes"]); - }); - - refUID.postln; - lastXChanges.collect({arg item; item.postln}); - - durSeeds = seedFunc.value({3.collect({rrand(100000, 999999)})}, durSeed).value.postln; - entrancesDurFunc = genDurFunc.valueArray(entrancesProbVals[..4] ++ [entrancesProbVals[5..]] ++ [durSeeds[0]]); - passagesDurFunc = genDurFunc.valueArray(passagesProbVals[..4] ++ [passagesProbVals[5..]] ++ [durSeeds[1]]); - exitsDurFunc = genDurFunc.valueArray(exitsProbVals[..4] ++ [exitsProbVals[5..]] ++ [durSeeds[2]]); - - if(orders == nil, { - orders = seedFunc.value(genOrders, orderSeed).valueArray(orderSize ++ passagesSize); - //addr.sendMsg("/order", stringifyToDepth.value(orders, 1)); - }); - - stepFunc = genStepFunc.valueArray(stepProbsVals[..1] ++ [stepProbsVals[2..]] ++ [motifSeed]); - seq = seedFunc.value(genMotif, motifSeed).value; - - lastXChanges.collect({arg item; item.postln}); - - dict = globalVarsToDict.value; - modelString = writeResources.value(path, dict); - - //addr.sendMsg("/generated", musPath, stringifyToDepth.value(seq, 3)); - //~seq = seq; - - addr.sendMsg("/generated", path, modelString, ledgerPath); -}, \generate); - - -OSCdef(\commit, {arg msg, time, addr, port; - var musicData, musicChanged, dict, newLedger, modelPath, musString, musFile, test1, test2, lastCurUID, commitType, commitPos, equalityLedger; - //msg.postln; - - /* - test1 = msg[1].asString.parseJSON; - test2 = (dir +/+ ".." +/+ "resources/tmp/tmp_music" ++ ".json").standardizePath.parseJSONFile; - msgInterpret.value(test1["music"])[0][0][0][1].class.postln; - msgInterpret.value(test2["music_data"])[0][0][0][1].class.postln; - (test1["music"] == test2["music_data"]).postln; - */ - - musicData = loadModelJSON.value(msg[1].asString.parseJSON)["music_data"].postln; - musicChanged = (musicData != seq).postln; - commitType = msg[2].asString; - commitPos = msg[3].postln.asInteger; - - lastCurUID = curUID.deepCopy; - curUID = genUID.value; - - File.mkdir((resourceDir +/+ curUID).standardizePath); - File.copy(exPath, (resourceDir +/+ curUID +/+ curUID ++ "_code" ++ ".scd").standardizePath); - - modelPath = (resourceDir +/+ curUID +/+ curUID ++ "_mus_model" ++ ".json").standardizePath; - dict = globalVarsToDict.value; - if(musicChanged, { - seq = musicData; - dict["music_data"] = seq; - dict["motif_edited"] = "true" - }); - dict["cur_uid"] = curUID; - - writeResources.value(modelPath, dict); - - File.delete(ledgerPath ++ "_bak"); - File.copy(ledgerPath, ledgerPath ++ "_bak"); - File.delete(ledgerPath); - - /* - if(commitType == "add", { - if(lastCurUID == "tmp", { - ledger = ledger.drop(-1).add(curUID); - }, { - ledger = ledger.add(curUID); - }) - }); - */ - - ledger.postln; - - if(commitType == "add", {ledger = ledger.add(curUID)}); - - if(commitType == "insert", {ledger = ledger.insert(commitPos + 1, curUID)}); - - if(commitType == "replace", {ledger = ledger.put(commitPos, curUID)}); - - equalityLedger = ledger.collect({arg item; item.asSymbol}); - if(equalityLedger.includes(\tmp).postln, {ledger.removeAt(equalityLedger.indexOf(\tmp).postln)}); - - ledger.postln; - - saveLedger.value(ledger, ledgerPath); - - addr.sendMsg("/committed", curUID, ledgerPath); - //refUID = curUID; - -}, \commit); - -OSCdef(\transport, {arg msg, time, addr, port; - msg.postln; - if(msg[1] == 0, { - group.set(\release, 2); - group.set(\gate, 0); - player.stop; - }, { - // the cued sequence can now be read from file, so this can be cleaned up - var cSize, patterns, pSeq, cuedSeek, indexStart, indexEnd, tmpLedger; - if(msg[1] == 1, { - pSeq = []; - cuedSeek = (seq != nil); - indexStart = msg[2].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.postln.parseJSON["music_data"]), path, indexStart + index, uid]); - file.close; - }); - }); - if(cuedSeek, { - var path, file; - path = (resourceDir +/+ "tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - patterns = genPatterns.value(pSeq, addr); - }, { - pSeq = [loadModelJSON.value(msg[2].asString.parseJSON)["music_data"].postln]; - patterns = genPatterns.value(pSeq, addr, true); - }); - player = Pfset(pattern: patterns, cleanupFunc: { - addr.sendMsg("/transport", 0); - addr.sendMsg("/one_shot", 0); - }); - player = player.play - }); -}, \transport); - - -OSCdef(\transcribe_motif, {arg msg, time, addr, port; - var tSeq, refChord, refUID; - - msg.postln; - - tSeq = [loadModelJSON.value(msg[1].asString.parseJSON)["music_data"]]; - refUID = msg[2].asString.postln; - - if((refUID != "nil") && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }, { - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - }); - - ~transcribe.value(tSeq, refChord, (dir +/+ ".." +/+ "lilypond" +/+ "includes").standardizePath, addr, "/transcribe_motif"); -}, \transcribe_motif); - - -OSCdef(\transcribe_all, {arg msg, time, addr, port; - var cSize, patterns, cuedSeek, indexStart, indexEnd, tmpLedger; - if(true, { - cuedSeek = (seq != nil); - indexStart = msg[1].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - - //tmp for testing transcription - //indexEnd = (indexStart+5); - - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - var lilyPartLedgerFiles; - - lilyPartLedgerFiles = 4.collect({arg p; - File((dir +/+ ".." +/+ "lilypond" +/+ "includes" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly").standardizePath, "w"); - }); - - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file, fileString, tSeq, refUID, refChord; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - fileString = file.readAllString; - tSeq = msgInterpret.value(fileString.parseJSON["music_data"]); - refUID = msgInterpret.value(fileString.parseJSON["ref_uid"]); - file.close; - - //uid.postln; - //(refUID == "nil").postln; - - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - - if(refUID != "nil", { - path = (resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }); - - if(index != indexEnd, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath); - }, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath, addr, "/transcribe_all"); - }); - - lilyPartLedgerFiles.do({arg f, p; - f.write("\\include \"" ++ resourceDir +/+ uid +/+ "lilypond" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly\"\n"); - }); - - }); - - lilyPartLedgerFiles.do({arg f; - f.close - }); - }); - /* - if(cuedSeek, { - var path, file; - path = (dir +/+ ".." +/+ "resources/tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - */ - }, { - - }); - -}, \transcribe_all); - -) - - diff --git a/resources/string_quartet_3/577cf188/577cf188_mus_model.json b/resources/string_quartet_3/577cf188/577cf188_mus_model.json deleted file mode 100644 index b37c8be..0000000 --- a/resources/string_quartet_3/577cf188/577cf188_mus_model.json +++ /dev/null @@ -1,198 +0,0 @@ -{ -"music_data": -[ - [ - [ - [ [ [ "Rest" ], [ "Rest" ], [ "Rest" ], [ 0, 0, 0, 0, 0, 0 ] ], 0 ], - [ [ [ "Rest" ], [ 0, 0, 0, 0, 0, 0 ], [ "Rest" ], [ 0, 0, 0, 0, 0, 0 ] ], 0 ], - [ [ [ "Rest" ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 2.375 ], - [ [ [ -1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1.875 ] - ], - [ - [ [ [ 0, -1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1.5 ] - ], - [ - [ [ [ 0, -1, 0, 0, 0, 0 ], [ 1, -1, 0, 0, -1, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1.125 ] - ], - [ - [ [ [ 1, -2, 0, 0, -1, 0 ], [ 1, -1, 0, 0, -1, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1.625 ] - ], - [ - [ [ [ 0, -1, 1, 0, -1, 0 ], [ 1, -1, 0, 0, -1, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 2.5 ] - ], - [ - [ [ [ 0, -1, 1, 0, -1, 0 ], [ 0, 0, 1, 0, -1, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 2 ] - ], - [ - [ [ [ 0, -1, 1, 0, -1, 0 ], [ 0, -1, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 2.625 ] - ], - [ - [ [ [ 0, -1, 1, 0, -1, 0 ], [ 0, -1, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 1, -1, 0, 0, -1, 0 ] ], 1.125 ] - ], - [ - [ [ [ 0, -1, 1, 0, -1, 0 ], [ 0, -1, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, -1, 0 ] ], 1.875 ] - ], - [ - [ [ [ -1, 0, 2, 0, -1, 0 ], [ 0, -1, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, -1, 0 ] ], 1.125 ] - ], - [ - [ [ [ 0, -2, 1, 0, 0, 0 ], [ 0, -1, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, -1, 0 ] ], 1.625 ] - ], - [ - [ [ [ 0, -2, 1, 0, 0, 0 ], [ 0, -1, 1, 0, 0, 0 ], [ 0, -2, 1, 1, 0, 0 ], [ 0, 0, 1, 0, -1, 0 ] ], 1.375 ] - ], - [ - [ [ [ 0, -2, 1, 0, 0, 0 ], [ 0, -1, 1, 0, 0, 0 ], [ 1, -1, 1, -1, 0, 0 ], [ 0, 0, 1, 0, -1, 0 ] ], 1.875 ] - ], - [ - [ [ [ 0, 0, 1, -1, -1, 0 ], [ 0, -1, 1, 0, 0, 0 ], [ 1, -1, 1, -1, 0, 0 ], [ 0, 0, 1, 0, -1, 0 ] ], 2.5 ] - ], - [ - [ [ [ 0, 0, 1, -1, -1, 0 ], [ -1, 0, 1, 1, -1, 0 ], [ 1, -1, 1, -1, 0, 0 ], [ 0, 0, 1, 0, -1, 0 ] ], 2 ] - ], - [ - [ [ [ 0, 0, 1, -1, -1, 0 ], [ 1, -1, 0, -1, 0, 0 ], [ 1, -1, 1, -1, 0, 0 ], [ 0, 0, 1, 0, -1, 0 ] ], 1.25 ] - ], - [ - [ [ [ 0, 0, 1, -1, -1, 0 ], [ 1, -1, 0, -1, 0, 0 ], [ 1, -1, 1, -1, 0, 0 ], [ 1, 0, 1, -1, 0, 0 ] ], 2 ] - ], - [ - [ [ [ 0, 0, 1, -1, -1, 0 ], [ 1, 0, 2, -1, 0, 0 ], [ 1, -1, 1, -1, 0, 0 ], [ 1, 0, 1, -1, 0, 0 ] ], 2.5 ] - ], - [ - [ [ [ 0, 0, 1, -1, -1, 0 ], [ 1, 0, 2, -1, 0, 0 ], [ 0, 0, 2, -1, 0, 0 ], [ 1, 0, 1, -1, 0, 0 ] ], 2.375 ] - ], - [ - [ [ [ 0, 0, 1, -1, -1, 0 ], [ 1, 0, 2, -1, 0, 0 ], [ 0, 0, 2, -1, 0, 0 ], [ 0, 1, 2, -1, 0, 0 ] ], 2.125 ] - ], - [ - [ [ [ 0, 0, 1, -1, -1, 0 ], [ 1, 0, 2, -1, 0, 0 ], [ 0, 0, 1, -1, -1, 1 ], [ 0, 1, 2, -1, 0, 0 ] ], 1.375 ] - ], - [ - [ [ [ 0, 0, 1, -1, -1, 0 ], [ 1, 0, 2, -1, 0, 0 ], [ 0, 1, 2, -1, 0, -1 ], [ 0, 1, 2, -1, 0, 0 ] ], 1.25 ] - ], - [ - [ [ [ 0, 1, 2, -1, 0, -2 ], [ 1, 0, 2, -1, 0, 0 ], [ 0, 1, 2, -1, 0, -1 ], [ 0, 1, 2, -1, 0, 0 ] ], 2.875 ] - ], - [ - [ [ [ 0, 1, 2, -1, 0, -2 ], [ 1, 1, 2, -1, 0, -1 ], [ 0, 1, 2, -1, 0, -1 ], [ 0, 1, 2, -1, 0, 0 ] ], 2.5 ] - ], - [ - [ [ [ 0, 1, 2, -1, 0, -2 ], [ 1, 1, 2, -1, 0, -1 ], [ 0, 1, 2, -1, 0, -1 ], [ 2, 1, 2, -1, 0, -3 ] ], 1.875 ] - ], - [ - [ [ [ 0, 1, 2, -1, 0, -2 ], [ 3, 1, 2, -1, 0, -4 ], [ 0, 1, 2, -1, 0, -1 ], [ 2, 1, 2, -1, 0, -3 ] ], 1.375 ] - ], - [ - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 3, 1, 2, -1, 0, -4 ], [ 0, 1, 2, -1, 0, -1 ], [ 2, 1, 2, -1, 0, -3 ] ], 2.25 ] - ], - [ - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 3, 1, 2, -1, 0, -4 ], [ 0, 1, 2, -1, 0, -1 ], [ 2, 2, 2, -1, 0, -4 ] ], 2 ] - ], - [ - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 3, 1, 2, -1, 0, -4 ], [ 0, 1, 2, -1, 0, -1 ], [ 2, 1, 2, -3, 0, -1 ] ], 2 ] - ], - [ - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 3, 1, 2, -1, 0, -4 ], [ 0, 1, 2, -1, 0, -1 ], [ 0, 1, 3, -1, 0, -1 ] ], 2 ] - ], - [ - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 1, 2, 2, -2, 0, -1 ], [ 0, 1, 2, -1, 0, -1 ], [ 0, 1, 3, -1, 0, -1 ] ], 0 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 1, 2, 2, -2, 0, -1 ], [ 2, 1, 2, -3, 0, -1 ], [ 0, 1, 3, -1, 0, -1 ] ], 0 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 1, 2, 2, -2, 0, -1 ], [ 2, 1, 2, -3, 0, -1 ], [ 2, 1, 1, -2, 0, -1 ] ], 2.625 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 2, 1, 2, -2, -1, -1 ], [ 2, 1, 2, -3, 0, -1 ], [ 2, 1, 1, -2, 0, -1 ] ], 0 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 2, 1, 2, -2, -1, -1 ], [ 1, 1, 2, -1, 0, -1 ], [ 2, 1, 1, -2, 0, -1 ] ], 0 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 2, 1, 2, -2, -1, -1 ], [ 1, 1, 2, -1, 0, -1 ], [ 3, 1, 2, -3, 0, -1 ] ], 1.625 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 1, 1, 2, -2, 1, -1 ], [ 1, 1, 2, -1, 0, -1 ], [ 3, 1, 2, -3, 0, -1 ] ], 0 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 1, 1, 2, -2, 1, -1 ], [ 1, 1, 2, -2, 0, 0 ], [ 3, 1, 2, -3, 0, -1 ] ], 0 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 1, 1, 2, -2, 1, -1 ], [ 1, 1, 2, -2, 0, 0 ], [ 1, 1, 3, -2, 0, -1 ] ], 1.75 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 2, 0, 2, -2, 0, -1 ], [ 1, 1, 2, -2, 0, 0 ], [ 1, 1, 3, -2, 0, -1 ] ], 0 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 2, 0, 2, -2, 0, -1 ], [ 1, 2, 2, -2, 0, -1 ], [ 1, 1, 3, -2, 0, -1 ] ], 0 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 2, 0, 2, -2, 0, -1 ], [ 1, 2, 2, -2, 0, -1 ], [ 2, 1, 2, -2, 0, -2 ] ], 1.375 ] - ], - [ - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 0, 2, 2, -1, 0, -1 ], [ 1, 2, 2, -2, 0, -1 ], [ 2, 1, 2, -2, 0, -2 ] ], 1.625 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 0, 2, 2, -2, 0, 0 ], [ 1, 2, 2, -2, 0, -1 ], [ 2, 1, 2, -2, 0, -2 ] ], 1.625 ] - ], - [ - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 2, 1, 2, -3, 0, -1 ], [ 1, 2, 2, -2, 0, -1 ], [ 2, 1, 2, -2, 0, -2 ] ], 0 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 2, 1, 2, -3, 0, -1 ], [ 2, 1, 2, -2, -1, -1 ], [ 2, 1, 2, -2, 0, -2 ] ], 0 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 2, 1, 2, -3, 0, -1 ], [ 2, 1, 2, -2, -1, -1 ], [ 3, 1, 2, -2, 0, -2 ] ], 2.625 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 0, 2, 2, -2, 0, -1 ], [ 2, 1, 2, -2, -1, -1 ], [ 3, 1, 2, -2, 0, -2 ] ], 0 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 0, 2, 2, -2, 0, -1 ], [ 1, 1, 2, -2, 1, -1 ], [ 3, 1, 2, -2, 0, -2 ] ], 0 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 0, 2, 2, -2, 0, -1 ], [ 1, 1, 2, -2, 1, -1 ], [ 3, 1, 2, -3, 0, -1 ] ], 2.125 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 1, 1, 2, -2, -1, -1 ], [ 1, 1, 2, -2, 1, -1 ], [ 3, 1, 2, -3, 0, -1 ] ], 0 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 1, 1, 2, -2, -1, -1 ], [ 2, 0, 2, -2, 0, -1 ], [ 3, 1, 2, -3, 0, -1 ] ], 0 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 1, 1, 2, -2, -1, -1 ], [ 2, 0, 2, -2, 0, -1 ], [ 2, 1, 2, -2, 0, -1 ] ], 1.5 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 1, 1, 2, -2, 0, -1 ], [ 2, 0, 2, -2, 0, -1 ], [ 2, 1, 2, -2, 0, -1 ] ], 0 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 1, 1, 2, -2, 0, -1 ], [ 1, 1, 3, -2, 0, -1 ], [ 2, 1, 2, -2, 0, -1 ] ], 0 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 1, 1, 2, -2, 0, -1 ], [ 1, 1, 3, -2, 0, -1 ], [ 2, 1, 3, -2, 0, -1 ] ], 2.25 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 1, 1, 2, -2, 0, -1 ], [ "Rest" ], [ 2, 1, 3, -2, 0, -1 ] ], 0 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ 1, 1, 2, -2, 0, -1 ], [ "Rest" ], [ "Rest" ] ], 0 ], - [ [ [ 0, 1, 2, -2, 0, -1 ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 0 ], - [ [ [ "Rest" ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 7.0 ] - ] - ] -], -"last_changes": -[ - [ [ 0, 1, 2, -2, 0, -1 ], [ 1, 1, 2, -2, -1, -1 ], [ 2, 0, 2, -2, 0, -1 ], [ 3, 1, 2, -3, 0, -1 ] ], - [ [ 0, 1, 2, -2, 0, -1 ], [ 1, 1, 2, -2, -1, -1 ], [ 2, 0, 2, -2, 0, -1 ], [ 2, 1, 2, -2, 0, -1 ] ], - [ [ 0, 1, 2, -2, 0, -1 ], [ 1, 1, 2, -2, 0, -1 ], [ 2, 0, 2, -2, 0, -1 ], [ 2, 1, 2, -2, 0, -1 ] ], - [ [ 0, 1, 2, -2, 0, -1 ], [ 1, 1, 2, -2, 0, -1 ], [ 1, 1, 3, -2, 0, -1 ], [ 2, 1, 2, -2, 0, -1 ] ], - [ [ 0, 1, 2, -2, 0, -1 ], [ 1, 1, 2, -2, 0, -1 ], [ 1, 1, 3, -2, 0, -1 ], [ 2, 1, 3, -2, 0, -1 ] ] -], -"cur_uid": "577cf188", -"ref_uid": "nil", -"order_seed": 755225, -"dur_seed": 543380, -"motifs_seed": 119394, -"entrances_probs_vals": [ 1, 0, 0, 1.1263736263736, 2.83, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"passages_probs_vals": [ 1, 0, 0, 1.1263736263736, 2.83, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"exits_probs_vals": [ 1, 0, 0, 1.1263736263736, 2.83, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"ranges": [ [ -1315, 1582.6625386997 ], [ -702.16718266254, 1453 ], [ -386, 1676 ], [ -219, 1694 ] ], -"step_probs_vals": [ 0, 1200, 0, 0, 0.063786008230453, 0.92613636363636, 0.12757201646091, 0, 0.54732510288066, 0, 0.71604938271605, 0, 1, 0 ], -"passages_weights": [ 1, 1, 0.66, 0.74, 1 ], -"hd_exp": 2, -"hd_invert": 0, -"order": -[ - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 1, 2, 3 ], [ 0 ], [ ] ], - [ [ 3, 2, 0 ], [ 1 ], [ ] ], - [ [ 2, 3, 0 ], [ 1 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 2, 1, 3 ], [ 0 ], [ ] ], - [ [ 2, 1, 3 ], [ 0 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 1, 3, 0 ], [ 2 ], [ ] ], - [ [ 3, 2, 1 ], [ 0 ], [ ] ], - [ [ 2, 0, 3 ], [ 1 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 3, 2, 0 ], [ 1 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 2, 3, 0 ], [ 1 ], [ ] ], - [ [ 2, 1, 3 ], [ 0 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 0, 2, 1 ], [ 3 ], [ ] ], - [ [ 0 ], [ 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3 ], [ ] ], - [ [ 3, 2, 1 ], [ 1 ], [ ] ], - [ [ 0 ], [ 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3 ], [ ] ] -], -"sus_weights": [ 0, 0, 0.51 ], -"order_size": [ 30, 30 ], -"passages_size": [ 0, 0 ], -"motif_edited": "false", -"order_edited": "false" -} \ No newline at end of file diff --git a/resources/string_quartet_3/5ec14635/5ec14635_code.scd b/resources/string_quartet_3/5ec14635/5ec14635_code.scd deleted file mode 100644 index f822edb..0000000 --- a/resources/string_quartet_3/5ec14635/5ec14635_code.scd +++ /dev/null @@ -1,946 +0,0 @@ -( -// helper funcs -var hsArrayToCents, pDist, hdSum, hsChordalDistance, hsArrayToFreq; - -// score funcs -var isInRange, spacingScore, rangeScore, intervalScore, inclusionScore; - -// subroutines -var genTuples, initVoices, genOrders, genSubMotif, updateVoices, genDurFunc, genStepFunc; - -// primary routines -var genMotif, genSecondarySeq; - -// audition funcs -var genPatterns, genMidiPatterns; - -// resource management funcs -var seedFunc, genUID, writeResources, stringifyToDepth, setSeeds, sanityCheck, -msgInterpret, loadLedgerFile, loadLedgerJSON, loadModelFile, loadModelJSON, -setGlobalVars, globalVarsToDict, saveLedger; - -// model vars -//(model and global vars mostly set by OSC funcs -var seq, lastXChanges, -curUID, refUID, orderSeed, durSeed, motifSeed, -entrancesProbVals, passagesProbVals, exitsProbVals, -ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, -orders, susWeights, orderSize, passagesSize, -motifEdited, orderEdited; - -// model aux vars -var entrancesDurFunc, passagesDurFunc, exitsDurFunc, stepFunc; - -// other global vars -var popSize, exPath, dir, primes, dims, tuples, -group, player, resourceDir, ledgerPath, ledger, currentlyPlayingUID, -nameSpaces; - -// install JSON quark (not used) -/* -if(Quarks.isInstalled("JSONlib").not, { - Quarks.install("https://github.com/musikinformatik/JSONlib.git"); - thisProcess.recompile; - //HelpBrowser.openHelpFor("Classes/JSONlib"); -}); -*/ - - -//------helper funcs - -hsArrayToCents = { - arg hsArray; - hsArray.collect({arg dist, p; dist * 1200 * log2(primes[p][0]/primes[p][1])}).sum -}; - -pDist = { - arg array1, array2, signed = false; - var pDistance; - pDistance = hsArrayToCents.value(array1) - hsArrayToCents.value(array2); - if(signed, {pDistance}, {abs(pDistance)}) -}; - -hdSum = { - arg hsArrays; - var size, distances, mean; - size = hsArrays.size; - distances = (size - 1).collect({arg i; - ((i + 1)..(size - 1)).collect({arg j; - abs(hsArrays[i] - hsArrays[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsChordalDistance = { - arg hsArrays1, hsArrays2; - var size, distances, mean; - size = hsArrays1.size; - distances = hsArrays1.size.collect({arg i; - hsArrays2.size.collect({arg j; - abs(hsArrays1[i] - hsArrays2[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsArrayToFreq = { - arg array; - array.collect({arg dim, d; pow(primes[d][0]/primes[d][1], dim)}).product -}; - -//------score funcs - -/* -isInRange = { - arg hsArray, min, max; - var cents; - cents = hsArrayToCents.value(hsArray); - (cents >= min) && (cents <= max) -}; -*/ - -spacingScore = { - arg hsArrays, min; - var centsArray; - centsArray = hsArrays.collect({arg hsArray; hsArrayToCents.value(hsArray)}).sort({arg a, b; a < b}); - centsArray.differentiate.drop(1).collect({arg pDistance; if(pDistance >= min, {1}, {0.01})}).sum; -}; - -rangeScore = { - arg hsArray1, hsArray2, min, max, low, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - if((pDistance >= min) && (pDistance <= max), {1}, {low}); -}; - -intervalScore = { - arg hsArray1, hsArray2, mean, sd, signed = true; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - //pDistance.gaussCurve(1, mean, sd) - if(pDistance < 0, {stepFunc.value(abs(pDistance))}, {0.001}); - //stepFunc.value(pDistance) -}; - -inclusionScore = { - arg array, test, min = 0.01; - if(array.collect({arg v; v.hash}).includes(test.hash), {min}, {1}); -}; - - -//------subroutines - -genTuples = { - var tuples; - tuples = dims.collect({[-1, 0, 1]}).allTuples.select({arg tuple; (abs(tuple.drop(1)).sum <= 1) && (tuple[0] == 0)}); - tuples = tuples ++ tuples.collect({arg tuple; [-3, -2, -1, 1, 2, 3].collect({arg octTrans; tuple.deepCopy.put(0, octTrans)})}).flatten; -}; - -initVoices = { - var init, voicesInit; - voicesInit = popSize.collect({dims.collect({0})}); - /* - voicesInit = [dims.collect({0})]; - (popSize - 1).do({ - arg rep, new; - rep = dims.rand; - new = voicesInit.last.deepCopy; - new[rep] = new[rep] + [-1, 1].choose(); - voicesInit = voicesInit.add(new); - }); - */ - voicesInit.deepCopy; -}; - -genDurFunc = {arg chordProb, minPad, maxPad, minDur, maxDur, envData, seed; - var env, pTable, durFunc; - env = Env.pairs([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).asSignal(256).asList.asArray; - pTable = env.asRandomTable; - [chordProb, minPad, maxPad, minDur, maxDur, envData].postln; - durFunc = {arg allowChord, pad = false; - var res; - res = if(allowChord.not, { - pTable.tableRand * (maxDur - minDur) + minDur - }, { - if(1.0.rand < chordProb, {0}, {pTable.tableRand * (maxDur - minDur) + minDur}); - }).round(0.125); - if(pad, {res = res + rrand(minPad.asFloat, maxPad.asFloat).round(0.125)}); - if(res.asInteger == res, {res = res.asInteger}); - res - }; - seedFunc.value(durFunc, seed); -}; - -genStepFunc = {arg minStep, maxStep, envData, seed; - var envDataNorm, env, pTable, stepFunc; - [minStep, maxStep, envData].postln; - envDataNorm = ([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).flop; - envDataNorm = [envDataNorm[0].normalize(minStep, maxStep), envDataNorm[1]].flop; - env = Env.pairs(envDataNorm); - stepFunc = {arg pDist; - env.at(pDist).clip(0.001, 1); - }; - seedFunc.value(stepFunc, seed); -}; - -genOrders = {arg minMotifLength = 1, maxMotifLength = 5, minProgLength = 0, maxProgLength = 5; - ((maxMotifLength - minMotifLength).rand + minMotifLength).collect({ - var noProgIns, noSusIns, noSilentIns, prog, sus, silent, order; - noSusIns = [1, 2, 3].wchoose(susWeights.normalizeSum); - noProgIns = (popSize - noSusIns).rand + 1; - noSilentIns = popSize - noSusIns - noProgIns; - - # prog, sus, silent = (0..(popSize-1)).scramble.clumps([noProgIns, noSusIns, noSilentIns]); - - prog = (prog.scramble ++ ((maxProgLength - minProgLength).rand + minProgLength).collect({prog.choose}).scramble); - if(silent == nil, {silent = []}); - [sus.scramble, prog, silent.scramble] - }); -}; - -updateVoices = {arg ins, sus; - var voices, candidates, nWeights, nProbs, sel; - - voices = lastXChanges.deepCopy.last; - - candidates = sus.collect({arg v; tuples.collect({arg t; voices[v] + t})}).flatten; - candidates = difference(candidates.asSet, voices.asSet).asList; - nProbs = candidates.collect({arg candidate; - var stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore; - - //stepScore = intervalScore.value(voices[ins], candidate, 30, 400, 0.1); - stepScore = intervalScore.value(voices[ins], candidate, 100, 100); - recentlySoundedScore = inclusionScore.value(lastXChanges.flop[ins], candidate, 0); - isInRangeScore = rangeScore.value(candidate, candidate.collect({0}), ranges[ins][0], ranges[ins][1], 0, true); - regScore = spacingScore.value(voices.deepCopy.put(ins, candidate), 300); - hdScore = pow(hdSum.value(voices.deepCopy.put(ins, candidate)), hdExp); - if(hdInvert == 0, {hdScore = 1/hdScore}); - //maybe what you want here is a vector to another root and then favoring movement towards it. - //distScore = pow(hsChordalDistance.value(voices, voices.put(ins, candidate)), 2); - - [stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore] - }); - - nWeights = passagesWeights; - - //this handles nWeights of 0; mainly for testing - nProbs = nProbs.flop.select({arg scores, s; nWeights[s] != 0}).flop; - nWeights = nWeights.select({arg weight; weight != 0}); - nProbs = nProbs.flop.collect({arg scores, s; - if(scores.sum == 0, {scores}, {scores.normalizeSum * nWeights[s]}) - }); - nProbs = nProbs.flop.collect({arg scores, s; scores.product}).normalizeSum; - - sel = candidates.wchoose(nProbs); - - voices[ins] = sel; - lastXChanges = lastXChanges.add(voices).keep(-5); -}; - -genSubMotif = {arg order, orderIndex, lastState, repeatLast = false, startFromLast = false, isLastOrder = false; - var sus, prog, silent, flatOrder, res, isInChord, allowChord, pad, lastXChangesHold, voices, adder; - # sus, prog, silent = order; - flatOrder = silent ++ sus ++ prog; - lastXChangesHold = lastXChanges.deepCopy; - voices = lastState.deepCopy; - isInChord = popSize.collect({false}); - allowChord = false; - pad = false; - res = []; - "------generating motif".postln; - //need to figure out here if voices move between motifs - flatOrder.do({arg ins, i; - - if(prog.includes(ins) && repeatLast.not, {updateVoices.value(ins, sus)}); - adder = if(silent.includes(ins), {["Rest"]}, {lastXChanges.last.deepCopy[ins]}); - - if(voices[ins] != adder, { - var dur; - - if((sus ++ silent).includes(ins), { - allowChord = (ins != sus.last); - pad = (ins == sus.last); - }, { - if(i < (flatOrder.size - 1), { - allowChord = (isInChord[flatOrder[i + 1]] || (ins == flatOrder[i + 1])).not; - pad = false; - }, { - allowChord = false; - pad = true - }); - }); - if((orderIndex == 0) && sus.includes(ins), { - dur = entrancesDurFunc.value(allowChord, pad); - }, { - dur = passagesDurFunc.value(allowChord, pad); - }); - if(dur == 0, {isInChord[ins] = true}, {isInChord = popSize.collect({false})}); - - voices[ins] = adder; - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - - // pad ending - if(orderIndex == (orders.size - 1), { - (0..(popSize-1)).scramble.do({arg ins; - if(res.last.first[ins] != ["Rest"], { - var dur; - voices[ins] = ["Rest"]; - allowChord = (voices != popSize.collect({["Rest"]})); - pad = allowChord.not; - dur = exitsDurFunc.value(allowChord, pad); - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - }); - - //format and return - if(startFromLast, {lastXChanges = lastXChangesHold.deepCopy}); - res; -}; - - -//------primary routines - -genMotif = { - var repeats, fSeq, fDur, durAdd; - - repeats = 1; - fSeq = []; - - repeats.do({arg index; - var motif; - - motif = []; - - orders.do({arg order, o; - var lastState, subMotif; - lastState = if(o == 0, {popSize.collect({["Rest"]})}, {motif.last.last.first}); - subMotif = genSubMotif.value(order, o, lastState, isLastOrder: o == (orders.size - 1)); - motif = motif.add(subMotif); - - }); - - sanityCheck.value(motif, index); - - fSeq = fSeq.add(motif); - }); - - //round last duration to measure - fDur = fSeq.flatten.flatten.slice(nil, 1).sum; - durAdd = fDur.round(4) - fDur; - if(durAdd < 0, {durAdd = 4 - durAdd}); - fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] = fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] + durAdd; - - fSeq -}; - -genSecondarySeq = {arg seq; - var curdles, fSeq; - curdles = []; - while({curdles.sum < seq.size}, {curdles = curdles ++ [3.rand + 1]}); - - fSeq = seq.clumps(curdles).collect({arg clump, m; - var repeats, paddedSeq; - - //add rest - paddedSeq = clump.add([[[popSize.collect({["Rest"]}), 0.5.rand]]]); - - //implement repeats - repeats = [0.rand + 1, 1].wchoose([1, 0].normalizeSum); - repeats.collect({paddedSeq}); - }); - fSeq -}; - - -//------audition funcs - -/* -Event.addEventType(\osc, { - if (~addr.postln.notNil) { - ~addr.sendMsg(~indexPath, ~indexMsg); - ~addr.sendMsg(~seqPath, stringifyToDepth.value(~seqMsg, 3)); - //~addr.sendMsg("/STATE/OPEN", (dir.replace("supercollider", "resources") +/+ ~idMsg +/+ ~idMsg ++ "_gui_state" ++ ".state").standardizePath.postln); - }; -}); -*/ - -Event.addEventType(\osc, { - if (~addr.notNil) { - ~msg; - ~addr.sendMsg(~path, *~msg); - }; -}); - -genPatterns = {arg inSeq, addr, oneShot = false; - var voices, durs, pbinds, res, indices, sectionDurs, msg, ids, seq; - seq = inSeq.collect({arg mSeq; mSeq[0]}); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - pbinds = voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs, attacks, rels, amps; - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - //attacks = 2.collect({rrand(1, 3)}) ++ freqs.drop(2).collect({rrand(0.3, 0.5)}); - attacks = fDurs.collect({arg dur; dur * rrand(0.2, 0.4)}); - //rels = freqs.drop(2).collect({rrand(0.3, 0.5)}) ++ 2.collect({rrand(1, 3)}); - rels = (clumps.size - 1).collect({arg c; - if(clumps[c + 1][0] == ["Rest"], {rrand(1.0, 3.0)}, {rrand(0.3, 0.5)}); - }); - rels = rels.add(rrand(1.0, 3.0)); - amps = freqs.collect({rrand(0.6, 0.99)}); - - [ - Pbind( - \instrument, \string_model, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \attack, Pseq(attacks, 1), - \sustain, Pseq(fDurs, 1), - \release, Pseq(rels, 1), - //\amp, Pseq(amps, 1), - \amp, Pbrown(0.5, 1, 0.5), - \busIndex, v - ), - Pbind( - \instrument, \sine, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \sustain, Pseq(fDurs, 1), - \busIndex, v - ) - ] - }).flatten; - if(oneShot.not, { - msg = inSeq.collect({arg mSeq, m; mSeq[1..]}); - //ids = inSeq.collect({arg mSeq, m; mSeq[2]}); - sectionDurs = seq.collect({arg mSeq; mSeq.flatten2(mSeq.maxDepth - 5).flop[1].sum}); - pbinds = pbinds ++ - [ - Pbind( - \type, \osc, - \addr, addr, - \path, "/playing", - \msg, Pseq(msg, 1), - \dur, Pseq(sectionDurs, 1) - ); - ] - }); - res = Ppar(pbinds); - res -}; - -/* -genMidiPatterns = {arg seq; - var voices, durs, patterns, res, mOut, pbRange; - pbRange = 1; //semitones - change this as needed for your situation - mOut = MIDIOut.newByName("TiMidity", "TiMidity port 0").latency_(Server.default.latency); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - res = Ppar( - voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs; - - mOut.program(v, 70); - - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - - Pbind( - \type, \midi, - \chan, v, - \noteval, Pseq(freqs.cpsmidi - 24, 1), - \note, Pfunc({ | event | event[\noteval].floor }), - \dur, Pseq(fDurs, 1), - \midiout, mOut, - \amp, 1, - \bend, Pfunc({ - | event | - if (event[\note].isRest.not) { - var pitchbendvalue = event[\noteval].frac.linlin(0, pbRange, 8192, 8192*2).asInteger; - m.bend(v, pitchbendvalue); - }; - 0; // return something other than nil to avoid stopping the pattern - }), - ); - }); - ); - res -}; -*/ - - -//------resource management funcs - -genUID = {Date.seed.asHexString.toLower}; - -seedFunc = {arg func, seed; - var funcArgs, next; - next = Routine({loop{func.valueArray(funcArgs).yield }}); - next.randSeed_(seed); - {arg ...args; funcArgs = args; next.value} -}; - -stringifyToDepth = {arg data, maxDepth = 1; - var prettyString = "", rCount = 0, writeArray, indent; - - if(maxDepth == 0, { - data.asCompileString - }, { - indent = {arg size; size.collect({" "}).join("")}; - writeArray = {arg array; - prettyString = prettyString ++ indent.value(rCount) ++ "[\n"; - rCount = rCount + 1; - if(rCount < maxDepth, { - array.do({arg subArray; writeArray.value(subArray)}); - }, { - prettyString = prettyString ++ array.collect({arg subArray; - indent.value(rCount + 1) ++ subArray.asCompileString - }).join(",\n"); - }); - rCount = rCount - 1; - prettyString = prettyString ++ "\n" ++ indent.value(rCount) ++ "],\n"; - }; - - writeArray.value(data); - prettyString.replace(",\n\n", "\n").drop(-2); - }) -}; - -sanityCheck = {arg motif, index; - //print functions = very helpful - ("----------" + index + "------------").postln; - - motif.flatten.do({arg val, v; - if(v > 0, { - if(motif.flatten[v-1][0].hammingDistance(val[0]) > 1, {"problem 1".postln}); - if(motif.flatten[v-1][0].hammingDistance(val[0]) == 0, {"problem 2".postln}); - }); - val.postln - }); - "***********".postln; -}; - -msgInterpret = {arg in, escapeDoubleQuotes = true, escapeSingleQuotes = true; - var res; - - res = in; - if(res.isNil.not, { - if((res.isArray && res.isString.not), { - res = res.asCompileString; - res = res.replace(" ", "").replace("\n", "").replace("\t", ""); - if(escapeSingleQuotes, {res = res.replace("\'", "")}); - if(escapeDoubleQuotes, {res = res.replace("\"", "")}); - res = res.replace("Rest", "\"Rest\""); - res = res.interpret; - }, { - var tmpRes; - if(res.every({arg char; char.isDecDigit}), {tmpRes = res.asInteger}); - if(res.contains("."), {tmpRes = res.asFloat}); - if(tmpRes != nil, {res = tmpRes}); - }); - }); - res -}; - -writeResources = {arg path, dict; - var file, modelItems, resString; - file = File(path,"w"); - - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - - resString = nameSpaces.collect({arg nameSpace; - var depth = 0, insert = " "; - if(nameSpace == "music_data", {depth = 3; insert = "\n"}); - if(nameSpace == "last_changes", {depth = 1; insert = "\n"}); - if(nameSpace == "order", {depth = 1; insert = "\n"}); - if((nameSpace == "ref_uid") && (dict[nameSpace] == nil), {dict[nameSpace] = "nil"}); - "\"" ++ nameSpace ++ "\":" ++ insert ++ stringifyToDepth.value(dict[nameSpace], depth) - }).join(",\n"); - - resString = "{\n" ++ resString ++ "\n}"; - - file.write(resString); - file.close; - resString -}; - -loadModelFile = {arg path; loadModelJSON.value(File(path, "r").readAllString.parseJSON)}; - -loadModelJSON = {arg jsonObject; - var dict; - dict = Dictionary.with(*nameSpaces.collect({arg nS; nS->msgInterpret.value(jsonObject[nS])})); - dict -}; - -setGlobalVars = {arg dict, skipLastXChanges = false; - var tmpLastXChanges; - tmpLastXChanges = lastXChanges.deepCopy; - // order really matters!!!! - # seq, lastXChanges, curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited = nameSpaces.collect({arg nS; dict[nS]}); - if(skipLastXChanges, {lastXChanges = tmpLastXChanges}); - dict -}; - -globalVarsToDict = { - var modelItems, dict; - // order really matters!!!! - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - dict = Dictionary.with(*nameSpaces.collect({arg nS, n; nS->modelItems[n]})); -}; - -loadLedgerFile = {arg path; - ledgerPath = path; - resourceDir = path.splitext(".").drop(-1).join; - loadLedgerJSON.value(File(ledgerPath, "r").readAllString.parseJSON) -}; - -loadLedgerJSON = {arg jsonObject; ledger = jsonObject["ledger"]}; - -saveLedger = {arg ledger, path; - var file, curResourceDir; - file = File(path, "w"); - curResourceDir = resourceDir; - resourceDir = path.splitext(".").drop(-1).join; - if(curResourceDir != resourceDir, { - File.mkdir(resourceDir); - ledger.do({arg id; - File.copy(curResourceDir +/+ id, resourceDir +/+ id); - }); - }); - file.write("{\n\"ledger\":\n" ++ stringifyToDepth.value(ledger, 1) ++ "\n}"); - file.close; -}; - -//------global vars - -primes = [[2, 1], [3, 2], [5, 4], [7, 4], [11, 8], [13, 8]]; -//ranges = [[-2400, 0], [-1200, 1200], [0, 2400], [0, 2400]]; -exPath = thisProcess.nowExecutingPath; -dir = exPath.dirname; -//popSize = 4; -dims = primes.size; -tuples = genTuples.value(); -//refUID = nil; -group = Group.new; -~group = group; -loadLedgerFile.value(dir +/+ ".." +/+ "resources" +/+ "piece_ledger.json"); -resourceDir = (dir +/+ ".." +/+ "resources" +/+ "piece_ledger"); -//passagesWeights = [1, 1, 1, 1, 1]; -//susWeights = [1, 1, 1]; -// order really matters!!!! -nameSpaces = [ - "music_data", "last_changes", "cur_uid", "ref_uid", "order_seed", "dur_seed", "motifs_seed", - "entrances_probs_vals","passages_probs_vals", "exits_probs_vals", - "ranges", "step_probs_vals", "passages_weights", "hd_exp", "hd_invert", - "order", "sus_weights", "order_size", "passages_size", - "motif_edited", "order_edited" -]; - - -//------OSC funcs - -OSCdef(\load_ledger, {arg msg, time, addr, port; - loadLedgerFile.value(msg[1].asString); -}, \load_ledger); - -OSCdef(\load_model, {arg msg, time, addr, port; - var dict; - dict = loadModelFile.value(msg[1].asString); - setGlobalVars.value(dict); -}, \load_model); - -OSCdef(\save_ledger, {arg msg, time, addr, port; - msg.postln; - ledger = msgInterpret.value(msg[1].asString.parseJSON["ledger"], false).postln; - //loadLedgerJSON.value(msg[0]) - saveLedger.value(ledger, msg[2].asString); - //loadLedgerFile.value(msg[1].asString); -}, \save_ledger); - -OSCdef(\generate, {arg msg, time, addr, port; - var path, dict, durSeeds, musPath, modelString; - msg.postln; - - path = msg[1].asString; - - dict = loadModelFile.value(path); - setGlobalVars.value(dict, true); - - popSize = ranges.size; - - //refUID.postln; - - loadLedgerFile.value(ledgerPath); - if(ledger == nil, {ledger = ["tmp"]}); - if(ledger.last != "tmp", {ledger = ledger.add("tmp")}); - - if(refUID == nil, {lastXChanges = [initVoices.value().deepCopy]}); - if((refUID != nil) && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - lastXChanges = msgInterpret.value(file.readAllString.parseJSON["last_changes"]); - }); - - refUID.postln; - lastXChanges.collect({arg item; item.postln}); - - durSeeds = seedFunc.value({3.collect({rrand(100000, 999999)})}, durSeed).value.postln; - entrancesDurFunc = genDurFunc.valueArray(entrancesProbVals[..4] ++ [entrancesProbVals[5..]] ++ [durSeeds[0]]); - passagesDurFunc = genDurFunc.valueArray(passagesProbVals[..4] ++ [passagesProbVals[5..]] ++ [durSeeds[1]]); - exitsDurFunc = genDurFunc.valueArray(exitsProbVals[..4] ++ [exitsProbVals[5..]] ++ [durSeeds[2]]); - - if(orders == nil, { - orders = seedFunc.value(genOrders, orderSeed).valueArray(orderSize ++ passagesSize); - //addr.sendMsg("/order", stringifyToDepth.value(orders, 1)); - }); - - stepFunc = genStepFunc.valueArray(stepProbsVals[..1] ++ [stepProbsVals[2..]] ++ [motifSeed]); - seq = seedFunc.value(genMotif, motifSeed).value; - - lastXChanges.collect({arg item; item.postln}); - - dict = globalVarsToDict.value; - modelString = writeResources.value(path, dict); - - //addr.sendMsg("/generated", musPath, stringifyToDepth.value(seq, 3)); - //~seq = seq; - - addr.sendMsg("/generated", path, modelString, ledgerPath); -}, \generate); - - -OSCdef(\commit, {arg msg, time, addr, port; - var musicData, musicChanged, dict, newLedger, modelPath, musString, musFile, test1, test2, lastCurUID, commitType, commitPos, equalityLedger; - //msg.postln; - - /* - test1 = msg[1].asString.parseJSON; - test2 = (dir +/+ ".." +/+ "resources/tmp/tmp_music" ++ ".json").standardizePath.parseJSONFile; - msgInterpret.value(test1["music"])[0][0][0][1].class.postln; - msgInterpret.value(test2["music_data"])[0][0][0][1].class.postln; - (test1["music"] == test2["music_data"]).postln; - */ - - musicData = loadModelJSON.value(msg[1].asString.parseJSON)["music_data"].postln; - musicChanged = (musicData != seq).postln; - commitType = msg[2].asString; - commitPos = msg[3].postln.asInteger; - - lastCurUID = curUID.deepCopy; - curUID = genUID.value; - - File.mkdir((resourceDir +/+ curUID).standardizePath); - File.copy(exPath, (resourceDir +/+ curUID +/+ curUID ++ "_code" ++ ".scd").standardizePath); - - modelPath = (resourceDir +/+ curUID +/+ curUID ++ "_mus_model" ++ ".json").standardizePath; - dict = globalVarsToDict.value; - if(musicChanged, { - seq = musicData; - dict["music_data"] = seq; - dict["motif_edited"] = "true" - }); - dict["cur_uid"] = curUID; - - writeResources.value(modelPath, dict); - - File.delete(ledgerPath ++ "_bak"); - File.copy(ledgerPath, ledgerPath ++ "_bak"); - File.delete(ledgerPath); - - /* - if(commitType == "add", { - if(lastCurUID == "tmp", { - ledger = ledger.drop(-1).add(curUID); - }, { - ledger = ledger.add(curUID); - }) - }); - */ - - ledger.postln; - - if(commitType == "add", {ledger = ledger.add(curUID)}); - - if(commitType == "insert", {ledger = ledger.insert(commitPos + 1, curUID)}); - - if(commitType == "replace", {ledger = ledger.put(commitPos, curUID)}); - - equalityLedger = ledger.collect({arg item; item.asSymbol}); - if(equalityLedger.includes(\tmp).postln, {ledger.removeAt(equalityLedger.indexOf(\tmp).postln)}); - - ledger.postln; - - saveLedger.value(ledger, ledgerPath); - - addr.sendMsg("/committed", curUID, ledgerPath); - //refUID = curUID; - -}, \commit); - -OSCdef(\transport, {arg msg, time, addr, port; - msg.postln; - if(msg[1] == 0, { - group.set(\release, 2); - group.set(\gate, 0); - player.stop; - }, { - // the cued sequence can now be read from file, so this can be cleaned up - var cSize, patterns, pSeq, cuedSeek, indexStart, indexEnd, tmpLedger; - if(msg[1] == 1, { - pSeq = []; - cuedSeek = (seq != nil); - indexStart = msg[2].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.postln.parseJSON["music_data"]), path, indexStart + index, uid]); - file.close; - }); - }); - if(cuedSeek, { - var path, file; - path = (resourceDir +/+ "tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - patterns = genPatterns.value(pSeq, addr); - }, { - pSeq = [loadModelJSON.value(msg[2].asString.parseJSON)["music_data"].postln]; - patterns = genPatterns.value(pSeq, addr, true); - }); - player = Pfset(pattern: patterns, cleanupFunc: { - addr.sendMsg("/transport", 0); - addr.sendMsg("/one_shot", 0); - }); - player = player.play - }); -}, \transport); - - -OSCdef(\transcribe_motif, {arg msg, time, addr, port; - var tSeq, refChord, refUID; - - msg.postln; - - tSeq = [loadModelJSON.value(msg[1].asString.parseJSON)["music_data"]]; - refUID = msg[2].asString.postln; - - if((refUID != "nil") && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }, { - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - }); - - ~transcribe.value(tSeq, refChord, (dir +/+ ".." +/+ "lilypond" +/+ "includes").standardizePath, addr, "/transcribe_motif"); -}, \transcribe_motif); - - -OSCdef(\transcribe_all, {arg msg, time, addr, port; - var cSize, patterns, cuedSeek, indexStart, indexEnd, tmpLedger; - if(true, { - cuedSeek = (seq != nil); - indexStart = msg[1].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - - //tmp for testing transcription - //indexEnd = (indexStart+5); - - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - var lilyPartLedgerFiles; - - lilyPartLedgerFiles = 4.collect({arg p; - File((dir +/+ ".." +/+ "lilypond" +/+ "includes" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly").standardizePath, "w"); - }); - - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file, fileString, tSeq, refUID, refChord; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - fileString = file.readAllString; - tSeq = msgInterpret.value(fileString.parseJSON["music_data"]); - refUID = msgInterpret.value(fileString.parseJSON["ref_uid"]); - file.close; - - //uid.postln; - //(refUID == "nil").postln; - - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - - if(refUID != "nil", { - path = (resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }); - - if(index != indexEnd, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath); - }, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath, addr, "/transcribe_all"); - }); - - lilyPartLedgerFiles.do({arg f, p; - f.write("\\include \"" ++ resourceDir +/+ uid +/+ "lilypond" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly\"\n"); - }); - - }); - - lilyPartLedgerFiles.do({arg f; - f.close - }); - }); - /* - if(cuedSeek, { - var path, file; - path = (dir +/+ ".." +/+ "resources/tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - */ - }, { - - }); - -}, \transcribe_all); - -) - - diff --git a/resources/string_quartet_3/5ec14635/5ec14635_mus_model.json b/resources/string_quartet_3/5ec14635/5ec14635_mus_model.json deleted file mode 100644 index c4309f6..0000000 --- a/resources/string_quartet_3/5ec14635/5ec14635_mus_model.json +++ /dev/null @@ -1,163 +0,0 @@ -{ -"music_data": -[ - [ - [ - [ [ [ "Rest" ], [ "Rest" ], [ -2, -1, 0, 0, 0, -1 ], [ "Rest" ] ], 0.375 ], - [ [ [ "Rest" ], [ -2, -2, 0, 1, 0, -2 ], [ -2, -1, 0, 0, 0, -1 ], [ "Rest" ] ], 0 ], - [ [ [ -2, -1, 0, 1, 0, -2 ], [ -2, -2, 0, 1, 0, -2 ], [ -2, -1, 0, 0, 0, -1 ], [ "Rest" ] ], 0.5 ], - [ [ [ -2, -1, 0, 1, 0, -2 ], [ -2, -2, 0, 1, 0, -2 ], [ -2, -1, 0, 0, 0, -1 ], [ 1, -2, 0, 2, 0, -2 ] ], 0.125 ] - ], - [ - [ [ [ -2, -1, 0, 1, 0, -2 ], [ -2, -2, 0, 1, 0, -2 ], [ 0, 0, 0, 1, 0, -2 ], [ 1, -2, 0, 2, 0, -2 ] ], 1 ] - ], - [ - [ [ [ -2, -1, 0, 1, 0, -2 ], [ -2, -2, 0, 1, 0, -2 ], [ 0, 0, 0, 1, 0, -2 ], [ 0, 0, 0, 1, 0, -1 ] ], 1.125 ] - ], - [ - [ [ [ -2, -1, 0, 1, 0, -2 ], [ -1, 1, 0, 1, 0, -1 ], [ 0, 0, 0, 1, 0, -2 ], [ 0, 0, 0, 1, 0, -1 ] ], 1.125 ] - ], - [ - [ [ [ -2, -1, 0, 1, 0, -2 ], [ 0, 0, 1, 1, 0, -2 ], [ 0, 0, 0, 1, 0, -2 ], [ 0, 0, 0, 1, 0, -1 ] ], 0.125 ] - ], - [ - [ [ [ -2, -1, 0, 1, 0, -2 ], [ 0, 0, 1, 1, 0, -2 ], [ -1, 0, 1, 1, 0, -1 ], [ 0, 0, 0, 1, 0, -1 ] ], 0.75 ] - ], - [ - [ [ [ -2, -1, 0, 1, 0, -2 ], [ 0, 0, 1, 1, 0, -2 ], [ -1, 0, 1, 2, 0, -2 ], [ 0, 0, 0, 1, 0, -1 ] ], 0.75 ] - ], - [ - [ [ [ -2, -1, 0, 1, 0, -2 ], [ 0, 0, 1, 1, 0, -2 ], [ 0, -1, 0, 2, 0, -2 ], [ 0, 0, 0, 1, 0, -1 ] ], 0 ] - ], - [ - [ [ [ -2, -1, 0, 1, 0, -2 ], [ 0, 0, 1, 1, 0, -2 ], [ -1, 1, 0, 1, 0, -1 ], [ 0, 0, 0, 1, 0, -1 ] ], 0.625 ] - ], - [ - [ [ [ -2, -1, 0, 1, 0, -2 ], [ 0, 0, 1, 1, 0, -2 ], [ -1, 1, 0, 1, 0, -1 ], [ 0, 0, 1, 1, 1, -2 ] ], 1.125 ] - ], - [ - [ [ [ -2, -1, 0, 1, 0, -2 ], [ 0, 0, 1, 1, 0, -2 ], [ -1, 1, 1, 1, 1, -2 ], [ 0, 0, 1, 1, 1, -2 ] ], 1 ] - ], - [ - [ [ [ -2, -1, 0, 1, 0, -2 ], [ 0, 0, 1, 1, 0, -2 ], [ -1, 1, 1, 1, 1, -2 ], [ 1, -1, 0, 1, 1, -2 ] ], 0.625 ] - ], - [ - [ [ [ -2, -1, 0, 1, 0, -2 ], [ 1, -1, 0, 1, 0, -2 ], [ -1, 1, 1, 1, 1, -2 ], [ 1, -1, 0, 1, 1, -2 ] ], 0.75 ] - ], - [ - [ [ [ -1, -1, 0, 2, 1, -2 ], [ 1, -1, 0, 1, 0, -2 ], [ -1, 1, 1, 1, 1, -2 ], [ 1, -1, 0, 1, 1, -2 ] ], 1.125 ] - ], - [ - [ [ [ -1, 0, 1, 1, 1, -2 ], [ 1, -1, 0, 1, 0, -2 ], [ -1, 1, 1, 1, 1, -2 ], [ 1, -1, 0, 1, 1, -2 ] ], 0.25 ] - ], - [ - [ [ [ -1, 0, 1, 1, 1, -2 ], [ -1, 0, 1, 1, 1, -1 ], [ -1, 1, 1, 1, 1, -2 ], [ 1, -1, 0, 1, 1, -2 ] ], 0.25 ] - ], - [ - [ [ [ -1, 0, 1, 1, 1, -2 ], [ -1, 0, 1, 2, 1, -2 ], [ -1, 1, 1, 1, 1, -2 ], [ 1, -1, 0, 1, 1, -2 ] ], 1.125 ] - ], - [ - [ [ [ -1, 0, 1, 1, 1, -2 ], [ -1, 0, 1, 2, 1, -2 ], [ -2, 0, 1, 3, 1, -2 ], [ 1, -1, 0, 1, 1, -2 ] ], 1.125 ] - ], - [ - [ [ [ -1, 0, 1, 1, 1, -2 ], [ -1, 0, 1, 2, 1, -2 ], [ -2, 0, 1, 3, 1, -2 ], [ -1, 0, 1, 3, 0, -2 ] ], 1 ] - ], - [ - [ [ [ -1, 0, 1, 1, 1, -2 ], [ -1, 0, 1, 2, 1, -2 ], [ -2, 0, 1, 3, 1, -2 ], [ 0, -1, 1, 2, 1, -2 ] ], 0.25 ] - ], - [ - [ [ [ -1, 0, 1, 2, 1, -3 ], [ -1, 0, 1, 2, 1, -2 ], [ -2, 0, 1, 3, 1, -2 ], [ 0, -1, 1, 2, 1, -2 ] ], 0.25 ] - ], - [ - [ [ [ -3, 1, 1, 3, 1, -2 ], [ -1, 0, 1, 2, 1, -2 ], [ -2, 0, 1, 3, 1, -2 ], [ 0, -1, 1, 2, 1, -2 ] ], 0 ] - ], - [ - [ [ [ -2, 0, 1, 2, 2, -2 ], [ -1, 0, 1, 2, 1, -2 ], [ -2, 0, 1, 3, 1, -2 ], [ 0, -1, 1, 2, 1, -2 ] ], 1 ] - ], - [ - [ [ [ -2, 0, 1, 2, 2, -2 ], [ -1, 0, 1, 2, 1, -2 ], [ -2, 0, 1, 3, 1, -2 ], [ -1, 0, 0, 3, 1, -2 ] ], 0.75 ] - ], - [ - [ [ [ -2, 0, 1, 2, 2, -2 ], [ -1, 0, 1, 2, 1, -2 ], [ -1, -1, 1, 2, 2, -2 ], [ -1, 0, 0, 3, 1, -2 ] ], 0.625 ] - ], - [ - [ [ [ -1, 0, 1, 2, 0, -2 ], [ -1, 0, 1, 2, 1, -2 ], [ -1, -1, 1, 2, 2, -2 ], [ -1, 0, 0, 3, 1, -2 ] ], 0.125 ] - ], - [ - [ [ [ -1, 0, 1, 2, 0, -2 ], [ -1, 0, 1, 2, 1, -2 ], [ -1, -1, 0, 3, 1, -2 ], [ -1, 0, 0, 3, 1, -2 ] ], 0.75 ] - ], - [ - [ [ [ -1, 0, 1, 2, 0, -2 ], [ 0, 0, 1, 2, -1, -2 ], [ -1, -1, 0, 3, 1, -2 ], [ -1, 0, 0, 3, 1, -2 ] ], 0.25 ] - ], - [ - [ [ [ -1, 0, 1, 2, 0, -2 ], [ 0, -1, 0, 2, 1, -2 ], [ -1, -1, 0, 3, 1, -2 ], [ -1, 0, 0, 3, 1, -2 ] ], 1.25 ] - ], - [ - [ [ [ -1, 0, 1, 2, 0, -2 ], [ 0, -1, 0, 2, 1, -2 ], [ -1, -1, 0, 3, 1, -2 ], [ 0, -1, 0, 2, 2, -2 ] ], 0.625 ], - [ [ [ "Rest" ], [ 0, -1, 0, 2, 1, -2 ], [ -1, -1, 0, 3, 1, -2 ], [ 0, -1, 0, 2, 2, -2 ] ], 0.625 ], - [ [ [ "Rest" ], [ 0, -1, 0, 2, 1, -2 ], [ -1, -1, 0, 3, 1, -2 ], [ "Rest" ] ], 0.375 ], - [ [ [ "Rest" ], [ "Rest" ], [ -1, -1, 0, 3, 1, -2 ], [ "Rest" ] ], 0.875 ], - [ [ [ "Rest" ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 1.375 ] - ] - ] -], -"last_changes": -[ - [ [ -1, 0, 1, 2, 0, -2 ], [ -1, 0, 1, 2, 1, -2 ], [ -1, -1, 1, 2, 2, -2 ], [ -1, 0, 0, 3, 1, -2 ] ], - [ [ -1, 0, 1, 2, 0, -2 ], [ -1, 0, 1, 2, 1, -2 ], [ -1, -1, 0, 3, 1, -2 ], [ -1, 0, 0, 3, 1, -2 ] ], - [ [ -1, 0, 1, 2, 0, -2 ], [ 0, 0, 1, 2, -1, -2 ], [ -1, -1, 0, 3, 1, -2 ], [ -1, 0, 0, 3, 1, -2 ] ], - [ [ -1, 0, 1, 2, 0, -2 ], [ 0, -1, 0, 2, 1, -2 ], [ -1, -1, 0, 3, 1, -2 ], [ -1, 0, 0, 3, 1, -2 ] ], - [ [ -1, 0, 1, 2, 0, -2 ], [ 0, -1, 0, 2, 1, -2 ], [ -1, -1, 0, 3, 1, -2 ], [ 0, -1, 0, 2, 2, -2 ] ] -], -"cur_uid": "5ec14635", -"ref_uid": "7c2de94c", -"order_seed": 733231, -"dur_seed": 711733, -"motifs_seed": 934821, -"entrances_probs_vals": [ 0, 0, 0, 0, 1.2087912087912, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"passages_probs_vals": [ 0, 0, 0, 0, 1.2087912087912, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"exits_probs_vals": [ 0, 0, 0, 0, 1.2087912087912, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"ranges": [ [ -2170, 338 ], [ -2373.9938080495, 1453 ], [ -1650, 1676 ], [ -1370.8978328173, 1694 ] ], -"step_probs_vals": [ 0, 1200, 0, 0, 0.063786008230453, 0.92613636363636, 0.12757201646091, 0, 0.54732510288066, 0, 0.71604938271605, 0, 1, 0 ], -"passages_weights": [ 1, 0, 0.2, 0.74, 0.68 ], -"hd_exp": 2, -"hd_invert": 0, -"order": -[ - [ [ 2, 1, 0 ], [ 3 ], [ ] ], - [ [ 1, 3, 0 ], [ 2 ], [ ] ], - [ [ 2, 1, 0 ], [ 3 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 2, 3, 0 ], [ 1 ], [ ] ], - [ [ 3, 0, 1 ], [ 2 ], [ ] ], - [ [ 3, 0, 1 ], [ 2 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 0, 1, 2 ], [ 3 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 0, 2, 1 ], [ 3 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 3, 2, 0 ], [ 1 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 2, 1, 0 ], [ 3 ], [ ] ], - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 2, 1, 0 ], [ 3 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 1, 3, 2 ], [ 0 ], [ ] ], - [ [ 1, 3, 0 ], [ 2 ], [ ] ], - [ [ 2, 0, 3 ], [ 1 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 0, 1, 2 ], [ 3 ], [ ] ] -], -"sus_weights": [ 0, 0, 0.61 ], -"order_size": [ 30, 30 ], -"passages_size": [ 0, 0 ], -"motif_edited": "false", -"order_edited": "false" -} \ No newline at end of file diff --git a/resources/string_quartet_3/69c568c6/69c568c6_code.scd b/resources/string_quartet_3/69c568c6/69c568c6_code.scd deleted file mode 100644 index a40da01..0000000 --- a/resources/string_quartet_3/69c568c6/69c568c6_code.scd +++ /dev/null @@ -1,973 +0,0 @@ -( -// helper funcs -var hsArrayToCents, pDist, hdSum, hsChordalDistance, hsArrayToFreq; - -// score funcs -var isInRange, spacingScore, rangeScore, intervalScore, inclusionScore; - -// subroutines -var genTuples, initVoices, genOrders, genSubMotif, updateVoices, genDurFunc, genStepFunc; - -// primary routines -var genMotif, genSecondarySeq; - -// audition funcs -var genPatterns, genMidiPatterns; - -// resource management funcs -var seedFunc, genUID, writeResources, stringifyToDepth, setSeeds, sanityCheck, -msgInterpret, loadLedgerFile, loadLedgerJSON, loadModelFile, loadModelJSON, -setGlobalVars, globalVarsToDict, saveLedger; - -// model vars -//(model and global vars mostly set by OSC funcs -var seq, lastXChanges, -curUID, refUID, orderSeed, durSeed, motifSeed, -entrancesProbVals, passagesProbVals, exitsProbVals, -ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, -orders, susWeights, orderSize, passagesSize, -motifEdited, orderEdited; - -// model aux vars -var entrancesDurFunc, passagesDurFunc, exitsDurFunc, stepFunc; - -// other global vars -var popSize, exPath, dir, primes, dims, tuples, -group, player, resourceDir, ledgerPath, ledger, currentlyPlayingUID, -nameSpaces; - -// install JSON quark (not used) -/* -if(Quarks.isInstalled("JSONlib").not, { - Quarks.install("https://github.com/musikinformatik/JSONlib.git"); - thisProcess.recompile; - //HelpBrowser.openHelpFor("Classes/JSONlib"); -}); -*/ - - -//------helper funcs - -hsArrayToCents = { - arg hsArray; - hsArray.collect({arg dist, p; dist * 1200 * log2(primes[p][0]/primes[p][1])}).sum -}; - -pDist = { - arg array1, array2, signed = false; - var pDistance; - pDistance = hsArrayToCents.value(array2) - hsArrayToCents.value(array1); - if(signed, {pDistance}, {abs(pDistance)}) -}; - -hdSum = { - arg hsArrays; - var size, distances, mean; - size = hsArrays.size; - distances = (size - 1).collect({arg i; - ((i + 1)..(size - 1)).collect({arg j; - abs(hsArrays[i] - hsArrays[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsChordalDistance = { - arg hsArrays1, hsArrays2; - var size, distances, mean; - size = hsArrays1.size; - distances = hsArrays1.size.collect({arg i; - hsArrays2.size.collect({arg j; - abs(hsArrays1[i] - hsArrays2[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsArrayToFreq = { - arg array; - array.collect({arg dim, d; pow(primes[d][0]/primes[d][1], dim)}).product -}; - -//------score funcs - -/* -isInRange = { - arg hsArray, min, max; - var cents; - cents = hsArrayToCents.value(hsArray); - (cents >= min) && (cents <= max) -}; -*/ - -spacingScore = { - arg hsArrays, min; - var centsArray; - centsArray = hsArrays.collect({arg hsArray; hsArrayToCents.value(hsArray)}).sort({arg a, b; a < b}); - centsArray.differentiate.drop(1).collect({arg pDistance; if(pDistance >= min, {1}, {0.01})}).sum; -}; - -rangeScore = { - arg hsArray1, hsArray2, min, max, low, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - if((pDistance >= min) && (pDistance <= max), {1}, {low}); -}; - -/* -intervalScore = { - arg hsArray1, hsArray2, mean, sd, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - //pDistance.gaussCurve(1, mean, sd) - stepFunc.value(pDistance) -}; -*/ - -intervalScore = { - arg hsArray1, hsArray2, mean, sd, signed = true; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - //pDistance.gaussCurve(1, mean, sd) - //if(pDistance >= 0, {stepFunc.value(abs(pDistance))}, {0.01}); - stepFunc.value(pDistance) -}; - -inclusionScore = { - arg array, test, min = 0.01; - if(array.collect({arg v; v.hash}).includes(test.hash), {min}, {1}); -}; - - -//------subroutines - -genTuples = { - var tuples; - tuples = dims.collect({[-1, 0, 1]}).allTuples.select({arg tuple; (abs(tuple.drop(1)).sum <= 1) && (tuple[0] == 0)}); - //tuples = dims.collect({[0, 1]}).allTuples.select({arg tuple; (abs(tuple.drop(1)).sum == 1) && (tuple[0] == 0)}); - tuples = tuples ++ tuples.collect({arg tuple; [-3, -2, -1, 1, 2, 3].collect({arg octTrans; tuple.deepCopy.put(0, octTrans)})}).flatten; -}; - -initVoices = { - var init, voicesInit; - voicesInit = popSize.collect({dims.collect({0})}); - /* - voicesInit = [dims.collect({0})]; - (popSize - 1).do({ - arg rep, new; - rep = dims.rand; - new = voicesInit.last.deepCopy; - new[rep] = new[rep] + [-1, 1].choose(); - voicesInit = voicesInit.add(new); - }); - */ - voicesInit.deepCopy; -}; - -genDurFunc = {arg chordProb, minPad, maxPad, minDur, maxDur, envData, seed; - var env, pTable, durFunc; - env = Env.pairs([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).asSignal(256).asList.asArray; - pTable = env.asRandomTable; - [chordProb, minPad, maxPad, minDur, maxDur, envData].postln; - durFunc = {arg allowChord, pad = false; - var res; - res = if(allowChord.not, { - pTable.tableRand * (maxDur - minDur) + minDur - }, { - if(1.0.rand < chordProb, {0}, {pTable.tableRand * (maxDur - minDur) + minDur}); - }).round(0.125); - if(pad, {res = res + rrand(minPad.asFloat, maxPad.asFloat).round(0.125)}); - if(res.asInteger == res, {res = res.asInteger}); - res - }; - seedFunc.value(durFunc, seed); -}; - -genStepFunc = {arg minStep, maxStep, envData, seed; - var envDataNorm, env, pTable, stepFunc; - [minStep, maxStep, envData].postln; - envDataNorm = ([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).flop; - envDataNorm = [envDataNorm[0].normalize(minStep, maxStep), envDataNorm[1]].flop; - env = Env.pairs(envDataNorm); - stepFunc = {arg pDist; - env.at(pDist).clip(0.001, 1); - }; - seedFunc.value(stepFunc, seed); -}; - -genOrders = {arg minMotifLength = 1, maxMotifLength = 5, minProgLength = 0, maxProgLength = 5; - ((maxMotifLength.asInteger - minMotifLength.asInteger).rand + minMotifLength.asInteger).collect({ - var noProgIns, noSusIns, noSilentIns, prog, sus, silent, order; - noSusIns = [1, 2, 3].wchoose(susWeights.normalizeSum); - //noProgIns = (popSize - noSusIns).rand + 1; - noProgIns = (popSize - noSusIns); - noSilentIns = popSize - noSusIns - noProgIns; - - # prog, sus, silent = (0..(popSize-1)).scramble.clumps([noProgIns, noSusIns, noSilentIns]); - - prog = (prog.scramble ++ ((maxProgLength.asInteger - minProgLength.asInteger).rand + minProgLength.asInteger).collect({prog.choose}).scramble); - if(silent == nil, {silent = []}); - [sus.scramble, prog, silent.scramble] - }); -}; - -updateVoices = {arg ins, sus; - var voices, candidates, nWeights, nProbs, sel; - - voices = lastXChanges.deepCopy.last; - - candidates = sus.collect({arg v; tuples.collect({arg t; voices[v] + t})}).flatten; - candidates = difference(candidates.asSet, voices.asSet).asList; - nProbs = candidates.collect({arg candidate; - var stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore; - - //stepScore = intervalScore.value(voices[ins], candidate, 30, 400, 0.1); - stepScore = intervalScore.value(voices[ins], candidate, 100, 100); - recentlySoundedScore = inclusionScore.value(lastXChanges.flop[ins], candidate, 0.01); - - - - if(rangeScore.value(candidate.collect({0}), voices[ins], ranges[ins][1] - 500, ranges[ins][1], 0, true) == 1, { - isInRangeScore = 1 - rangeScore.value(candidate.collect({0}), candidate, ranges[ins][0] + 500, ranges[ins][1] - 500, 0, true); - isInRangeScore = isInRangeScore * rangeScore.value(candidate.collect({0}), candidate, ranges[ins][0], ranges[ins][1], 0, true) - }, { - isInRangeScore = rangeScore.value(candidate.collect({0}), candidate, ranges[ins][0], ranges[ins][1], 0, true); - }); - - - //isInRangeScore = rangeScore.value(candidate.collect({0}), candidate, ranges[ins][0], ranges[ins][1], 0, true); - //old way - worked but actually by accident (I think) - //isInRangeScore = rangeScore.value(candidate, candidate.collect({0}), ranges[ins][0], ranges[ins][1], 0, true); - - - regScore = spacingScore.value(voices.deepCopy.put(ins, candidate), 300); - hdScore = pow(hdSum.value(voices.deepCopy.put(ins, candidate)), hdExp); - if(hdInvert == 0, {hdScore = 1/hdScore}); - //maybe what you want here is a vector to another root and then favoring movement towards it. - //distScore = pow(hsChordalDistance.value(voices, voices.put(ins, candidate)), 2); - - [stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore] - }); - - nWeights = passagesWeights; - - //this handles nWeights of 0; mainly for testing - nProbs = nProbs.flop.select({arg scores, s; nWeights[s] != 0}).flop; - nWeights = nWeights.select({arg weight; weight != 0}); - nProbs = nProbs.flop.collect({arg scores, s; - if(scores.sum == 0, {scores}, {scores.normalizeSum * nWeights[s]}) - }); - nProbs = nProbs.flop.collect({arg scores, s; scores.product}).normalizeSum; - - sel = candidates.wchoose(nProbs); - - voices[ins] = sel; - lastXChanges = lastXChanges.add(voices).keep(-5); -}; - -genSubMotif = {arg order, orderIndex, lastState, repeatLast = false, startFromLast = false, isLastOrder = false; - var sus, prog, silent, flatOrder, res, isInChord, allowChord, pad, lastXChangesHold, voices, adder; - # sus, prog, silent = order; - flatOrder = silent ++ sus ++ prog; - lastXChangesHold = lastXChanges.deepCopy; - voices = lastState.deepCopy; - isInChord = popSize.collect({false}); - allowChord = false; - pad = false; - res = []; - "------generating motif".postln; - //need to figure out here if voices move between motifs - flatOrder.do({arg ins, i; - - if(prog.includes(ins) && repeatLast.not, {updateVoices.value(ins, sus)}); - adder = if(silent.includes(ins), {["Rest"]}, {lastXChanges.last.deepCopy[ins]}); - - if(voices[ins] != adder, { - var dur; - - if((sus ++ silent).includes(ins), { - allowChord = (ins != sus.last); - pad = (ins == sus.last); - }, { - if(i < (flatOrder.size - 1), { - allowChord = (isInChord[flatOrder[i + 1]] || (ins == flatOrder[i + 1])).not; - pad = false; - }, { - allowChord = false; - pad = true - }); - }); - if((orderIndex == 0) && sus.includes(ins), { - dur = entrancesDurFunc.value(allowChord, pad); - }, { - dur = passagesDurFunc.value(allowChord, pad); - }); - if(dur == 0, {isInChord[ins] = true}, {isInChord = popSize.collect({false})}); - - voices[ins] = adder; - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - - // pad ending - if(orderIndex == (orders.size - 1), { - (0..(popSize-1)).scramble.do({arg ins; - if(res.last.first[ins] != ["Rest"], { - var dur; - voices[ins] = ["Rest"]; - allowChord = (voices != popSize.collect({["Rest"]})); - pad = allowChord.not; - dur = exitsDurFunc.value(allowChord, pad); - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - }); - - //format and return - if(startFromLast, {lastXChanges = lastXChangesHold.deepCopy}); - res; -}; - - -//------primary routines - -genMotif = { - var repeats, fSeq, fDur, durAdd; - - repeats = 1; - fSeq = []; - - repeats.do({arg index; - var motif; - - motif = []; - - orders.do({arg order, o; - var lastState, subMotif; - lastState = if(o == 0, {popSize.collect({["Rest"]})}, {motif.last.last.first}); - subMotif = genSubMotif.value(order, o, lastState, isLastOrder: o == (orders.size - 1)); - motif = motif.add(subMotif); - - }); - - sanityCheck.value(motif, index); - - fSeq = fSeq.add(motif); - }); - - //round last duration to measure - fDur = fSeq.flatten.flatten.slice(nil, 1).sum; - durAdd = fDur.round(4) - fDur; - if(durAdd < 0, {durAdd = 4 - durAdd}); - fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] = fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] + durAdd; - - fSeq -}; - -genSecondarySeq = {arg seq; - var curdles, fSeq; - curdles = []; - while({curdles.sum < seq.size}, {curdles = curdles ++ [3.rand + 1]}); - - fSeq = seq.clumps(curdles).collect({arg clump, m; - var repeats, paddedSeq; - - //add rest - paddedSeq = clump.add([[[popSize.collect({["Rest"]}), 0.5.rand]]]); - - //implement repeats - repeats = [0.rand + 1, 1].wchoose([1, 0].normalizeSum); - repeats.collect({paddedSeq}); - }); - fSeq -}; - - -//------audition funcs - -/* -Event.addEventType(\osc, { - if (~addr.postln.notNil) { - ~addr.sendMsg(~indexPath, ~indexMsg); - ~addr.sendMsg(~seqPath, stringifyToDepth.value(~seqMsg, 3)); - //~addr.sendMsg("/STATE/OPEN", (dir.replace("supercollider", "resources") +/+ ~idMsg +/+ ~idMsg ++ "_gui_state" ++ ".state").standardizePath.postln); - }; -}); -*/ - -Event.addEventType(\osc, { - if (~addr.notNil) { - ~msg; - ~addr.sendMsg(~path, *~msg); - }; -}); - -genPatterns = {arg inSeq, addr, oneShot = false; - var voices, durs, pbinds, res, indices, sectionDurs, msg, ids, seq; - seq = inSeq.collect({arg mSeq; mSeq[0]}); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - pbinds = voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs, attacks, rels, amps; - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - //attacks = 2.collect({rrand(1, 3)}) ++ freqs.drop(2).collect({rrand(0.3, 0.5)}); - attacks = fDurs.collect({arg dur; dur * rrand(0.2, 0.4)}); - //rels = freqs.drop(2).collect({rrand(0.3, 0.5)}) ++ 2.collect({rrand(1, 3)}); - rels = (clumps.size - 1).collect({arg c; - if(clumps[c + 1][0] == ["Rest"], {rrand(1.0, 3.0)}, {rrand(0.3, 0.5)}); - }); - rels = rels.add(rrand(1.0, 3.0)); - amps = freqs.collect({rrand(0.6, 0.99)}); - - [ - Pbind( - \instrument, \string_model, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \attack, Pseq(attacks, 1), - \sustain, Pseq(fDurs, 1), - \release, Pseq(rels, 1), - //\amp, Pseq(amps, 1), - \amp, Pbrown(0.5, 1, 0.5), - \busIndex, v - ), - Pbind( - \instrument, \sine, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \sustain, Pseq(fDurs, 1), - \busIndex, v - ) - ] - }).flatten; - if(oneShot.not, { - msg = inSeq.collect({arg mSeq, m; mSeq[1..]}); - //ids = inSeq.collect({arg mSeq, m; mSeq[2]}); - sectionDurs = seq.collect({arg mSeq; mSeq.flatten2(mSeq.maxDepth - 5).flop[1].sum}); - pbinds = pbinds ++ - [ - Pbind( - \type, \osc, - \addr, addr, - \path, "/playing", - \msg, Pseq(msg, 1), - \dur, Pseq(sectionDurs, 1) - ); - ] - }); - res = Ppar(pbinds); - res -}; - -/* -genMidiPatterns = {arg seq; - var voices, durs, patterns, res, mOut, pbRange; - pbRange = 1; //semitones - change this as needed for your situation - mOut = MIDIOut.newByName("TiMidity", "TiMidity port 0").latency_(Server.default.latency); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - res = Ppar( - voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs; - - mOut.program(v, 70); - - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - - Pbind( - \type, \midi, - \chan, v, - \noteval, Pseq(freqs.cpsmidi - 24, 1), - \note, Pfunc({ | event | event[\noteval].floor }), - \dur, Pseq(fDurs, 1), - \midiout, mOut, - \amp, 1, - \bend, Pfunc({ - | event | - if (event[\note].isRest.not) { - var pitchbendvalue = event[\noteval].frac.linlin(0, pbRange, 8192, 8192*2).asInteger; - m.bend(v, pitchbendvalue); - }; - 0; // return something other than nil to avoid stopping the pattern - }), - ); - }); - ); - res -}; -*/ - - -//------resource management funcs - -genUID = {Date.seed.asHexString.toLower}; - -seedFunc = {arg func, seed; - var funcArgs, next; - next = Routine({loop{func.valueArray(funcArgs).yield }}); - next.randSeed_(seed); - {arg ...args; funcArgs = args; next.value} -}; - -stringifyToDepth = {arg data, maxDepth = 1; - var prettyString = "", rCount = 0, writeArray, indent; - - if(maxDepth == 0, { - data.asCompileString - }, { - indent = {arg size; size.collect({" "}).join("")}; - writeArray = {arg array; - prettyString = prettyString ++ indent.value(rCount) ++ "[\n"; - rCount = rCount + 1; - if(rCount < maxDepth, { - array.do({arg subArray; writeArray.value(subArray)}); - }, { - prettyString = prettyString ++ array.collect({arg subArray; - indent.value(rCount + 1) ++ subArray.asCompileString - }).join(",\n"); - }); - rCount = rCount - 1; - prettyString = prettyString ++ "\n" ++ indent.value(rCount) ++ "],\n"; - }; - - writeArray.value(data); - prettyString.replace(",\n\n", "\n").drop(-2); - }) -}; - -sanityCheck = {arg motif, index; - //print functions = very helpful - ("----------" + index + "------------").postln; - - motif.flatten.do({arg val, v; - if(v > 0, { - if(motif.flatten[v-1][0].hammingDistance(val[0]) > 1, {"problem 1".postln}); - if(motif.flatten[v-1][0].hammingDistance(val[0]) == 0, {"problem 2".postln}); - }); - val.postln - }); - "***********".postln; -}; - -msgInterpret = {arg in, escapeDoubleQuotes = true, escapeSingleQuotes = true; - var res; - - res = in; - if(res.isNil.not, { - if((res.isArray && res.isString.not), { - res = res.asCompileString; - res = res.replace(" ", "").replace("\n", "").replace("\t", ""); - if(escapeSingleQuotes, {res = res.replace("\'", "")}); - if(escapeDoubleQuotes, {res = res.replace("\"", "")}); - res = res.replace("Rest", "\"Rest\""); - res = res.interpret; - }, { - var tmpRes; - if(res.every({arg char; char.isDecDigit}), {tmpRes = res.asInteger}); - if(res.contains("."), {tmpRes = res.asFloat}); - if(tmpRes != nil, {res = tmpRes}); - }); - }); - res -}; - -writeResources = {arg path, dict; - var file, modelItems, resString; - file = File(path,"w"); - - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - - resString = nameSpaces.collect({arg nameSpace; - var depth = 0, insert = " "; - if(nameSpace == "music_data", {depth = 3; insert = "\n"}); - if(nameSpace == "last_changes", {depth = 1; insert = "\n"}); - if(nameSpace == "order", {depth = 1; insert = "\n"}); - if((nameSpace == "ref_uid") && (dict[nameSpace] == nil), {dict[nameSpace] = "nil"}); - "\"" ++ nameSpace ++ "\":" ++ insert ++ stringifyToDepth.value(dict[nameSpace], depth) - }).join(",\n"); - - resString = "{\n" ++ resString ++ "\n}"; - - file.write(resString); - file.close; - resString -}; - -loadModelFile = {arg path; loadModelJSON.value(File(path, "r").readAllString.parseJSON)}; - -loadModelJSON = {arg jsonObject; - var dict; - dict = Dictionary.with(*nameSpaces.collect({arg nS; nS->msgInterpret.value(jsonObject[nS])})); - dict -}; - -setGlobalVars = {arg dict, skipLastXChanges = false; - var tmpLastXChanges; - tmpLastXChanges = lastXChanges.deepCopy; - // order really matters!!!! - # seq, lastXChanges, curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited = nameSpaces.collect({arg nS; dict[nS]}); - if(skipLastXChanges, {lastXChanges = tmpLastXChanges}); - dict -}; - -globalVarsToDict = { - var modelItems, dict; - // order really matters!!!! - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - dict = Dictionary.with(*nameSpaces.collect({arg nS, n; nS->modelItems[n]})); -}; - -loadLedgerFile = {arg path; - ledgerPath = path; - resourceDir = path.splitext(".").drop(-1).join; - loadLedgerJSON.value(File(ledgerPath, "r").readAllString.parseJSON) -}; - -loadLedgerJSON = {arg jsonObject; ledger = jsonObject["ledger"]}; - -saveLedger = {arg ledger, path; - var file, curResourceDir; - file = File(path, "w"); - curResourceDir = resourceDir; - resourceDir = path.splitext(".").drop(-1).join; - if(curResourceDir != resourceDir, { - File.mkdir(resourceDir); - ledger.do({arg id; - File.copy(curResourceDir +/+ id, resourceDir +/+ id); - }); - }); - file.write("{\n\"ledger\":\n" ++ stringifyToDepth.value(ledger, 1) ++ "\n}"); - file.close; -}; - -//------global vars - -primes = [[2, 1], [3, 2], [5, 4], [7, 4], [11, 8], [13, 8]]; -//ranges = [[-2400, 0], [-1200, 1200], [0, 2400], [0, 2400]]; -exPath = thisProcess.nowExecutingPath; -dir = exPath.dirname; -//popSize = 4; -dims = primes.size; -tuples = genTuples.value(); -//refUID = nil; -group = Group.new; -~group = group; -loadLedgerFile.value(dir +/+ ".." +/+ "resources" +/+ "piece_ledger.json"); -resourceDir = (dir +/+ ".." +/+ "resources" +/+ "piece_ledger"); -//passagesWeights = [1, 1, 1, 1, 1]; -//susWeights = [1, 1, 1]; -// order really matters!!!! -nameSpaces = [ - "music_data", "last_changes", "cur_uid", "ref_uid", "order_seed", "dur_seed", "motifs_seed", - "entrances_probs_vals","passages_probs_vals", "exits_probs_vals", - "ranges", "step_probs_vals", "passages_weights", "hd_exp", "hd_invert", - "order", "sus_weights", "order_size", "passages_size", - "motif_edited", "order_edited" -]; - - -//------OSC funcs - -OSCdef(\load_ledger, {arg msg, time, addr, port; - loadLedgerFile.value(msg[1].asString); -}, \load_ledger); - -OSCdef(\load_model, {arg msg, time, addr, port; - var dict; - dict = loadModelFile.value(msg[1].asString); - setGlobalVars.value(dict); -}, \load_model); - -OSCdef(\save_ledger, {arg msg, time, addr, port; - msg.postln; - ledger = msgInterpret.value(msg[1].asString.parseJSON["ledger"], false).postln; - //loadLedgerJSON.value(msg[0]) - saveLedger.value(ledger, msg[2].asString); - //loadLedgerFile.value(msg[1].asString); -}, \save_ledger); - -OSCdef(\generate, {arg msg, time, addr, port; - var path, dict, durSeeds, musPath, modelString; - msg.postln; - - path = msg[1].asString; - - dict = loadModelFile.value(path); - setGlobalVars.value(dict, true); - - popSize = ranges.size; - - //refUID.postln; - - loadLedgerFile.value(ledgerPath); - if(ledger == nil, {ledger = ["tmp"]}); - if(ledger.last != "tmp", {ledger = ledger.add("tmp")}); - - if(refUID == nil, {lastXChanges = [initVoices.value().deepCopy]}); - if((refUID != nil) && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - lastXChanges = msgInterpret.value(file.readAllString.parseJSON["last_changes"]); - }); - - refUID.postln; - lastXChanges.collect({arg item; item.postln}); - - durSeeds = seedFunc.value({3.collect({rrand(100000, 999999)})}, durSeed).value.postln; - entrancesDurFunc = genDurFunc.valueArray(entrancesProbVals[..4] ++ [entrancesProbVals[5..]] ++ [durSeeds[0]]); - passagesDurFunc = genDurFunc.valueArray(passagesProbVals[..4] ++ [passagesProbVals[5..]] ++ [durSeeds[1]]); - exitsDurFunc = genDurFunc.valueArray(exitsProbVals[..4] ++ [exitsProbVals[5..]] ++ [durSeeds[2]]); - - if(orders == nil, { - orders = seedFunc.value(genOrders, orderSeed).valueArray(orderSize ++ passagesSize); - //addr.sendMsg("/order", stringifyToDepth.value(orders, 1)); - }); - - stepFunc = genStepFunc.valueArray(stepProbsVals[..1] ++ [stepProbsVals[2..]] ++ [motifSeed]); - seq = seedFunc.value(genMotif, motifSeed).value; - - lastXChanges.collect({arg item; item.postln}); - - dict = globalVarsToDict.value; - modelString = writeResources.value(path, dict); - - //addr.sendMsg("/generated", musPath, stringifyToDepth.value(seq, 3)); - //~seq = seq; - - addr.sendMsg("/generated", path, modelString, ledgerPath); -}, \generate); - - -OSCdef(\commit, {arg msg, time, addr, port; - var musicData, musicChanged, dict, newLedger, modelPath, musString, musFile, test1, test2, lastCurUID, commitType, commitPos, equalityLedger; - //msg.postln; - - /* - test1 = msg[1].asString.parseJSON; - test2 = (dir +/+ ".." +/+ "resources/tmp/tmp_music" ++ ".json").standardizePath.parseJSONFile; - msgInterpret.value(test1["music"])[0][0][0][1].class.postln; - msgInterpret.value(test2["music_data"])[0][0][0][1].class.postln; - (test1["music"] == test2["music_data"]).postln; - */ - - musicData = loadModelJSON.value(msg[1].asString.parseJSON)["music_data"].postln; - musicChanged = (musicData != seq).postln; - commitType = msg[2].asString; - commitPos = msg[3].postln.asInteger; - - lastCurUID = curUID.deepCopy; - curUID = genUID.value; - - File.mkdir((resourceDir +/+ curUID).standardizePath); - File.copy(exPath, (resourceDir +/+ curUID +/+ curUID ++ "_code" ++ ".scd").standardizePath); - - modelPath = (resourceDir +/+ curUID +/+ curUID ++ "_mus_model" ++ ".json").standardizePath; - dict = globalVarsToDict.value; - if(musicChanged, { - seq = musicData; - dict["music_data"] = seq; - dict["motif_edited"] = "true" - }); - dict["cur_uid"] = curUID; - - writeResources.value(modelPath, dict); - - File.delete(ledgerPath ++ "_bak"); - File.copy(ledgerPath, ledgerPath ++ "_bak"); - File.delete(ledgerPath); - - /* - if(commitType == "add", { - if(lastCurUID == "tmp", { - ledger = ledger.drop(-1).add(curUID); - }, { - ledger = ledger.add(curUID); - }) - }); - */ - - ledger.postln; - - if(commitType == "add", {ledger = ledger.add(curUID)}); - - if(commitType == "insert", {ledger = ledger.insert(commitPos + 1, curUID)}); - - if(commitType == "replace", {ledger = ledger.put(commitPos, curUID)}); - - equalityLedger = ledger.collect({arg item; item.asSymbol}); - if(equalityLedger.includes(\tmp).postln, {ledger.removeAt(equalityLedger.indexOf(\tmp).postln)}); - - ledger.postln; - - saveLedger.value(ledger, ledgerPath); - - addr.sendMsg("/committed", curUID, ledgerPath); - //refUID = curUID; - -}, \commit); - -OSCdef(\transport, {arg msg, time, addr, port; - msg.postln; - if(msg[1] == 0, { - group.set(\release, 2); - group.set(\gate, 0); - player.stop; - }, { - // the cued sequence can now be read from file, so this can be cleaned up - var cSize, patterns, pSeq, cuedSeek, indexStart, indexEnd, tmpLedger; - if(msg[1] == 1, { - pSeq = []; - cuedSeek = (seq != nil); - indexStart = msg[2].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.postln.parseJSON["music_data"]), path, indexStart + index, uid]); - file.close; - }); - }); - if(cuedSeek, { - var path, file; - path = (resourceDir +/+ "tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - patterns = genPatterns.value(pSeq, addr); - }, { - pSeq = [loadModelJSON.value(msg[2].asString.parseJSON)["music_data"].postln]; - patterns = genPatterns.value(pSeq, addr, true); - }); - player = Pfset(pattern: patterns, cleanupFunc: { - addr.sendMsg("/transport", 0); - addr.sendMsg("/one_shot", 0); - }); - player = player.play - }); -}, \transport); - - -OSCdef(\transcribe_motif, {arg msg, time, addr, port; - var tSeq, refChord, refUID; - - msg.postln; - - tSeq = [loadModelJSON.value(msg[1].asString.parseJSON)["music_data"]]; - refUID = msg[2].asString.postln; - - if((refUID != "nil") && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }, { - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - }); - - ~transcribe.value(tSeq, refChord, (dir +/+ ".." +/+ "lilypond" +/+ "includes").standardizePath, addr, "/transcribe_motif"); -}, \transcribe_motif); - - -OSCdef(\transcribe_all, {arg msg, time, addr, port; - var cSize, patterns, cuedSeek, indexStart, indexEnd, tmpLedger; - if(true, { - cuedSeek = (seq != nil); - indexStart = msg[1].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - - //tmp for testing transcription - //indexEnd = (indexStart+5); - - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - var lilyPartLedgerFiles; - - lilyPartLedgerFiles = 4.collect({arg p; - File((dir +/+ ".." +/+ "lilypond" +/+ "includes" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly").standardizePath, "w"); - }); - - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file, fileString, tSeq, refUID, refChord; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - fileString = file.readAllString; - tSeq = msgInterpret.value(fileString.parseJSON["music_data"]); - refUID = msgInterpret.value(fileString.parseJSON["ref_uid"]); - file.close; - - //uid.postln; - //(refUID == "nil").postln; - - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - - if(refUID != "nil", { - path = (resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }); - - if(index != indexEnd, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath); - }, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath, addr, "/transcribe_all"); - }); - - lilyPartLedgerFiles.do({arg f, p; - f.write("\\include \"" ++ resourceDir +/+ uid +/+ "lilypond" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly\"\n"); - }); - - }); - - lilyPartLedgerFiles.do({arg f; - f.close - }); - }); - /* - if(cuedSeek, { - var path, file; - path = (dir +/+ ".." +/+ "resources/tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - */ - }, { - - }); - -}, \transcribe_all); - -) - - diff --git a/resources/string_quartet_3/69c568c6/69c568c6_mus_model.json b/resources/string_quartet_3/69c568c6/69c568c6_mus_model.json deleted file mode 100644 index a490727..0000000 --- a/resources/string_quartet_3/69c568c6/69c568c6_mus_model.json +++ /dev/null @@ -1,535 +0,0 @@ -{ -"music_data": -[ - [ - [ - [ [ [ "Rest" ], [ 0, 0, 0, 0, 0, 0 ], [ "Rest" ], [ "Rest" ] ], 1.625 ], - [ [ [ "Rest" ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ "Rest" ] ], 1 ], - [ [ [ "Rest" ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1.125 ], - [ [ [ 1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ 1, 0, 0, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 0.625 ], - [ [ [ 1, 0, 0, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 0.75 ] - ], - [ - [ [ [ 1, 0, 0, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ], [ -1, 2, 0, 0, 0, 0 ] ], 1.25 ] - ], - [ - [ [ [ 1, 0, 0, 0, 0, 0 ], [ -2, 2, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ], [ -1, 2, 0, 0, 0, 0 ] ], 1.625 ] - ], - [ - [ [ [ 0, 1, 0, 0, 0, 0 ], [ -2, 2, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ], [ -1, 2, 0, 0, 0, 0 ] ], 0.75 ] - ], - [ - [ [ [ 0, 1, 0, 0, 0, 0 ], [ -1, 1, -1, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ], [ -1, 2, 0, 0, 0, 0 ] ], 1.125 ], - [ [ [ 0, 1, 0, 0, 0, 0 ], [ -1, 1, -1, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ], [ 0, 1, -1, 0, 0, 0 ] ], 1.125 ] - ], - [ - [ [ [ 1, 0, -1, 0, 0, 0 ], [ -1, 1, -1, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ], [ 0, 1, -1, 0, 0, 0 ] ], 0.5 ], - [ [ [ 1, 0, -1, 0, 0, 0 ], [ -1, 1, -1, 0, 0, 0 ], [ 0, 0, -1, 0, 0, 0 ], [ 0, 1, -1, 0, 0, 0 ] ], 0.875 ], - [ [ [ 1, 0, -1, 0, 0, 0 ], [ -1, 1, -1, 0, 0, 0 ], [ 0, 0, -1, 0, 0, 0 ], [ 1, 1, -1, -1, 0, 0 ] ], 1.5 ] - ], - [ - [ [ [ 1, 0, -1, 0, 0, 0 ], [ -1, 1, -1, 0, 0, 0 ], [ -1, 2, -1, 0, 0, 0 ], [ 1, 1, -1, -1, 0, 0 ] ], 1 ], - [ [ [ 0, 2, -1, 0, 0, 0 ], [ -1, 1, -1, 0, 0, 0 ], [ -1, 2, -1, 0, 0, 0 ], [ 1, 1, -1, -1, 0, 0 ] ], 0.875 ] - ], - [ - [ [ [ 0, 2, -1, 0, 0, 0 ], [ 0, 1, -1, -1, 0, 0 ], [ -1, 2, -1, 0, 0, 0 ], [ 1, 1, -1, -1, 0, 0 ] ], 1.375 ], - [ [ [ -2, 2, -1, -1, 0, 0 ], [ 0, 1, -1, -1, 0, 0 ], [ -1, 2, -1, 0, 0, 0 ], [ 1, 1, -1, -1, 0, 0 ] ], 0.875 ], - [ [ [ -2, 2, -1, -1, 0, 0 ], [ 0, 1, -1, -1, 0, 0 ], [ 0, 2, -1, -1, 0, 0 ], [ 1, 1, -1, -1, 0, 0 ] ], 0.5 ] - ], - [ - [ [ [ -2, 2, -1, -1, 0, 0 ], [ 0, 1, -1, -1, 0, 0 ], [ 0, 1, 0, -1, 0, 0 ], [ 1, 1, -1, -1, 0, 0 ] ], 1.75 ], - [ [ [ -2, 1, -1, -1, 0, 1 ], [ 0, 1, -1, -1, 0, 0 ], [ 0, 1, 0, -1, 0, 0 ], [ 1, 1, -1, -1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -2, 1, -1, -1, 0, 1 ], [ 1, 1, -1, -2, 0, 0 ], [ 0, 1, 0, -1, 0, 0 ], [ 1, 1, -1, -1, 0, 0 ] ], 1.25 ] - ], - [ - [ [ [ -2, 1, -1, -1, 0, 1 ], [ 1, 1, -1, -2, 0, 0 ], [ 1, 0, -1, -1, 0, 0 ], [ 1, 1, -1, -1, 0, 0 ] ], 0.625 ], - [ [ [ -2, 1, -1, -1, 0, 1 ], [ -1, 2, -1, -1, 0, 1 ], [ 1, 0, -1, -1, 0, 0 ], [ 1, 1, -1, -1, 0, 0 ] ], 0.875 ] - ], - [ - [ [ [ -2, 1, -1, -1, 0, 1 ], [ 0, 1, -2, -1, 0, 1 ], [ 1, 0, -1, -1, 0, 0 ], [ 1, 1, -1, -1, 0, 0 ] ], 1.25 ] - ], - [ - [ [ [ -2, 1, -1, -1, 0, 1 ], [ 1, 1, -1, -1, -1, 0 ], [ 1, 0, -1, -1, 0, 0 ], [ 1, 1, -1, -1, 0, 0 ] ], 0.75 ], - [ [ [ -2, 1, -1, -1, 0, 1 ], [ 1, 1, -1, -1, -1, 0 ], [ 0, 2, -1, -1, 0, 0 ], [ 1, 1, -1, -1, 0, 0 ] ], 0.875 ] - ], - [ - [ [ [ -1, 2, -1, -2, 0, 0 ], [ 1, 1, -1, -1, -1, 0 ], [ 0, 2, -1, -1, 0, 0 ], [ 1, 1, -1, -1, 0, 0 ] ], 1.625 ] - ], - [ - [ [ [ -1, 2, -1, -2, 0, 0 ], [ -1, 2, -1, -1, 0, 0 ], [ 0, 2, -1, -1, 0, 0 ], [ 1, 1, -1, -1, 0, 0 ] ], 1.375 ] - ], - [ - [ [ [ -1, 2, -1, -2, 0, 0 ], [ -1, 2, -1, -1, 0, 0 ], [ 1, 2, -1, -2, 0, 0 ], [ 1, 1, -1, -1, 0, 0 ] ], 1.125 ], - [ [ [ -1, 2, -1, -2, 0, 0 ], [ -1, 2, -1, -1, 0, 0 ], [ 1, 2, -1, -2, 0, 0 ], [ 0, 2, -1, -1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, 2, -1, -2, 0, 0 ], [ 0, 2, -1, -2, 0, 0 ], [ 1, 2, -1, -2, 0, 0 ], [ 0, 2, -1, -1, 0, 0 ] ], 1.625 ], - [ [ [ -1, 2, -1, -2, 0, 0 ], [ 0, 2, -1, -2, 0, 0 ], [ 0, 2, 0, -1, 0, 0 ], [ 0, 2, -1, -1, 0, 0 ] ], 0.75 ] - ], - [ - [ [ [ -1, 2, -1, -2, 0, 0 ], [ -1, 2, 0, -1, 0, 0 ], [ 0, 2, 0, -1, 0, 0 ], [ 0, 2, -1, -1, 0, 0 ] ], 1.375 ], - [ [ [ -1, 2, -1, -2, 0, 0 ], [ -1, 2, 0, -1, 0, 0 ], [ 1, 2, 0, -2, 0, 0 ], [ 0, 2, -1, -1, 0, 0 ] ], 1.75 ] - ], - [ - [ [ [ -1, 2, -1, -2, 0, 0 ], [ -1, 2, 0, -1, 0, 0 ], [ 0, 2, -1, -2, 1, 0 ], [ 0, 2, -1, -1, 0, 0 ] ], 1 ], - [ [ [ -1, 2, -1, -2, 0, 0 ], [ 1, 2, -1, -2, 0, -1 ], [ 0, 2, -1, -2, 1, 0 ], [ 0, 2, -1, -1, 0, 0 ] ], 1.125 ], - [ [ [ -1, 2, -1, -2, 0, 0 ], [ 1, 2, -1, -2, 0, -1 ], [ 0, 2, -1, -2, 1, 0 ], [ 1, 2, -1, -2, 0, 0 ] ], 1.125 ] - ], - [ - [ [ [ -1, 2, -1, -2, 0, 0 ], [ 1, 2, -1, -2, 0, -1 ], [ 0, 3, -1, -2, 0, 0 ], [ 1, 2, -1, -2, 0, 0 ] ], 1.375 ], - [ [ [ -1, 2, -1, -2, 0, 0 ], [ 1, 2, -1, -2, 0, -1 ], [ 0, 3, -1, -2, 0, 0 ], [ 1, 2, -1, -1, 0, -1 ] ], 1.125 ] - ], - [ - [ [ [ -1, 2, -1, -2, 0, 0 ], [ 1, 2, -1, -2, 0, -1 ], [ 0, 3, -1, -2, 0, 0 ], [ 1, 3, -2, -2, 0, 0 ] ], 0.75 ], - [ [ [ -1, 2, -1, -2, 0, 0 ], [ -1, 3, -1, -1, 0, 0 ], [ 0, 3, -1, -2, 0, 0 ], [ 1, 3, -2, -2, 0, 0 ] ], 1.5 ], - [ [ [ -1, 3, -1, -2, 0, 0 ], [ -1, 3, -1, -1, 0, 0 ], [ 0, 3, -1, -2, 0, 0 ], [ 1, 3, -2, -2, 0, 0 ] ], 1 ] - ], - [ - [ [ [ 0, 2, -2, -2, 0, 0 ], [ -1, 3, -1, -1, 0, 0 ], [ 0, 3, -1, -2, 0, 0 ], [ 1, 3, -2, -2, 0, 0 ] ], 1.75 ] - ], - [ - [ [ [ 0, 2, -2, -2, 0, 0 ], [ -1, 3, -1, -1, 0, 0 ], [ 1, 2, -2, -2, 0, 0 ], [ 1, 3, -2, -2, 0, 0 ] ], 1.375 ] - ], - [ - [ [ [ 0, 2, -2, -2, 0, 0 ], [ -1, 3, -1, -1, 0, 0 ], [ 0, 3, -2, -2, 0, 0 ], [ 1, 3, -2, -2, 0, 0 ] ], 1.625 ], - [ [ [ 0, 2, -2, -2, 0, 0 ], [ 0, 2, -2, -1, 0, 0 ], [ 0, 3, -2, -2, 0, 0 ], [ 1, 3, -2, -2, 0, 0 ] ], 1.75 ], - [ [ [ 0, 2, -2, -2, 0, 0 ], [ 0, 2, -2, -1, 0, 0 ], [ 0, 3, -2, -2, 0, 0 ], [ 1, 2, -2, -2, 0, 1 ] ], 1 ] - ], - [ - [ [ [ 0, 1, -2, -2, 0, 1 ], [ 0, 2, -2, -1, 0, 0 ], [ 0, 3, -2, -2, 0, 0 ], [ 1, 2, -2, -2, 0, 1 ] ], 1.875 ], - [ [ [ 0, 1, -2, -2, 0, 1 ], [ 0, 2, -1, -2, 0, 1 ], [ 0, 3, -2, -2, 0, 0 ], [ 1, 2, -2, -2, 0, 1 ] ], 0.5 ], - [ [ [ 0, 1, -2, -2, 0, 1 ], [ 0, 2, -1, -2, 0, 1 ], [ 0, 2, -2, -2, 0, 1 ], [ 1, 2, -2, -2, 0, 1 ] ], 0.875 ] - ], - [ - [ [ [ 0, 1, -2, -2, 0, 1 ], [ 0, 2, -1, -2, 0, 1 ], [ 0, 1, -2, -2, 0, 2 ], [ 1, 2, -2, -2, 0, 1 ] ], 1.375 ], - [ [ [ 0, 1, -2, -2, 0, 1 ], [ 0, 2, -1, -2, 0, 1 ], [ 0, 1, -2, -2, 0, 2 ], [ 1, 1, -2, -2, 0, 2 ] ], 0.625 ] - ], - [ - [ [ [ 0, 1, -2, -2, 0, 1 ], [ 0, 2, -1, -2, 0, 1 ], [ 0, 1, -2, -2, 0, 2 ], [ 1, 2, -1, -2, 0, 1 ] ], 0.625 ], - [ [ [ -1, 1, -1, -2, 0, 1 ], [ 0, 2, -1, -2, 0, 1 ], [ 0, 1, -2, -2, 0, 2 ], [ 1, 2, -1, -2, 0, 1 ] ], 0.5 ] - ], - [ - [ [ [ -1, 1, -1, -2, 0, 1 ], [ 1, 1, -2, -2, 0, 1 ], [ 0, 1, -2, -2, 0, 2 ], [ 1, 2, -1, -2, 0, 1 ] ], 0.75 ] - ], - [ - [ [ [ -1, 1, -1, -2, 0, 1 ], [ 1, 1, -2, -2, 0, 1 ], [ 0, 1, -1, -2, 1, 1 ], [ 1, 2, -1, -2, 0, 1 ] ], 0.875 ] - ], - [ - [ [ [ -1, 1, -1, -2, 0, 1 ], [ 1, 1, -2, -2, 0, 1 ], [ 0, 2, -1, -2, 0, 1 ], [ 1, 2, -1, -2, 0, 1 ] ], 1.5 ], - [ [ [ -2, 3, -1, -2, 0, 1 ], [ 1, 1, -2, -2, 0, 1 ], [ 0, 2, -1, -2, 0, 1 ], [ 1, 2, -1, -2, 0, 1 ] ], 1.125 ] - ], - [ - [ [ [ -1, 2, -2, -2, 0, 1 ], [ 1, 1, -2, -2, 0, 1 ], [ 0, 2, -1, -2, 0, 1 ], [ 1, 2, -1, -2, 0, 1 ] ], 0.625 ], - [ [ [ -1, 2, -2, -2, 0, 1 ], [ 1, 1, -2, -2, 0, 1 ], [ 0, 2, -1, -2, 0, 1 ], [ 1, 2, -2, -2, 0, 1 ] ], 1.75 ], - [ [ [ -1, 2, -2, -2, 0, 1 ], [ 1, 1, -2, -2, 0, 1 ], [ 0, 2, -2, -2, 0, 1 ], [ 1, 2, -2, -2, 0, 1 ] ], 0.625 ] - ], - [ - [ [ [ -1, 2, -2, -2, 0, 1 ], [ 1, 1, -2, -2, 0, 1 ], [ 1, 1, -3, -2, 0, 1 ], [ 1, 2, -2, -2, 0, 1 ] ], 0.625 ], - [ [ [ 0, 1, -3, -2, 0, 1 ], [ 1, 1, -2, -2, 0, 1 ], [ 1, 1, -3, -2, 0, 1 ], [ 1, 2, -2, -2, 0, 1 ] ], 1.25 ] - ], - [ - [ [ [ 0, 1, -3, -2, 0, 1 ], [ 1, 0, -3, -2, 0, 1 ], [ 1, 1, -3, -2, 0, 1 ], [ 1, 2, -2, -2, 0, 1 ] ], 1.375 ], - [ [ [ -1, 2, -3, -2, 0, 1 ], [ 1, 0, -3, -2, 0, 1 ], [ 1, 1, -3, -2, 0, 1 ], [ 1, 2, -2, -2, 0, 1 ] ], 0.5 ] - ], - [ - [ [ [ -1, 2, -3, -2, 0, 1 ], [ 0, 2, -3, -2, 0, 1 ], [ 1, 1, -3, -2, 0, 1 ], [ 1, 2, -2, -2, 0, 1 ] ], 1 ], - [ [ [ 0, 1, -4, -2, 0, 1 ], [ 0, 2, -3, -2, 0, 1 ], [ 1, 1, -3, -2, 0, 1 ], [ 1, 2, -2, -2, 0, 1 ] ], 1.5 ] - ], - [ - [ [ [ 0, 1, -4, -2, 0, 1 ], [ 1, 1, -4, -2, 0, 1 ], [ 1, 1, -3, -2, 0, 1 ], [ 1, 2, -2, -2, 0, 1 ] ], 1.75 ], - [ [ [ -2, 3, -2, -2, 0, 1 ], [ 1, 1, -4, -2, 0, 1 ], [ 1, 1, -3, -2, 0, 1 ], [ 1, 2, -2, -2, 0, 1 ] ], 1.625 ] - ], - [ - [ [ [ -2, 2, -2, -2, 0, 2 ], [ 1, 1, -4, -2, 0, 1 ], [ 1, 1, -3, -2, 0, 1 ], [ 1, 2, -2, -2, 0, 1 ] ], 1.25 ], - [ [ [ -2, 2, -2, -2, 0, 2 ], [ 1, 1, -4, -2, 0, 1 ], [ 1, 2, -2, -3, 0, 1 ], [ 1, 2, -2, -2, 0, 1 ] ], 1.25 ], - [ [ [ -2, 2, -2, -2, 0, 2 ], [ -1, 2, -2, -2, 0, 2 ], [ 1, 2, -2, -3, 0, 1 ], [ 1, 2, -2, -2, 0, 1 ] ], 0.5 ] - ], - [ - [ [ [ -2, 2, -2, -2, 0, 2 ], [ 0, 3, -2, -3, 0, 1 ], [ 1, 2, -2, -3, 0, 1 ], [ 1, 2, -2, -2, 0, 1 ] ], 0.625 ], - [ [ [ -1, 3, -2, -3, 0, 1 ], [ 0, 3, -2, -3, 0, 1 ], [ 1, 2, -2, -3, 0, 1 ], [ 1, 2, -2, -2, 0, 1 ] ], 0.625 ] - ], - [ - [ [ [ -1, 3, -2, -3, 0, 1 ], [ 0, 3, -2, -3, 0, 1 ], [ 1, 2, -2, -3, 0, 1 ], [ 2, 2, -2, -3, 0, 1 ] ], 0.75 ] - ], - [ - [ [ [ -1, 3, -2, -3, 0, 1 ], [ 0, 3, -2, -3, 0, 1 ], [ 0, 4, -2, -3, 0, 1 ], [ 2, 2, -2, -3, 0, 1 ] ], 0.75 ], - [ [ [ 0, 3, -2, -4, 0, 1 ], [ 0, 3, -2, -3, 0, 1 ], [ 0, 4, -2, -3, 0, 1 ], [ 2, 2, -2, -3, 0, 1 ] ], 0.875 ] - ], - [ - [ [ [ 0, 3, -2, -4, 0, 1 ], [ 0, 3, -2, -3, 0, 1 ], [ 0, 4, -2, -3, 0, 1 ], [ 1, 4, -2, -3, 0, 1 ] ], 0.875 ] - ], - [ - [ [ [ -1, 3, -1, -3, 0, 1 ], [ 0, 3, -2, -3, 0, 1 ], [ 0, 4, -2, -3, 0, 1 ], [ 1, 4, -2, -3, 0, 1 ] ], 1.25 ] - ], - [ - [ [ [ 0, 2, -2, -3, 0, 1 ], [ 0, 3, -2, -3, 0, 1 ], [ 0, 4, -2, -3, 0, 1 ], [ 1, 4, -2, -3, 0, 1 ] ], 1.25 ] - ], - [ - [ [ [ 0, 2, -2, -3, 0, 1 ], [ 0, 3, -2, -3, 0, 1 ], [ 0, 4, -2, -3, 0, 1 ], [ 1, 3, -1, -3, 0, 1 ] ], 1.125 ], - [ [ [ 0, 3, -2, -3, -1, 1 ], [ 0, 3, -2, -3, 0, 1 ], [ 0, 4, -2, -3, 0, 1 ], [ 1, 3, -1, -3, 0, 1 ] ], 1.25 ] - ], - [ - [ [ [ 0, 3, -2, -3, -1, 1 ], [ 0, 4, -2, -3, -1, 1 ], [ 0, 4, -2, -3, 0, 1 ], [ 1, 3, -1, -3, 0, 1 ] ], 0.875 ], - [ [ [ -1, 3, -2, -3, 0, 1 ], [ 0, 4, -2, -3, -1, 1 ], [ 0, 4, -2, -3, 0, 1 ], [ 1, 3, -1, -3, 0, 1 ] ], 1.625 ], - [ [ [ -1, 3, -2, -3, 0, 1 ], [ 0, 4, -2, -3, -1, 1 ], [ 0, 4, -2, -3, 0, 1 ], [ 0, 4, -2, -2, 0, 1 ] ], 0.375 ] - ], - [ - [ [ [ -1, 3, -2, -3, 0, 1 ], [ 0, 3, -1, -3, 0, 1 ], [ 0, 4, -2, -3, 0, 1 ], [ 0, 4, -2, -2, 0, 1 ] ], 0.5 ], - [ [ [ -1, 3, -2, -3, 0, 1 ], [ 0, 3, -1, -3, 0, 1 ], [ 0, 4, -2, -3, 0, 1 ], [ 1, 4, -2, -3, 0, 1 ] ], 0.5 ] - ], - [ - [ [ [ -1, 4, -2, -3, 0, 0 ], [ 0, 3, -1, -3, 0, 1 ], [ 0, 4, -2, -3, 0, 1 ], [ 1, 4, -2, -3, 0, 1 ] ], 0.75 ], - [ [ [ -1, 4, -2, -3, 0, 0 ], [ -1, 4, -2, -2, 0, 1 ], [ 0, 4, -2, -3, 0, 1 ], [ 1, 4, -2, -3, 0, 1 ] ], 1.5 ] - ], - [ - [ [ [ -1, 4, -2, -3, 0, 0 ], [ -1, 4, -2, -2, 0, 1 ], [ 0, 4, -2, -2, 0, 0 ], [ 1, 4, -2, -3, 0, 1 ] ], 1.125 ], - [ [ [ -1, 4, -2, -3, 0, 0 ], [ -1, 4, -2, -2, 0, 1 ], [ 0, 4, -2, -2, 0, 0 ], [ 2, 3, -2, -3, 0, 0 ] ], 1.5 ] - ], - [ - [ [ [ -1, 3, -2, -2, 0, 0 ], [ -1, 4, -2, -2, 0, 1 ], [ 0, 4, -2, -2, 0, 0 ], [ 2, 3, -2, -3, 0, 0 ] ], 0.625 ], - [ [ [ -1, 3, -2, -2, 0, 0 ], [ 1, 3, -2, -3, 0, 0 ], [ 0, 4, -2, -2, 0, 0 ], [ 2, 3, -2, -3, 0, 0 ] ], 1.125 ], - [ [ [ -1, 3, -2, -2, 0, 0 ], [ 1, 3, -2, -3, 0, 0 ], [ 1, 4, -2, -3, 0, 0 ], [ 2, 3, -2, -3, 0, 0 ] ], 1.625 ] - ], - [ - [ [ [ -1, 3, -2, -2, 0, 0 ], [ 1, 3, -2, -3, 0, 0 ], [ 1, 4, -2, -3, 0, 0 ], [ 1, 5, -2, -3, 0, 0 ] ], 1.125 ] - ], - [ - [ [ [ -1, 3, -2, -2, 0, 0 ], [ 1, 3, -2, -3, 0, 0 ], [ 1, 4, -2, -3, 0, 0 ], [ 3, 3, -2, -3, 0, -1 ] ], 0.75 ], - [ [ [ -1, 3, -2, -2, 0, 0 ], [ 1, 3, -2, -3, 0, 0 ], [ 2, 3, -3, -3, 0, 0 ], [ 3, 3, -2, -3, 0, -1 ] ], 0.5 ], - [ [ [ 0, 3, -2, -3, 0, 0 ], [ 1, 3, -2, -3, 0, 0 ], [ 2, 3, -3, -3, 0, 0 ], [ 3, 3, -2, -3, 0, -1 ] ], 1.25 ] - ], - [ - [ [ [ 0, 3, -2, -3, 0, 0 ], [ 1, 3, -2, -3, 0, 0 ], [ 2, 2, -2, -3, 0, 0 ], [ 3, 3, -2, -3, 0, -1 ] ], 1.5 ] - ], - [ - [ [ [ 0, 3, -2, -3, 0, 0 ], [ 1, 3, -2, -3, 0, 0 ], [ 1, 4, -2, -3, 0, -1 ], [ 3, 3, -2, -3, 0, -1 ] ], 1 ], - [ [ [ 0, 3, -2, -2, 0, -1 ], [ 1, 3, -2, -3, 0, 0 ], [ 1, 4, -2, -3, 0, -1 ], [ 3, 3, -2, -3, 0, -1 ] ], 1.375 ], - [ [ [ 0, 3, -2, -2, 0, -1 ], [ 1, 3, -2, -2, 0, -1 ], [ 1, 4, -2, -3, 0, -1 ], [ 3, 3, -2, -3, 0, -1 ] ], 0.875 ] - ], - [ - [ [ [ 0, 3, -2, -2, 0, -1 ], [ 2, 3, -2, -3, 0, -1 ], [ 1, 4, -2, -3, 0, -1 ], [ 3, 3, -2, -3, 0, -1 ] ], 0.75 ], - [ [ [ 1, 3, -2, -3, 0, -1 ], [ 2, 3, -2, -3, 0, -1 ], [ 1, 4, -2, -3, 0, -1 ], [ 3, 3, -2, -3, 0, -1 ] ], 0.375 ] - ], - [ - [ [ [ 1, 3, -2, -3, 0, -1 ], [ 2, 3, -2, -3, 0, -1 ], [ 2, 3, -3, -3, 0, -1 ], [ 3, 3, -2, -3, 0, -1 ] ], 1.75 ], - [ [ [ 1, 3, -2, -3, 0, -1 ], [ 2, 3, -2, -3, 0, -1 ], [ 2, 3, -3, -3, 0, -1 ], [ 3, 3, -3, -3, 0, -1 ] ], 1.25 ] - ], - [ - [ [ [ 1, 3, -2, -3, 0, -1 ], [ 2, 3, -2, -3, 0, -1 ], [ 3, 3, -3, -4, 0, -1 ], [ 3, 3, -3, -3, 0, -1 ] ], 1.75 ], - [ [ [ 1, 3, -2, -3, 0, -1 ], [ 1, 3, -3, -3, 0, 0 ], [ 3, 3, -3, -4, 0, -1 ], [ 3, 3, -3, -3, 0, -1 ] ], 0.5 ], - [ [ [ 2, 2, -3, -3, 0, -1 ], [ 1, 3, -3, -3, 0, 0 ], [ 3, 3, -3, -4, 0, -1 ], [ 3, 3, -3, -3, 0, -1 ] ], 1.625 ] - ], - [ - [ [ [ 2, 2, -3, -3, 0, -1 ], [ 3, 1, -3, -3, 0, -1 ], [ 3, 3, -3, -4, 0, -1 ], [ 3, 3, -3, -3, 0, -1 ] ], 0.875 ] - ], - [ - [ [ [ 2, 2, -3, -3, 0, -1 ], [ 3, 1, -3, -3, 0, -1 ], [ 3, 3, -3, -4, 0, -1 ], [ 4, 2, -4, -3, 0, -1 ] ], 1.125 ] - ], - [ - [ [ [ 2, 2, -3, -3, 0, -1 ], [ 3, 1, -3, -3, 0, -1 ], [ 3, 3, -3, -4, 0, -1 ], [ 4, 3, -3, -4, 0, -1 ] ], 1.625 ], - [ [ [ 3, 2, -3, -4, 0, -1 ], [ 3, 1, -3, -3, 0, -1 ], [ 3, 3, -3, -4, 0, -1 ], [ 4, 3, -3, -4, 0, -1 ] ], 1.375 ] - ], - [ - [ [ [ 2, 4, -3, -4, 0, -1 ], [ 3, 1, -3, -3, 0, -1 ], [ 3, 3, -3, -4, 0, -1 ], [ 4, 3, -3, -4, 0, -1 ] ], 0.75 ] - ], - [ - [ [ [ 2, 4, -3, -4, 0, -1 ], [ 1, 5, -3, -4, 0, -1 ], [ 3, 3, -3, -4, 0, -1 ], [ 4, 3, -3, -4, 0, -1 ] ], 1.5 ], - [ [ [ 2, 4, -3, -4, 0, -1 ], [ 1, 5, -3, -4, 0, -1 ], [ 3, 3, -3, -4, 0, -1 ], [ 4, 4, -3, -4, -1, -1 ] ], 0.875 ], - [ [ [ 2, 4, -3, -4, 0, -1 ], [ 1, 5, -3, -4, 0, -1 ], [ 3, 4, -3, -4, -1, -1 ], [ 4, 4, -3, -4, -1, -1 ] ], 1.625 ] - ], - [ - [ [ [ 2, 4, -3, -4, 0, -1 ], [ 1, 5, -3, -4, 0, -1 ], [ 3, 4, -4, -4, 0, -1 ], [ 4, 4, -3, -4, -1, -1 ] ], 0.5 ], - [ [ [ 2, 4, -3, -4, 0, -1 ], [ 2, 4, -4, -4, 0, -1 ], [ 3, 4, -4, -4, 0, -1 ], [ 4, 4, -3, -4, -1, -1 ] ], 1.375 ] - ], - [ - [ [ [ 2, 4, -3, -4, 0, -1 ], [ 2, 4, -4, -4, 0, -1 ], [ 3, 4, -4, -4, 0, -1 ], [ 3, 4, -2, -4, 0, -1 ] ], 1.75 ], - [ [ [ 2, 4, -3, -4, 0, -1 ], [ 1, 4, -3, -3, 0, -1 ], [ 3, 4, -4, -4, 0, -1 ], [ 3, 4, -2, -4, 0, -1 ] ], 0.625 ], - [ [ [ 2, 4, -3, -4, 0, -1 ], [ 1, 4, -3, -3, 0, -1 ], [ 2, 4, -3, -3, 0, -1 ], [ 3, 4, -2, -4, 0, -1 ] ], 1.75 ] - ], - [ - [ [ [ 2, 4, -3, -4, 0, -1 ], [ 1, 4, -3, -3, 0, -1 ], [ 2, 4, -3, -3, 0, -1 ], [ 2, 5, -3, -3, 0, -1 ] ], 0.75 ], - [ [ [ 2, 4, -3, -4, 0, -1 ], [ 1, 4, -3, -3, 0, -1 ], [ 3, 4, -3, -4, 0, -1 ], [ 2, 5, -3, -3, 0, -1 ] ], 0.5 ] - ], - [ - [ [ [ 2, 3, -3, -3, 0, -1 ], [ 1, 4, -3, -3, 0, -1 ], [ 3, 4, -3, -4, 0, -1 ], [ 2, 5, -3, -3, 0, -1 ] ], 0.75 ], - [ [ [ 2, 3, -3, -3, 0, -1 ], [ 1, 4, -3, -3, 0, -1 ], [ 2, 4, -2, -3, 0, -1 ], [ 2, 5, -3, -3, 0, -1 ] ], 1.75 ] - ], - [ - [ [ [ 2, 3, -3, -3, 0, -1 ], [ 1, 4, -3, -3, 0, -1 ], [ 3, 3, -3, -3, 0, -1 ], [ 2, 5, -3, -3, 0, -1 ] ], 1 ], - [ [ [ 2, 3, -3, -3, 0, -1 ], [ 2, 3, -4, -3, 0, -1 ], [ 3, 3, -3, -3, 0, -1 ], [ 2, 5, -3, -3, 0, -1 ] ], 1.125 ] - ], - [ - [ [ [ 2, 3, -3, -3, 0, -1 ], [ 2, 3, -4, -3, 0, -1 ], [ 3, 3, -3, -3, 0, -1 ], [ 3, 3, -2, -3, 0, -1 ] ], 1.5 ], - [ [ [ 2, 3, -3, -3, 0, -1 ], [ 2, 2, -3, -3, 0, -1 ], [ 3, 3, -3, -3, 0, -1 ], [ 3, 3, -2, -3, 0, -1 ] ], 1.625 ], - [ [ [ 3, 3, -3, -4, 0, -1 ], [ 2, 2, -3, -3, 0, -1 ], [ 3, 3, -3, -3, 0, -1 ], [ 3, 3, -2, -3, 0, -1 ] ], 0.5 ] - ], - [ - [ [ [ 3, 3, -3, -4, 0, -1 ], [ 3, 2, -3, -4, 0, -1 ], [ 3, 3, -3, -3, 0, -1 ], [ 3, 3, -2, -3, 0, -1 ] ], 0.75 ] - ], - [ - [ [ [ 2, 3, -2, -3, 0, -1 ], [ 3, 2, -3, -4, 0, -1 ], [ 3, 3, -3, -3, 0, -1 ], [ 3, 3, -2, -3, 0, -1 ] ], 0.875 ], - [ [ [ 2, 3, -2, -3, 0, -1 ], [ 3, 2, -3, -4, 0, -1 ], [ 3, 3, -3, -3, 0, -1 ], [ 2, 3, -3, -3, 0, -1 ] ], 1.125 ] - ], - [ - [ [ [ 2, 3, -2, -3, 0, -1 ], [ 2, 3, -4, -3, 0, -1 ], [ 3, 3, -3, -3, 0, -1 ], [ 2, 3, -3, -3, 0, -1 ] ], 0.875 ], - [ [ [ 3, 2, -3, -3, 0, -1 ], [ 2, 3, -4, -3, 0, -1 ], [ 3, 3, -3, -3, 0, -1 ], [ 2, 3, -3, -3, 0, -1 ] ], 0.875 ] - ], - [ - [ [ [ 3, 2, -3, -3, 0, -1 ], [ 2, 3, -4, -3, 0, -1 ], [ 3, 3, -3, -3, 0, -1 ], [ 3, 3, -3, -4, 0, -1 ] ], 1.25 ], - [ [ [ 3, 2, -3, -3, 0, -1 ], [ 1, 3, -3, -2, 0, -1 ], [ 3, 3, -3, -3, 0, -1 ], [ 3, 3, -3, -4, 0, -1 ] ], 1.25 ], - [ [ [ 2, 4, -3, -3, 0, -1 ], [ 1, 3, -3, -2, 0, -1 ], [ 3, 3, -3, -3, 0, -1 ], [ 3, 3, -3, -4, 0, -1 ] ], 1.125 ] - ], - [ - [ [ [ 2, 4, -3, -3, 0, -1 ], [ 1, 3, -3, -2, 0, -1 ], [ 3, 3, -3, -3, 0, -1 ], [ 1, 4, -3, -2, 0, -1 ] ], 0.625 ] - ], - [ - [ [ [ 2, 3, -3, -2, 0, -1 ], [ 1, 3, -3, -2, 0, -1 ], [ 3, 3, -3, -3, 0, -1 ], [ 1, 4, -3, -2, 0, -1 ] ], 1.25 ], - [ [ [ 2, 3, -3, -2, 0, -1 ], [ 1, 3, -3, -2, 0, -1 ], [ 2, 3, -2, -2, 0, -1 ], [ 1, 4, -3, -2, 0, -1 ] ], 1.375 ] - ], - [ - [ [ [ 1, 3, -2, -2, 0, -1 ], [ 1, 3, -3, -2, 0, -1 ], [ 2, 3, -2, -2, 0, -1 ], [ 1, 4, -3, -2, 0, -1 ] ], 0.875 ] - ], - [ - [ [ [ 1, 3, -2, -2, 0, -1 ], [ 1, 3, -3, -2, 0, -1 ], [ 2, 3, -2, -2, 0, -1 ], [ 2, 2, -2, -2, 0, -1 ] ], 1.5 ] - ], - [ - [ [ [ 1, 3, -2, -2, 0, -1 ], [ 2, 1, -2, -2, 0, -1 ], [ 2, 3, -2, -2, 0, -1 ], [ 2, 2, -2, -2, 0, -1 ] ], 0.5 ] - ], - [ - [ [ [ 1, 3, -2, -2, 0, -1 ], [ 2, 1, -2, -2, 0, -1 ], [ 3, 1, -2, -2, 0, -1 ], [ 2, 2, -2, -2, 0, -1 ] ], 1.625 ], - [ [ [ 2, 0, -2, -2, 0, -1 ], [ 2, 1, -2, -2, 0, -1 ], [ 3, 1, -2, -2, 0, -1 ], [ 2, 2, -2, -2, 0, -1 ] ], 1.5 ], - [ [ [ 2, 0, -2, -2, 0, -1 ], [ 2, 1, -2, -2, 0, -1 ], [ 3, 1, -2, -2, 0, -1 ], [ 3, 1, -3, -2, 0, -1 ] ], 0.75 ] - ], - [ - [ [ [ 2, 0, -2, -2, 0, -1 ], [ 3, 0, -3, -2, 0, -1 ], [ 3, 1, -2, -2, 0, -1 ], [ 3, 1, -3, -2, 0, -1 ] ], 1.5 ] - ], - [ - [ [ [ 2, 0, -2, -2, 0, -1 ], [ 3, 0, -3, -2, 0, -1 ], [ 4, 0, -3, -2, 0, -1 ], [ 3, 1, -3, -2, 0, -1 ] ], 1 ], - [ [ [ 2, 0, -3, -2, 0, -1 ], [ 3, 0, -3, -2, 0, -1 ], [ 4, 0, -3, -2, 0, -1 ], [ 3, 1, -3, -2, 0, -1 ] ], 1.25 ], - [ [ [ 2, 0, -3, -2, 0, -1 ], [ 3, 0, -3, -2, 0, -1 ], [ 4, 0, -3, -2, 0, -1 ], [ 4, 0, -4, -2, 0, -1 ] ], 1.25 ] - ], - [ - [ [ [ 2, 0, -3, -2, 0, -1 ], [ 2, 0, -4, -2, 0, 0 ], [ 4, 0, -3, -2, 0, -1 ], [ 4, 0, -4, -2, 0, -1 ] ], 0.5 ], - [ [ [ 3, -1, -4, -2, 0, -1 ], [ 2, 0, -4, -2, 0, 0 ], [ 4, 0, -3, -2, 0, -1 ], [ 4, 0, -4, -2, 0, -1 ] ], 1.125 ], - [ [ [ 3, -1, -4, -2, 0, -1 ], [ 2, 0, -4, -2, 0, 0 ], [ 5, -1, -4, -2, 0, -1 ], [ 4, 0, -4, -2, 0, -1 ] ], 0.5 ] - ], - [ - [ [ [ 3, -1, -4, -2, 0, -1 ], [ 2, 0, -4, -2, 0, 0 ], [ 5, -1, -4, -2, 0, -1 ], [ 4, -1, -4, -2, 0, 0 ] ], 1.75 ] - ], - [ - [ [ [ 2, 0, -4, -2, 0, -1 ], [ 2, 0, -4, -2, 0, 0 ], [ 5, -1, -4, -2, 0, -1 ], [ 4, -1, -4, -2, 0, 0 ] ], 0.5 ], - [ [ [ 2, 0, -4, -2, 0, -1 ], [ 2, 0, -4, -2, 0, 0 ], [ 5, -1, -4, -2, 0, -1 ], [ 3, 1, -4, -2, 0, 0 ] ], 1.125 ], - [ [ [ 2, 0, -4, -2, 0, -1 ], [ 2, 0, -4, -2, 0, 0 ], [ 3, 0, -4, -1, 0, 0 ], [ 3, 1, -4, -2, 0, 0 ] ], 0.5 ] - ], - [ - [ [ [ 2, -1, -4, -2, 0, 0 ], [ 2, 0, -4, -2, 0, 0 ], [ 3, 0, -4, -1, 0, 0 ], [ 3, 1, -4, -2, 0, 0 ] ], 1.625 ], - [ [ [ 2, -1, -4, -2, 0, 0 ], [ 2, 0, -4, -2, 0, 0 ], [ 4, 1, -4, -2, 0, -1 ], [ 3, 1, -4, -2, 0, 0 ] ], 0.75 ] - ], - [ - [ [ [ 2, -1, -4, -2, 0, 0 ], [ 2, 0, -4, -2, 0, 0 ], [ 4, 0, -5, -2, 0, 0 ], [ 3, 1, -4, -2, 0, 0 ] ], 1.75 ], - [ [ [ 2, -1, -4, -2, 0, 0 ], [ 2, 0, -4, -2, 0, 0 ], [ 4, 0, -5, -2, 0, 0 ], [ 4, -1, -4, -2, 0, -1 ] ], 0.5 ] - ], - [ - [ [ [ 2, -1, -4, -2, 0, 0 ], [ 2, 0, -4, -2, 0, 0 ], [ 4, 0, -5, -2, 0, 0 ], [ 2, 0, -4, -1, 0, 0 ] ], 1.75 ] - ], - [ - [ [ [ 1, 1, -4, -2, 0, 0 ], [ 2, 0, -4, -2, 0, 0 ], [ 4, 0, -5, -2, 0, 0 ], [ 2, 0, -4, -1, 0, 0 ] ], 0.875 ], - [ [ [ 1, 1, -4, -2, 0, 0 ], [ 2, 0, -4, -2, 0, 0 ], [ 3, 0, -4, -1, 0, 0 ], [ 2, 0, -4, -1, 0, 0 ] ], 0.875 ] - ], - [ - [ [ [ 1, 1, -4, -2, 0, 0 ], [ 2, 0, -4, -2, 0, 0 ], [ 4, 1, -4, -2, 0, -1 ], [ 2, 0, -4, -1, 0, 0 ] ], 1.625 ] - ], - [ - [ [ [ 1, 1, -4, -2, 0, 0 ], [ 1, 2, -4, -2, 0, 0 ], [ 4, 1, -4, -2, 0, -1 ], [ 2, 0, -4, -1, 0, 0 ] ], 0.5 ], - [ [ [ 1, 1, -4, -2, 0, 0 ], [ 1, 2, -4, -2, 0, 0 ], [ 3, 1, -4, -2, 0, 0 ], [ 2, 0, -4, -1, 0, 0 ] ], 0.875 ], - [ [ [ 1, 1, -4, -2, 0, 0 ], [ 1, 2, -4, -2, 0, 0 ], [ 3, 1, -4, -2, 0, 0 ], [ 2, 1, -4, -2, 0, 0 ] ], 1.125 ] - ], - [ - [ [ [ 0, 2, -4, -2, 0, 0 ], [ 1, 2, -4, -2, 0, 0 ], [ 3, 1, -4, -2, 0, 0 ], [ 2, 1, -4, -2, 0, 0 ] ], 1.625 ] - ], - [ - [ [ [ 0, 2, -4, -2, 0, 0 ], [ 1, 2, -4, -2, 0, 0 ], [ 3, 1, -4, -2, 0, 0 ], [ 1, 3, -4, -2, 0, 0 ] ], 0.75 ] - ], - [ - [ [ [ 1, 2, -4, -3, 0, 0 ], [ 1, 2, -4, -2, 0, 0 ], [ 3, 1, -4, -2, 0, 0 ], [ 1, 3, -4, -2, 0, 0 ] ], 0.875 ] - ], - [ - [ [ [ 1, 2, -4, -3, 0, 0 ], [ 1, 2, -4, -2, 0, 0 ], [ 3, 1, -4, -2, 0, 0 ], [ 3, 1, -4, -2, 0, -1 ] ], 1.5 ], - [ [ [ 1, 2, -4, -3, 0, 0 ], [ 2, 2, -4, -3, 0, 0 ], [ 3, 1, -4, -2, 0, 0 ], [ 3, 1, -4, -2, 0, -1 ] ], 1.5 ] - ], - [ - [ [ [ 1, 2, -4, -3, 0, 0 ], [ 2, 2, -4, -3, 0, 0 ], [ 3, 1, -4, -2, 0, 0 ], [ 3, 0, -4, -2, 0, 0 ] ], 0.5 ], - [ [ [ 1, 1, -4, -2, 0, 0 ], [ 2, 2, -4, -3, 0, 0 ], [ 3, 1, -4, -2, 0, 0 ], [ 3, 0, -4, -2, 0, 0 ] ], 0.5 ], - [ [ [ 1, 1, -4, -2, 0, 0 ], [ 2, 1, -4, -2, 0, 0 ], [ 3, 1, -4, -2, 0, 0 ], [ 3, 0, -4, -2, 0, 0 ] ], 0.5 ] - ], - [ - [ [ [ 1, 1, -4, -2, 0, 0 ], [ 2, 1, -4, -2, 0, 0 ], [ 4, 0, -5, -2, 0, 0 ], [ 3, 0, -4, -2, 0, 0 ] ], 1.375 ], - [ [ [ 2, 0, -5, -2, 0, 0 ], [ 2, 1, -4, -2, 0, 0 ], [ 4, 0, -5, -2, 0, 0 ], [ 3, 0, -4, -2, 0, 0 ] ], 0.875 ], - [ [ [ 2, 0, -5, -2, 0, 0 ], [ 3, 0, -5, -2, 0, 0 ], [ 4, 0, -5, -2, 0, 0 ], [ 3, 0, -4, -2, 0, 0 ] ], 0.625 ] - ], - [ - [ [ [ 1, 0, -4, -2, 0, 0 ], [ 3, 0, -5, -2, 0, 0 ], [ 4, 0, -5, -2, 0, 0 ], [ 3, 0, -4, -2, 0, 0 ] ], 0.625 ], - [ [ [ 1, 0, -4, -2, 0, 0 ], [ 2, 0, -4, -2, 0, 0 ], [ 4, 0, -5, -2, 0, 0 ], [ 3, 0, -4, -2, 0, 0 ] ], 1.375 ], - [ [ [ 1, 0, -4, -2, 0, 0 ], [ 2, 0, -4, -2, 0, 0 ], [ 3, 1, -4, -2, 0, 0 ], [ 3, 0, -4, -2, 0, 0 ] ], 1.125 ] - ], - [ - [ [ [ 1, 0, -4, -2, 0, 0 ], [ 2, 0, -4, -2, 0, 0 ], [ 2, 1, -4, -2, 0, 0 ], [ 3, 0, -4, -2, 0, 0 ] ], 1.625 ], - [ [ [ 1, 0, -4, -2, 0, 0 ], [ 2, 0, -4, -2, 0, 0 ], [ 2, 1, -4, -2, 0, 0 ], [ 4, 0, -4, -3, 0, 0 ] ], 1.25 ] - ], - [ - [ [ [ 1, 0, -4, -2, 0, 0 ], [ 2, 0, -4, -2, 0, 0 ], [ 3, 0, -5, -2, 0, 0 ], [ 4, 0, -4, -3, 0, 0 ] ], 0.75 ], - [ [ [ 1, 0, -4, -2, 0, 0 ], [ 2, 0, -4, -2, 0, 0 ], [ 3, 0, -5, -2, 0, 0 ], [ 2, 1, -4, -2, 0, 0 ] ], 1.375 ] - ], - [ - [ [ [ 1, 0, -4, -2, 0, 0 ], [ 2, 0, -5, -2, 1, 0 ], [ 3, 0, -5, -2, 0, 0 ], [ 2, 1, -4, -2, 0, 0 ] ], 1.625 ], - [ [ [ 1, 0, -4, -2, 0, 0 ], [ 2, 0, -5, -2, 1, 0 ], [ 3, 0, -5, -2, 0, 0 ], [ 2, 0, -4, -1, 0, 0 ] ], 0.75 ] - ], - [ - [ [ [ 1, 0, -5, -2, 1, 0 ], [ 2, 0, -5, -2, 1, 0 ], [ 3, 0, -5, -2, 0, 0 ], [ 2, 0, -4, -1, 0, 0 ] ], 1.375 ], - [ [ [ 1, 0, -5, -2, 1, 0 ], [ 3, 0, -5, -2, -1, 0 ], [ 3, 0, -5, -2, 0, 0 ], [ 2, 0, -4, -1, 0, 0 ] ], 1.75 ], - [ [ [ 1, 0, -5, -2, 1, 0 ], [ 3, 0, -5, -2, -1, 0 ], [ 3, 0, -5, -2, 0, 0 ], [ 4, 0, -5, -2, 0, -1 ] ], 1.25 ] - ], - [ - [ [ [ 1, 0, -5, -2, 1, 0 ], [ 3, 0, -5, -2, -1, 0 ], [ 3, 0, -6, -2, 1, 0 ], [ 4, 0, -5, -2, 0, -1 ] ], 1.375 ], - [ [ [ 1, 0, -5, -2, 1, 0 ], [ 3, 0, -5, -2, -1, 0 ], [ 3, 0, -6, -2, 1, 0 ], [ "Rest" ] ], 0.625 ], - [ [ [ 1, 0, -5, -2, 1, 0 ], [ 3, 0, -5, -2, -1, 0 ], [ "Rest" ], [ "Rest" ] ], 0.875 ], - [ [ [ 1, 0, -5, -2, 1, 0 ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 1.375 ], - [ [ [ "Rest" ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 6.75 ] - ] - ] -], -"last_changes": -[ - [ [ 1, 0, -4, -2, 0, 0 ], [ 2, 0, -5, -2, 1, 0 ], [ 3, 0, -5, -2, 0, 0 ], [ 2, 0, -4, -1, 0, 0 ] ], - [ [ 1, 0, -5, -2, 1, 0 ], [ 2, 0, -5, -2, 1, 0 ], [ 3, 0, -5, -2, 0, 0 ], [ 2, 0, -4, -1, 0, 0 ] ], - [ [ 1, 0, -5, -2, 1, 0 ], [ 3, 0, -5, -2, -1, 0 ], [ 3, 0, -5, -2, 0, 0 ], [ 2, 0, -4, -1, 0, 0 ] ], - [ [ 1, 0, -5, -2, 1, 0 ], [ 3, 0, -5, -2, -1, 0 ], [ 3, 0, -5, -2, 0, 0 ], [ 4, 0, -5, -2, 0, -1 ] ], - [ [ 1, 0, -5, -2, 1, 0 ], [ 3, 0, -5, -2, -1, 0 ], [ 3, 0, -6, -2, 1, 0 ], [ 4, 0, -5, -2, 0, -1 ] ] -], -"cur_uid": "69c568c6", -"ref_uid": "nil", -"order_seed": 712406, -"dur_seed": 506999, -"motifs_seed": 551883, -"entrances_probs_vals": [ 0, 0, 0, 0.41, 1.84, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"passages_probs_vals": [ 0, 0, 0, 0.41, 1.84, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"exits_probs_vals": [ 0, 0, 3.2936507936508, 0.41, 1.84, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"ranges": [ [ -2400, 1200 ], [ -1200, 1200 ], [ -702, 1200 ], [ -702, 1200 ] ], -"step_probs_vals": [ -1200, 1200, 0.0020576131687243, 0.068181818181818, 0.074074074074074, 0.0625, 0.20576131687243, 0.0625, 0.45679012345679, 0.011363636363636, 0.53086419753086, 0, 0.54320987654321, 0.92045454545455, 0.58641975308642, 0.92613636363636, 0.61316872427983, 0, 0.98971193415638, 0 ], -"passages_weights": [ 0.48, 0.46, 0.48, 1, 1 ], -"hd_exp": 9, -"hd_invert": 0, -"order": -[ - [ [ 1, 2, 3 ], [ 0 ], [ ] ], - [ [ 0, 3 ], [ 1, 2 ], [ ] ], - [ [ 0, 2, 1 ], [ 3 ], [ ] ], - [ [ 3, 2, 0 ], [ 1 ], [ ] ], - [ [ 3, 2, 1 ], [ 0 ], [ ] ], - [ [ 0, 2 ], [ 1, 3 ], [ ] ], - [ [ 1 ], [ 0, 2, 3 ], [ ] ], - [ [ 1, 3 ], [ 2, 0 ], [ ] ], - [ [ 3 ], [ 1, 0, 2 ], [ ] ], - [ [ 3, 1 ], [ 2, 0 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 0, 3 ], [ 2, 1 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 3, 0 ], [ 1, 2 ], [ ] ], - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 3, 2, 0 ], [ 1 ], [ ] ], - [ [ 0, 1 ], [ 2, 3 ], [ ] ], - [ [ 3, 0 ], [ 1, 2 ], [ ] ], - [ [ 0, 3 ], [ 1, 2 ], [ ] ], - [ [ 0 ], [ 2, 1, 3 ], [ ] ], - [ [ 0, 1 ], [ 2, 3 ], [ ] ], - [ [ 2 ], [ 3, 1, 0 ], [ ] ], - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 0 ], [ 2, 1, 3 ], [ ] ], - [ [ 3 ], [ 0, 1, 2 ], [ ] ], - [ [ 0, 1 ], [ 2, 3 ], [ ] ], - [ [ 2, 1 ], [ 3, 0 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 1, 3 ], [ 2, 0 ], [ ] ], - [ [ 1 ], [ 0, 3, 2 ], [ ] ], - [ [ 3, 1 ], [ 2, 0 ], [ ] ], - [ [ 2, 3 ], [ 1, 0 ], [ ] ], - [ [ 3, 2 ], [ 1, 0 ], [ ] ], - [ [ 2, 3 ], [ 1, 0 ], [ ] ], - [ [ 3 ], [ 0, 2, 1 ], [ ] ], - [ [ 2, 3 ], [ 1, 0 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 3, 1 ], [ 2, 0 ], [ ] ], - [ [ 2, 0, 1 ], [ 3 ], [ ] ], - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 2, 1, 3 ], [ 0 ], [ ] ], - [ [ 1, 2 ], [ 3, 0 ], [ ] ], - [ [ 2 ], [ 1, 0, 3 ], [ ] ], - [ [ 2, 0 ], [ 1, 3 ], [ ] ], - [ [ 2, 3 ], [ 0, 1 ], [ ] ], - [ [ 0, 1 ], [ 2, 3 ], [ ] ], - [ [ 3 ], [ 0, 1, 2 ], [ ] ], - [ [ 2, 0, 1 ], [ 3 ], [ ] ], - [ [ 1 ], [ 3, 2, 0 ], [ ] ], - [ [ 3, 0, 1 ], [ 2 ], [ ] ], - [ [ 3 ], [ 2, 0, 1 ], [ ] ], - [ [ 3, 2 ], [ 1, 0 ], [ ] ], - [ [ 0, 1 ], [ 2, 3 ], [ ] ], - [ [ 3 ], [ 2, 1, 0 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 1, 2 ], [ 3, 0 ], [ ] ], - [ [ 3, 2, 1 ], [ 0 ], [ ] ], - [ [ 0 ], [ 1, 3, 2 ], [ ] ], - [ [ 3, 0 ], [ 2, 1 ], [ ] ], - [ [ 0 ], [ 3, 1, 2 ], [ ] ], - [ [ 1, 0 ], [ 3, 2 ], [ ] ], - [ [ 1, 3 ], [ 0, 2 ], [ ] ], - [ [ 3, 0 ], [ 2, 1 ], [ ] ], - [ [ 2 ], [ 3, 1, 0 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 1, 2 ], [ 0, 3 ], [ ] ], - [ [ 3, 2 ], [ 1, 0 ], [ ] ], - [ [ 2 ], [ 3, 1, 0 ], [ ] ], - [ [ 0, 2, 1 ], [ 3 ], [ ] ], - [ [ 3, 1 ], [ 0, 2 ], [ ] ], - [ [ 1, 2, 3 ], [ 0 ], [ ] ], - [ [ 2, 0, 1 ], [ 3 ], [ ] ], - [ [ 2, 0, 3 ], [ 1 ], [ ] ], - [ [ 1 ], [ 2, 0, 3 ], [ ] ], - [ [ 2, 3, 0 ], [ 1 ], [ ] ], - [ [ 1 ], [ 2, 0, 3 ], [ ] ], - [ [ 3 ], [ 1, 0, 2 ], [ ] ], - [ [ 0, 2, 1 ], [ 3 ], [ ] ], - [ [ 1 ], [ 0, 3, 2 ], [ ] ], - [ [ 3, 1 ], [ 0, 2 ], [ ] ], - [ [ 1, 0 ], [ 2, 3 ], [ ] ], - [ [ 0, 1, 2 ], [ 3 ], [ ] ], - [ [ 3, 1 ], [ 0, 2 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 0 ], [ 1, 2, 3 ], [ ] ], - [ [ 1, 3, 2 ], [ 0 ], [ ] ], - [ [ 2, 1, 0 ], [ 3 ], [ ] ], - [ [ 3, 2, 1 ], [ 0 ], [ ] ], - [ [ 2, 0 ], [ 3, 1 ], [ ] ], - [ [ 2 ], [ 3, 0, 1 ], [ ] ], - [ [ 3 ], [ 2, 0, 1 ], [ ] ], - [ [ 3 ], [ 0, 1, 2 ], [ ] ], - [ [ 0, 1 ], [ 2, 3 ], [ ] ], - [ [ 1, 0 ], [ 2, 3 ], [ ] ], - [ [ 0, 2 ], [ 1, 3 ], [ ] ], - [ [ 2 ], [ 0, 1, 3 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ] -], -"sus_weights": [ 0.35, 0.37, 0.38 ], -"order_size": [ 100, 100 ], -"passages_size": [ 0, 0 ], -"motif_edited": "false", -"order_edited": "false" -} \ No newline at end of file diff --git a/resources/string_quartet_3/6a9928d6/6a9928d6_code.scd b/resources/string_quartet_3/6a9928d6/6a9928d6_code.scd deleted file mode 100644 index 49436ca..0000000 --- a/resources/string_quartet_3/6a9928d6/6a9928d6_code.scd +++ /dev/null @@ -1,973 +0,0 @@ -( -// helper funcs -var hsArrayToCents, pDist, hdSum, hsChordalDistance, hsArrayToFreq; - -// score funcs -var isInRange, spacingScore, rangeScore, intervalScore, inclusionScore; - -// subroutines -var genTuples, initVoices, genOrders, genSubMotif, updateVoices, genDurFunc, genStepFunc; - -// primary routines -var genMotif, genSecondarySeq; - -// audition funcs -var genPatterns, genMidiPatterns; - -// resource management funcs -var seedFunc, genUID, writeResources, stringifyToDepth, setSeeds, sanityCheck, -msgInterpret, loadLedgerFile, loadLedgerJSON, loadModelFile, loadModelJSON, -setGlobalVars, globalVarsToDict, saveLedger; - -// model vars -//(model and global vars mostly set by OSC funcs -var seq, lastXChanges, -curUID, refUID, orderSeed, durSeed, motifSeed, -entrancesProbVals, passagesProbVals, exitsProbVals, -ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, -orders, susWeights, orderSize, passagesSize, -motifEdited, orderEdited; - -// model aux vars -var entrancesDurFunc, passagesDurFunc, exitsDurFunc, stepFunc; - -// other global vars -var popSize, exPath, dir, primes, dims, tuples, -group, player, resourceDir, ledgerPath, ledger, currentlyPlayingUID, -nameSpaces; - -// install JSON quark (not used) -/* -if(Quarks.isInstalled("JSONlib").not, { - Quarks.install("https://github.com/musikinformatik/JSONlib.git"); - thisProcess.recompile; - //HelpBrowser.openHelpFor("Classes/JSONlib"); -}); -*/ - - -//------helper funcs - -hsArrayToCents = { - arg hsArray; - hsArray.collect({arg dist, p; dist * 1200 * log2(primes[p][0]/primes[p][1])}).sum -}; - -pDist = { - arg array1, array2, signed = false; - var pDistance; - pDistance = hsArrayToCents.value(array2) - hsArrayToCents.value(array1); - if(signed, {pDistance}, {abs(pDistance)}) -}; - -hdSum = { - arg hsArrays; - var size, distances, mean; - size = hsArrays.size; - distances = (size - 1).collect({arg i; - ((i + 1)..(size - 1)).collect({arg j; - abs(hsArrays[i] - hsArrays[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsChordalDistance = { - arg hsArrays1, hsArrays2; - var size, distances, mean; - size = hsArrays1.size; - distances = hsArrays1.size.collect({arg i; - hsArrays2.size.collect({arg j; - abs(hsArrays1[i] - hsArrays2[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsArrayToFreq = { - arg array; - array.collect({arg dim, d; pow(primes[d][0]/primes[d][1], dim)}).product -}; - -//------score funcs - -/* -isInRange = { - arg hsArray, min, max; - var cents; - cents = hsArrayToCents.value(hsArray); - (cents >= min) && (cents <= max) -}; -*/ - -spacingScore = { - arg hsArrays, min; - var centsArray; - centsArray = hsArrays.collect({arg hsArray; hsArrayToCents.value(hsArray)}).sort({arg a, b; a < b}); - centsArray.differentiate.drop(1).collect({arg pDistance; if(pDistance >= min, {1}, {0.01})}).sum; -}; - -rangeScore = { - arg hsArray1, hsArray2, min, max, low, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - if((pDistance >= min) && (pDistance <= max), {1}, {low}); -}; - -/* -intervalScore = { - arg hsArray1, hsArray2, mean, sd, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - //pDistance.gaussCurve(1, mean, sd) - stepFunc.value(pDistance) -}; -*/ - -intervalScore = { - arg hsArray1, hsArray2, mean, sd, signed = true; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - //pDistance.gaussCurve(1, mean, sd) - //if(pDistance >= 0, {stepFunc.value(abs(pDistance))}, {0.01}); - stepFunc.value(pDistance) -}; - -inclusionScore = { - arg array, test, min = 0.01; - if(array.collect({arg v; v.hash}).includes(test.hash), {min}, {1}); -}; - - -//------subroutines - -genTuples = { - var tuples; - tuples = dims.collect({[-1, 0, 1]}).allTuples.select({arg tuple; (abs(tuple.drop(1)).sum <= 1) && (tuple[0] == 0)}); - //tuples = dims.collect({[0, 1]}).allTuples.select({arg tuple; (abs(tuple.drop(1)).sum <= 1) && (tuple[0] == 0)}); - tuples = tuples ++ tuples.collect({arg tuple; [-3, -2, -1, 1, 2, 3].collect({arg octTrans; tuple.deepCopy.put(0, octTrans)})}).flatten; -}; - -initVoices = { - var init, voicesInit; - voicesInit = popSize.collect({dims.collect({0})}); - /* - voicesInit = [dims.collect({0})]; - (popSize - 1).do({ - arg rep, new; - rep = dims.rand; - new = voicesInit.last.deepCopy; - new[rep] = new[rep] + [-1, 1].choose(); - voicesInit = voicesInit.add(new); - }); - */ - voicesInit.deepCopy; -}; - -genDurFunc = {arg chordProb, minPad, maxPad, minDur, maxDur, envData, seed; - var env, pTable, durFunc; - env = Env.pairs([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).asSignal(256).asList.asArray; - pTable = env.asRandomTable; - [chordProb, minPad, maxPad, minDur, maxDur, envData].postln; - durFunc = {arg allowChord, pad = false; - var res; - res = if(allowChord.not, { - pTable.tableRand * (maxDur - minDur) + minDur - }, { - if(1.0.rand < chordProb, {0}, {pTable.tableRand * (maxDur - minDur) + minDur}); - }).round(0.125); - if(pad, {res = res + rrand(minPad.asFloat, maxPad.asFloat).round(0.125)}); - if(res.asInteger == res, {res = res.asInteger}); - res - }; - seedFunc.value(durFunc, seed); -}; - -genStepFunc = {arg minStep, maxStep, envData, seed; - var envDataNorm, env, pTable, stepFunc; - [minStep, maxStep, envData].postln; - envDataNorm = ([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).flop; - envDataNorm = [envDataNorm[0].normalize(minStep, maxStep), envDataNorm[1]].flop; - env = Env.pairs(envDataNorm); - stepFunc = {arg pDist; - env.at(pDist).clip(0.001, 1); - }; - seedFunc.value(stepFunc, seed); -}; - -genOrders = {arg minMotifLength = 1, maxMotifLength = 5, minProgLength = 0, maxProgLength = 5; - ((maxMotifLength.asInteger - minMotifLength.asInteger).rand + minMotifLength.asInteger).collect({ - var noProgIns, noSusIns, noSilentIns, prog, sus, silent, order; - noSusIns = [1, 2, 3].wchoose(susWeights.normalizeSum); - //noProgIns = (popSize - noSusIns).rand + 1; - noProgIns = (popSize - noSusIns); - noSilentIns = popSize - noSusIns - noProgIns; - - # prog, sus, silent = (0..(popSize-1)).scramble.clumps([noProgIns, noSusIns, noSilentIns]); - - prog = (prog.scramble ++ ((maxProgLength.asInteger - minProgLength.asInteger).rand + minProgLength.asInteger).collect({prog.choose}).scramble); - if(silent == nil, {silent = []}); - [sus.scramble, prog, silent.scramble] - }); -}; - -updateVoices = {arg ins, sus; - var voices, candidates, nWeights, nProbs, sel; - - voices = lastXChanges.deepCopy.last; - - candidates = sus.collect({arg v; tuples.collect({arg t; voices[v] + t})}).flatten; - candidates = difference(candidates.asSet, voices.asSet).asList; - nProbs = candidates.collect({arg candidate; - var stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore; - - //stepScore = intervalScore.value(voices[ins], candidate, 30, 400, 0.1); - stepScore = intervalScore.value(voices[ins], candidate, 100, 100); - recentlySoundedScore = inclusionScore.value(lastXChanges.flop[ins], candidate, 0.01); - - - - if(rangeScore.value(candidate.collect({0}), voices[ins], ranges[ins][1] - 500, ranges[ins][1], 0, true) == 1, { - isInRangeScore = 1 - rangeScore.value(candidate.collect({0}), candidate, ranges[ins][0] + 500, ranges[ins][1] - 500, 0, true); - isInRangeScore = isInRangeScore * rangeScore.value(candidate.collect({0}), candidate, ranges[ins][0], ranges[ins][1], 0, true) - }, { - isInRangeScore = rangeScore.value(candidate.collect({0}), candidate, ranges[ins][0], ranges[ins][1], 0, true); - }); - - - //isInRangeScore = rangeScore.value(candidate.collect({0}), candidate, ranges[ins][0], ranges[ins][1], 0, true); - //old way - worked but actually by accident (I think) - //isInRangeScore = rangeScore.value(candidate, candidate.collect({0}), ranges[ins][0], ranges[ins][1], 0, true); - - - regScore = spacingScore.value(voices.deepCopy.put(ins, candidate), 300); - hdScore = pow(hdSum.value(voices.deepCopy.put(ins, candidate)), hdExp); - if(hdInvert == 0, {hdScore = 1/hdScore}); - //maybe what you want here is a vector to another root and then favoring movement towards it. - //distScore = pow(hsChordalDistance.value(voices, voices.put(ins, candidate)), 2); - - [stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore] - }); - - nWeights = passagesWeights; - - //this handles nWeights of 0; mainly for testing - nProbs = nProbs.flop.select({arg scores, s; nWeights[s] != 0}).flop; - nWeights = nWeights.select({arg weight; weight != 0}); - nProbs = nProbs.flop.collect({arg scores, s; - if(scores.sum == 0, {scores}, {scores.normalizeSum * nWeights[s]}) - }); - nProbs = nProbs.flop.collect({arg scores, s; scores.product}).normalizeSum; - - sel = candidates.wchoose(nProbs); - - voices[ins] = sel; - lastXChanges = lastXChanges.add(voices).keep(-5); -}; - -genSubMotif = {arg order, orderIndex, lastState, repeatLast = false, startFromLast = false, isLastOrder = false; - var sus, prog, silent, flatOrder, res, isInChord, allowChord, pad, lastXChangesHold, voices, adder; - # sus, prog, silent = order; - flatOrder = silent ++ sus ++ prog; - lastXChangesHold = lastXChanges.deepCopy; - voices = lastState.deepCopy; - isInChord = popSize.collect({false}); - allowChord = false; - pad = false; - res = []; - "------generating motif".postln; - //need to figure out here if voices move between motifs - flatOrder.do({arg ins, i; - - if(prog.includes(ins) && repeatLast.not, {updateVoices.value(ins, sus)}); - adder = if(silent.includes(ins), {["Rest"]}, {lastXChanges.last.deepCopy[ins]}); - - if(voices[ins] != adder, { - var dur; - - if((sus ++ silent).includes(ins), { - allowChord = (ins != sus.last); - pad = (ins == sus.last); - }, { - if(i < (flatOrder.size - 1), { - allowChord = (isInChord[flatOrder[i + 1]] || (ins == flatOrder[i + 1])).not; - pad = false; - }, { - allowChord = false; - pad = true - }); - }); - if((orderIndex == 0) && sus.includes(ins), { - dur = entrancesDurFunc.value(allowChord, pad); - }, { - dur = passagesDurFunc.value(allowChord, pad); - }); - if(dur == 0, {isInChord[ins] = true}, {isInChord = popSize.collect({false})}); - - voices[ins] = adder; - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - - // pad ending - if(orderIndex == (orders.size - 1), { - (0..(popSize-1)).scramble.do({arg ins; - if(res.last.first[ins] != ["Rest"], { - var dur; - voices[ins] = ["Rest"]; - allowChord = (voices != popSize.collect({["Rest"]})); - pad = allowChord.not; - dur = exitsDurFunc.value(allowChord, pad); - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - }); - - //format and return - if(startFromLast, {lastXChanges = lastXChangesHold.deepCopy}); - res; -}; - - -//------primary routines - -genMotif = { - var repeats, fSeq, fDur, durAdd; - - repeats = 1; - fSeq = []; - - repeats.do({arg index; - var motif; - - motif = []; - - orders.do({arg order, o; - var lastState, subMotif; - lastState = if(o == 0, {popSize.collect({["Rest"]})}, {motif.last.last.first}); - subMotif = genSubMotif.value(order, o, lastState, isLastOrder: o == (orders.size - 1)); - motif = motif.add(subMotif); - - }); - - sanityCheck.value(motif, index); - - fSeq = fSeq.add(motif); - }); - - //round last duration to measure - fDur = fSeq.flatten.flatten.slice(nil, 1).sum; - durAdd = fDur.round(4) - fDur; - if(durAdd < 0, {durAdd = 4 - durAdd}); - fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] = fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] + durAdd; - - fSeq -}; - -genSecondarySeq = {arg seq; - var curdles, fSeq; - curdles = []; - while({curdles.sum < seq.size}, {curdles = curdles ++ [3.rand + 1]}); - - fSeq = seq.clumps(curdles).collect({arg clump, m; - var repeats, paddedSeq; - - //add rest - paddedSeq = clump.add([[[popSize.collect({["Rest"]}), 0.5.rand]]]); - - //implement repeats - repeats = [0.rand + 1, 1].wchoose([1, 0].normalizeSum); - repeats.collect({paddedSeq}); - }); - fSeq -}; - - -//------audition funcs - -/* -Event.addEventType(\osc, { - if (~addr.postln.notNil) { - ~addr.sendMsg(~indexPath, ~indexMsg); - ~addr.sendMsg(~seqPath, stringifyToDepth.value(~seqMsg, 3)); - //~addr.sendMsg("/STATE/OPEN", (dir.replace("supercollider", "resources") +/+ ~idMsg +/+ ~idMsg ++ "_gui_state" ++ ".state").standardizePath.postln); - }; -}); -*/ - -Event.addEventType(\osc, { - if (~addr.notNil) { - ~msg; - ~addr.sendMsg(~path, *~msg); - }; -}); - -genPatterns = {arg inSeq, addr, oneShot = false; - var voices, durs, pbinds, res, indices, sectionDurs, msg, ids, seq; - seq = inSeq.collect({arg mSeq; mSeq[0]}); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - pbinds = voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs, attacks, rels, amps; - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - //attacks = 2.collect({rrand(1, 3)}) ++ freqs.drop(2).collect({rrand(0.3, 0.5)}); - attacks = fDurs.collect({arg dur; dur * rrand(0.2, 0.4)}); - //rels = freqs.drop(2).collect({rrand(0.3, 0.5)}) ++ 2.collect({rrand(1, 3)}); - rels = (clumps.size - 1).collect({arg c; - if(clumps[c + 1][0] == ["Rest"], {rrand(1.0, 3.0)}, {rrand(0.3, 0.5)}); - }); - rels = rels.add(rrand(1.0, 3.0)); - amps = freqs.collect({rrand(0.6, 0.99)}); - - [ - Pbind( - \instrument, \string_model, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \attack, Pseq(attacks, 1), - \sustain, Pseq(fDurs, 1), - \release, Pseq(rels, 1), - //\amp, Pseq(amps, 1), - \amp, Pbrown(0.5, 1, 0.5), - \busIndex, v - ), - Pbind( - \instrument, \sine, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \sustain, Pseq(fDurs, 1), - \busIndex, v - ) - ] - }).flatten; - if(oneShot.not, { - msg = inSeq.collect({arg mSeq, m; mSeq[1..]}); - //ids = inSeq.collect({arg mSeq, m; mSeq[2]}); - sectionDurs = seq.collect({arg mSeq; mSeq.flatten2(mSeq.maxDepth - 5).flop[1].sum}); - pbinds = pbinds ++ - [ - Pbind( - \type, \osc, - \addr, addr, - \path, "/playing", - \msg, Pseq(msg, 1), - \dur, Pseq(sectionDurs, 1) - ); - ] - }); - res = Ppar(pbinds); - res -}; - -/* -genMidiPatterns = {arg seq; - var voices, durs, patterns, res, mOut, pbRange; - pbRange = 1; //semitones - change this as needed for your situation - mOut = MIDIOut.newByName("TiMidity", "TiMidity port 0").latency_(Server.default.latency); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - res = Ppar( - voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs; - - mOut.program(v, 70); - - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - - Pbind( - \type, \midi, - \chan, v, - \noteval, Pseq(freqs.cpsmidi - 24, 1), - \note, Pfunc({ | event | event[\noteval].floor }), - \dur, Pseq(fDurs, 1), - \midiout, mOut, - \amp, 1, - \bend, Pfunc({ - | event | - if (event[\note].isRest.not) { - var pitchbendvalue = event[\noteval].frac.linlin(0, pbRange, 8192, 8192*2).asInteger; - m.bend(v, pitchbendvalue); - }; - 0; // return something other than nil to avoid stopping the pattern - }), - ); - }); - ); - res -}; -*/ - - -//------resource management funcs - -genUID = {Date.seed.asHexString.toLower}; - -seedFunc = {arg func, seed; - var funcArgs, next; - next = Routine({loop{func.valueArray(funcArgs).yield }}); - next.randSeed_(seed); - {arg ...args; funcArgs = args; next.value} -}; - -stringifyToDepth = {arg data, maxDepth = 1; - var prettyString = "", rCount = 0, writeArray, indent; - - if(maxDepth == 0, { - data.asCompileString - }, { - indent = {arg size; size.collect({" "}).join("")}; - writeArray = {arg array; - prettyString = prettyString ++ indent.value(rCount) ++ "[\n"; - rCount = rCount + 1; - if(rCount < maxDepth, { - array.do({arg subArray; writeArray.value(subArray)}); - }, { - prettyString = prettyString ++ array.collect({arg subArray; - indent.value(rCount + 1) ++ subArray.asCompileString - }).join(",\n"); - }); - rCount = rCount - 1; - prettyString = prettyString ++ "\n" ++ indent.value(rCount) ++ "],\n"; - }; - - writeArray.value(data); - prettyString.replace(",\n\n", "\n").drop(-2); - }) -}; - -sanityCheck = {arg motif, index; - //print functions = very helpful - ("----------" + index + "------------").postln; - - motif.flatten.do({arg val, v; - if(v > 0, { - if(motif.flatten[v-1][0].hammingDistance(val[0]) > 1, {"problem 1".postln}); - if(motif.flatten[v-1][0].hammingDistance(val[0]) == 0, {"problem 2".postln}); - }); - val.postln - }); - "***********".postln; -}; - -msgInterpret = {arg in, escapeDoubleQuotes = true, escapeSingleQuotes = true; - var res; - - res = in; - if(res.isNil.not, { - if((res.isArray && res.isString.not), { - res = res.asCompileString; - res = res.replace(" ", "").replace("\n", "").replace("\t", ""); - if(escapeSingleQuotes, {res = res.replace("\'", "")}); - if(escapeDoubleQuotes, {res = res.replace("\"", "")}); - res = res.replace("Rest", "\"Rest\""); - res = res.interpret; - }, { - var tmpRes; - if(res.every({arg char; char.isDecDigit}), {tmpRes = res.asInteger}); - if(res.contains("."), {tmpRes = res.asFloat}); - if(tmpRes != nil, {res = tmpRes}); - }); - }); - res -}; - -writeResources = {arg path, dict; - var file, modelItems, resString; - file = File(path,"w"); - - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - - resString = nameSpaces.collect({arg nameSpace; - var depth = 0, insert = " "; - if(nameSpace == "music_data", {depth = 3; insert = "\n"}); - if(nameSpace == "last_changes", {depth = 1; insert = "\n"}); - if(nameSpace == "order", {depth = 1; insert = "\n"}); - if((nameSpace == "ref_uid") && (dict[nameSpace] == nil), {dict[nameSpace] = "nil"}); - "\"" ++ nameSpace ++ "\":" ++ insert ++ stringifyToDepth.value(dict[nameSpace], depth) - }).join(",\n"); - - resString = "{\n" ++ resString ++ "\n}"; - - file.write(resString); - file.close; - resString -}; - -loadModelFile = {arg path; loadModelJSON.value(File(path, "r").readAllString.parseJSON)}; - -loadModelJSON = {arg jsonObject; - var dict; - dict = Dictionary.with(*nameSpaces.collect({arg nS; nS->msgInterpret.value(jsonObject[nS])})); - dict -}; - -setGlobalVars = {arg dict, skipLastXChanges = false; - var tmpLastXChanges; - tmpLastXChanges = lastXChanges.deepCopy; - // order really matters!!!! - # seq, lastXChanges, curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited = nameSpaces.collect({arg nS; dict[nS]}); - if(skipLastXChanges, {lastXChanges = tmpLastXChanges}); - dict -}; - -globalVarsToDict = { - var modelItems, dict; - // order really matters!!!! - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - dict = Dictionary.with(*nameSpaces.collect({arg nS, n; nS->modelItems[n]})); -}; - -loadLedgerFile = {arg path; - ledgerPath = path; - resourceDir = path.splitext(".").drop(-1).join; - loadLedgerJSON.value(File(ledgerPath, "r").readAllString.parseJSON) -}; - -loadLedgerJSON = {arg jsonObject; ledger = jsonObject["ledger"]}; - -saveLedger = {arg ledger, path; - var file, curResourceDir; - file = File(path, "w"); - curResourceDir = resourceDir; - resourceDir = path.splitext(".").drop(-1).join; - if(curResourceDir != resourceDir, { - File.mkdir(resourceDir); - ledger.do({arg id; - File.copy(curResourceDir +/+ id, resourceDir +/+ id); - }); - }); - file.write("{\n\"ledger\":\n" ++ stringifyToDepth.value(ledger, 1) ++ "\n}"); - file.close; -}; - -//------global vars - -primes = [[2, 1], [3, 2], [5, 4], [7, 4], [11, 8], [13, 8]]; -//ranges = [[-2400, 0], [-1200, 1200], [0, 2400], [0, 2400]]; -exPath = thisProcess.nowExecutingPath; -dir = exPath.dirname; -//popSize = 4; -dims = primes.size; -tuples = genTuples.value(); -//refUID = nil; -group = Group.new; -~group = group; -loadLedgerFile.value(dir +/+ ".." +/+ "resources" +/+ "piece_ledger.json"); -resourceDir = (dir +/+ ".." +/+ "resources" +/+ "piece_ledger"); -//passagesWeights = [1, 1, 1, 1, 1]; -//susWeights = [1, 1, 1]; -// order really matters!!!! -nameSpaces = [ - "music_data", "last_changes", "cur_uid", "ref_uid", "order_seed", "dur_seed", "motifs_seed", - "entrances_probs_vals","passages_probs_vals", "exits_probs_vals", - "ranges", "step_probs_vals", "passages_weights", "hd_exp", "hd_invert", - "order", "sus_weights", "order_size", "passages_size", - "motif_edited", "order_edited" -]; - - -//------OSC funcs - -OSCdef(\load_ledger, {arg msg, time, addr, port; - loadLedgerFile.value(msg[1].asString); -}, \load_ledger); - -OSCdef(\load_model, {arg msg, time, addr, port; - var dict; - dict = loadModelFile.value(msg[1].asString); - setGlobalVars.value(dict); -}, \load_model); - -OSCdef(\save_ledger, {arg msg, time, addr, port; - msg.postln; - ledger = msgInterpret.value(msg[1].asString.parseJSON["ledger"], false).postln; - //loadLedgerJSON.value(msg[0]) - saveLedger.value(ledger, msg[2].asString); - //loadLedgerFile.value(msg[1].asString); -}, \save_ledger); - -OSCdef(\generate, {arg msg, time, addr, port; - var path, dict, durSeeds, musPath, modelString; - msg.postln; - - path = msg[1].asString; - - dict = loadModelFile.value(path); - setGlobalVars.value(dict, true); - - popSize = ranges.size; - - //refUID.postln; - - loadLedgerFile.value(ledgerPath); - if(ledger == nil, {ledger = ["tmp"]}); - if(ledger.last != "tmp", {ledger = ledger.add("tmp")}); - - if(refUID == nil, {lastXChanges = [initVoices.value().deepCopy]}); - if((refUID != nil) && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - lastXChanges = msgInterpret.value(file.readAllString.parseJSON["last_changes"]); - }); - - refUID.postln; - lastXChanges.collect({arg item; item.postln}); - - durSeeds = seedFunc.value({3.collect({rrand(100000, 999999)})}, durSeed).value.postln; - entrancesDurFunc = genDurFunc.valueArray(entrancesProbVals[..4] ++ [entrancesProbVals[5..]] ++ [durSeeds[0]]); - passagesDurFunc = genDurFunc.valueArray(passagesProbVals[..4] ++ [passagesProbVals[5..]] ++ [durSeeds[1]]); - exitsDurFunc = genDurFunc.valueArray(exitsProbVals[..4] ++ [exitsProbVals[5..]] ++ [durSeeds[2]]); - - if(orders == nil, { - orders = seedFunc.value(genOrders, orderSeed).valueArray(orderSize ++ passagesSize); - //addr.sendMsg("/order", stringifyToDepth.value(orders, 1)); - }); - - stepFunc = genStepFunc.valueArray(stepProbsVals[..1] ++ [stepProbsVals[2..]] ++ [motifSeed]); - seq = seedFunc.value(genMotif, motifSeed).value; - - lastXChanges.collect({arg item; item.postln}); - - dict = globalVarsToDict.value; - modelString = writeResources.value(path, dict); - - //addr.sendMsg("/generated", musPath, stringifyToDepth.value(seq, 3)); - //~seq = seq; - - addr.sendMsg("/generated", path, modelString, ledgerPath); -}, \generate); - - -OSCdef(\commit, {arg msg, time, addr, port; - var musicData, musicChanged, dict, newLedger, modelPath, musString, musFile, test1, test2, lastCurUID, commitType, commitPos, equalityLedger; - //msg.postln; - - /* - test1 = msg[1].asString.parseJSON; - test2 = (dir +/+ ".." +/+ "resources/tmp/tmp_music" ++ ".json").standardizePath.parseJSONFile; - msgInterpret.value(test1["music"])[0][0][0][1].class.postln; - msgInterpret.value(test2["music_data"])[0][0][0][1].class.postln; - (test1["music"] == test2["music_data"]).postln; - */ - - musicData = loadModelJSON.value(msg[1].asString.parseJSON)["music_data"].postln; - musicChanged = (musicData != seq).postln; - commitType = msg[2].asString; - commitPos = msg[3].postln.asInteger; - - lastCurUID = curUID.deepCopy; - curUID = genUID.value; - - File.mkdir((resourceDir +/+ curUID).standardizePath); - File.copy(exPath, (resourceDir +/+ curUID +/+ curUID ++ "_code" ++ ".scd").standardizePath); - - modelPath = (resourceDir +/+ curUID +/+ curUID ++ "_mus_model" ++ ".json").standardizePath; - dict = globalVarsToDict.value; - if(musicChanged, { - seq = musicData; - dict["music_data"] = seq; - dict["motif_edited"] = "true" - }); - dict["cur_uid"] = curUID; - - writeResources.value(modelPath, dict); - - File.delete(ledgerPath ++ "_bak"); - File.copy(ledgerPath, ledgerPath ++ "_bak"); - File.delete(ledgerPath); - - /* - if(commitType == "add", { - if(lastCurUID == "tmp", { - ledger = ledger.drop(-1).add(curUID); - }, { - ledger = ledger.add(curUID); - }) - }); - */ - - ledger.postln; - - if(commitType == "add", {ledger = ledger.add(curUID)}); - - if(commitType == "insert", {ledger = ledger.insert(commitPos + 1, curUID)}); - - if(commitType == "replace", {ledger = ledger.put(commitPos, curUID)}); - - equalityLedger = ledger.collect({arg item; item.asSymbol}); - if(equalityLedger.includes(\tmp).postln, {ledger.removeAt(equalityLedger.indexOf(\tmp).postln)}); - - ledger.postln; - - saveLedger.value(ledger, ledgerPath); - - addr.sendMsg("/committed", curUID, ledgerPath); - //refUID = curUID; - -}, \commit); - -OSCdef(\transport, {arg msg, time, addr, port; - msg.postln; - if(msg[1] == 0, { - group.set(\release, 2); - group.set(\gate, 0); - player.stop; - }, { - // the cued sequence can now be read from file, so this can be cleaned up - var cSize, patterns, pSeq, cuedSeek, indexStart, indexEnd, tmpLedger; - if(msg[1] == 1, { - pSeq = []; - cuedSeek = (seq != nil); - indexStart = msg[2].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.postln.parseJSON["music_data"]), path, indexStart + index, uid]); - file.close; - }); - }); - if(cuedSeek, { - var path, file; - path = (resourceDir +/+ "tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - patterns = genPatterns.value(pSeq, addr); - }, { - pSeq = [loadModelJSON.value(msg[2].asString.parseJSON)["music_data"].postln]; - patterns = genPatterns.value(pSeq, addr, true); - }); - player = Pfset(pattern: patterns, cleanupFunc: { - addr.sendMsg("/transport", 0); - addr.sendMsg("/one_shot", 0); - }); - player = player.play - }); -}, \transport); - - -OSCdef(\transcribe_motif, {arg msg, time, addr, port; - var tSeq, refChord, refUID; - - msg.postln; - - tSeq = [loadModelJSON.value(msg[1].asString.parseJSON)["music_data"]]; - refUID = msg[2].asString.postln; - - if((refUID != "nil") && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }, { - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - }); - - ~transcribe.value(tSeq, refChord, (dir +/+ ".." +/+ "lilypond" +/+ "includes").standardizePath, addr, "/transcribe_motif"); -}, \transcribe_motif); - - -OSCdef(\transcribe_all, {arg msg, time, addr, port; - var cSize, patterns, cuedSeek, indexStart, indexEnd, tmpLedger; - if(true, { - cuedSeek = (seq != nil); - indexStart = msg[1].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - - //tmp for testing transcription - //indexEnd = (indexStart+5); - - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - var lilyPartLedgerFiles; - - lilyPartLedgerFiles = 4.collect({arg p; - File((dir +/+ ".." +/+ "lilypond" +/+ "includes" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly").standardizePath, "w"); - }); - - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file, fileString, tSeq, refUID, refChord; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - fileString = file.readAllString; - tSeq = msgInterpret.value(fileString.parseJSON["music_data"]); - refUID = msgInterpret.value(fileString.parseJSON["ref_uid"]); - file.close; - - //uid.postln; - //(refUID == "nil").postln; - - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - - if(refUID != "nil", { - path = (resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }); - - if(index != indexEnd, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath); - }, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath, addr, "/transcribe_all"); - }); - - lilyPartLedgerFiles.do({arg f, p; - f.write("\\include \"" ++ resourceDir +/+ uid +/+ "lilypond" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly\"\n"); - }); - - }); - - lilyPartLedgerFiles.do({arg f; - f.close - }); - }); - /* - if(cuedSeek, { - var path, file; - path = (dir +/+ ".." +/+ "resources/tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - */ - }, { - - }); - -}, \transcribe_all); - -) - - diff --git a/resources/string_quartet_3/6a9928d6/6a9928d6_mus_model.json b/resources/string_quartet_3/6a9928d6/6a9928d6_mus_model.json deleted file mode 100644 index 7ef872c..0000000 --- a/resources/string_quartet_3/6a9928d6/6a9928d6_mus_model.json +++ /dev/null @@ -1,554 +0,0 @@ -{ -"music_data": -[ - [ - [ - [ [ [ "Rest" ], [ "Rest" ], [ 2, -4, 0, 3, -1, 0 ], [ "Rest" ] ], 1.5 ], - [ [ [ "Rest" ], [ "Rest" ], [ 2, -4, 0, 3, -1, 0 ], [ 4, -5, -1, 2, -1, -1 ] ], 0.5 ], - [ [ [ "Rest" ], [ 2, -5, 0, 3, -1, -1 ], [ 2, -4, 0, 3, -1, 0 ], [ 4, -5, -1, 2, -1, -1 ] ], 1.75 ], - [ [ [ 1, -5, 0, 3, -1, -1 ], [ 2, -5, 0, 3, -1, -1 ], [ 2, -4, 0, 3, -1, 0 ], [ 4, -5, -1, 2, -1, -1 ] ], 0.875 ] - ], - [ - [ [ [ 1, -5, 0, 3, -1, -1 ], [ 4, -5, -1, 2, -1, -2 ], [ 2, -4, 0, 3, -1, 0 ], [ 4, -5, -1, 2, -1, -1 ] ], 1.125 ], - [ [ [ 1, -5, 0, 3, -1, -1 ], [ 4, -5, -1, 2, -1, -2 ], [ 4, -5, -2, 2, -1, -1 ], [ 4, -5, -1, 2, -1, -1 ] ], 1.625 ], - [ [ [ 2, -5, 0, 2, -1, -1 ], [ 4, -5, -1, 2, -1, -2 ], [ 4, -5, -2, 2, -1, -1 ], [ 4, -5, -1, 2, -1, -1 ] ], 1.875 ] - ], - [ - [ [ [ 2, -5, 0, 2, -1, -1 ], [ 4, -5, -1, 2, -1, -2 ], [ 3, -5, 0, 2, 0, -1 ], [ 4, -5, -1, 2, -1, -1 ] ], 1.125 ], - [ [ [ 2, -5, 0, 2, -1, -1 ], [ 4, -5, -1, 2, -1, -2 ], [ 3, -5, 0, 2, 0, -1 ], [ 4, -6, 0, 2, -1, -1 ] ], 0.5 ], - [ [ [ 2, -5, 0, 2, -1, -1 ], [ 3, -6, 0, 2, -1, -1 ], [ 3, -5, 0, 2, 0, -1 ], [ 4, -6, 0, 2, -1, -1 ] ], 1.875 ] - ], - [ - [ [ [ 2, -5, 0, 2, -1, -1 ], [ 2, -5, 0, 2, 0, -2 ], [ 3, -5, 0, 2, 0, -1 ], [ 4, -6, 0, 2, -1, -1 ] ], 0.75 ], - [ [ [ 1, -5, 0, 2, 0, 0 ], [ 2, -5, 0, 2, 0, -2 ], [ 3, -5, 0, 2, 0, -1 ], [ 4, -6, 0, 2, -1, -1 ] ], 0.5 ], - [ [ [ 1, -5, 0, 2, 0, 0 ], [ 2, -5, 0, 2, 0, -2 ], [ 3, -5, 0, 2, 0, -1 ], [ 3, -5, -1, 2, 0, -1 ] ], 0.75 ] - ], - [ - [ [ [ 1, -5, 0, 2, 0, 0 ], [ 2, -5, 0, 2, 0, -2 ], [ 3, -5, 0, 2, 1, -2 ], [ 3, -5, -1, 2, 0, -1 ] ], 1.625 ], - [ [ [ 3, -5, 0, 1, 0, -2 ], [ 2, -5, 0, 2, 0, -2 ], [ 3, -5, 0, 2, 1, -2 ], [ 3, -5, -1, 2, 0, -1 ] ], 1.625 ] - ], - [ - [ [ [ 3, -5, 0, 2, 0, -3 ], [ 2, -5, 0, 2, 0, -2 ], [ 3, -5, 0, 2, 1, -2 ], [ 3, -5, -1, 2, 0, -1 ] ], 1.875 ] - ], - [ - [ [ [ 3, -5, 0, 2, 0, -3 ], [ 2, -5, 0, 2, 0, -2 ], [ 4, -5, 1, 2, 0, -3 ], [ 3, -5, -1, 2, 0, -1 ] ], 0.625 ], - [ [ [ 3, -5, 0, 2, 0, -3 ], [ 2, -5, 0, 3, 0, -3 ], [ 4, -5, 1, 2, 0, -3 ], [ 3, -5, -1, 2, 0, -1 ] ], 1.125 ], - [ [ [ 3, -5, 0, 2, 0, -3 ], [ 2, -5, 0, 3, 0, -3 ], [ 4, -5, 1, 2, 0, -3 ], [ 5, -5, 0, 1, 0, -3 ] ], 1.625 ] - ], - [ - [ [ [ 3, -5, 0, 2, 0, -3 ], [ 4, -5, -1, 2, 0, -3 ], [ 4, -5, 1, 2, 0, -3 ], [ 5, -5, 0, 1, 0, -3 ] ], 1 ], - [ [ [ 3, -5, 0, 2, 0, -3 ], [ 4, -5, -1, 2, 0, -3 ], [ 4, -5, 1, 2, 0, -3 ], [ 5, -5, 0, 2, 0, -4 ] ], 0.5 ], - [ [ [ 3, -5, 0, 2, 0, -3 ], [ 4, -5, -1, 2, 0, -3 ], [ 4, -5, 0, 2, 1, -3 ], [ 5, -5, 0, 2, 0, -4 ] ], 1.5 ] - ], - [ - [ [ [ 3, -5, 0, 3, 0, -4 ], [ 4, -5, -1, 2, 0, -3 ], [ 4, -5, 0, 2, 1, -3 ], [ 5, -5, 0, 2, 0, -4 ] ], 0.5 ] - ], - [ - [ [ [ 3, -5, 0, 2, 1, -4 ], [ 4, -5, -1, 2, 0, -3 ], [ 4, -5, 0, 2, 1, -3 ], [ 5, -5, 0, 2, 0, -4 ] ], 1.875 ], - [ [ [ 3, -5, 0, 2, 1, -4 ], [ 4, -5, 0, 2, 1, -4 ], [ 4, -5, 0, 2, 1, -3 ], [ 5, -5, 0, 2, 0, -4 ] ], 1.75 ], - [ [ [ 3, -5, 0, 2, 1, -4 ], [ 4, -5, 0, 2, 1, -4 ], [ 4, -5, 0, 2, 1, -3 ], [ 3, -4, 0, 2, 1, -3 ] ], 0.5 ] - ], - [ - [ [ [ 3, -5, 0, 2, 1, -4 ], [ 4, -5, 0, 2, 1, -4 ], [ 4, -5, 0, 2, 1, -3 ], [ 3, -5, 0, 2, 1, -2 ] ], 1.5 ] - ], - [ - [ [ [ 3, -5, 0, 2, 1, -4 ], [ 4, -5, 0, 2, 1, -4 ], [ 4, -5, 0, 2, 2, -4 ], [ 3, -5, 0, 2, 1, -2 ] ], 1.25 ] - ], - [ - [ [ [ 2, -5, -1, 2, 1, -2 ], [ 4, -5, 0, 2, 1, -4 ], [ 4, -5, 0, 2, 2, -4 ], [ 3, -5, 0, 2, 1, -2 ] ], 1.375 ], - [ [ [ 2, -5, -1, 2, 1, -2 ], [ 4, -5, 0, 2, 1, -4 ], [ 4, -5, 0, 1, 1, -2 ], [ 3, -5, 0, 2, 1, -2 ] ], 0.875 ], - [ [ [ 2, -5, -1, 2, 1, -2 ], [ 2, -5, 0, 3, 1, -2 ], [ 4, -5, 0, 1, 1, -2 ], [ 3, -5, 0, 2, 1, -2 ] ], 1.875 ] - ], - [ - [ [ [ 2, -5, -1, 2, 1, -2 ], [ 4, -5, -1, 2, 1, -3 ], [ 4, -5, 0, 1, 1, -2 ], [ 3, -5, 0, 2, 1, -2 ] ], 0.875 ], - [ [ [ 2, -5, -1, 2, 1, -2 ], [ 4, -5, -1, 2, 1, -3 ], [ 4, -5, 0, 1, 1, -2 ], [ 4, -6, -1, 2, 1, -2 ] ], 1.75 ], - [ [ [ 2, -5, -1, 2, 1, -2 ], [ 4, -5, -1, 2, 1, -3 ], [ 3, -4, -1, 2, 1, -2 ], [ 4, -6, -1, 2, 1, -2 ] ], 0.875 ] - ], - [ - [ [ [ 2, -5, -1, 2, 1, -2 ], [ 4, -5, -1, 2, 1, -3 ], [ 3, -4, -1, 2, 1, -2 ], [ 5, -5, -1, 1, 1, -3 ] ], 1.125 ], - [ [ [ 2, -5, -1, 2, 1, -2 ], [ 4, -5, -1, 2, 1, -3 ], [ 4, -6, -1, 2, 1, -2 ], [ 5, -5, -1, 1, 1, -3 ] ], 1 ] - ], - [ - [ [ [ 2, -5, -1, 2, 1, -2 ], [ 4, -5, -1, 2, 1, -3 ], [ 4, -6, -1, 2, 1, -2 ], [ 3, -6, -1, 3, 1, -2 ] ], 0.625 ], - [ [ [ 3, -6, -2, 2, 1, -2 ], [ 4, -5, -1, 2, 1, -3 ], [ 4, -6, -1, 2, 1, -2 ], [ 3, -6, -1, 3, 1, -2 ] ], 0.75 ], - [ [ [ 3, -6, -2, 2, 1, -2 ], [ 2, -6, -1, 2, 1, -1 ], [ 4, -6, -1, 2, 1, -2 ], [ 3, -6, -1, 3, 1, -2 ] ], 0.5 ] - ], - [ - [ [ [ 3, -6, -2, 2, 1, -2 ], [ 4, -6, -2, 1, 1, -2 ], [ 4, -6, -1, 2, 1, -2 ], [ 3, -6, -1, 3, 1, -2 ] ], 1.5 ], - [ [ [ 3, -6, -2, 2, 1, -2 ], [ 4, -6, -2, 1, 1, -2 ], [ 4, -6, -1, 2, 1, -2 ], [ 5, -6, -2, 2, 1, -3 ] ], 0.75 ], - [ [ [ 3, -6, -2, 2, 1, -2 ], [ 4, -6, -2, 1, 1, -2 ], [ 5, -7, -2, 2, 1, -2 ], [ 5, -6, -2, 2, 1, -3 ] ], 0.875 ] - ], - [ - [ [ [ 3, -6, -2, 2, 1, -2 ], [ 4, -6, -2, 2, 1, -3 ], [ 5, -7, -2, 2, 1, -2 ], [ 5, -6, -2, 2, 1, -3 ] ], 1 ], - [ [ [ 3, -6, -2, 2, 1, -2 ], [ 4, -6, -2, 2, 1, -3 ], [ 5, -7, -2, 2, 1, -2 ], [ 4, -6, -2, 2, 2, -2 ] ], 0.5 ], - [ [ [ 3, -6, -2, 2, 1, -2 ], [ 4, -6, -2, 2, 1, -3 ], [ 5, -6, -2, 2, 0, -2 ], [ 4, -6, -2, 2, 2, -2 ] ], 1.125 ] - ], - [ - [ [ [ 3, -6, -2, 2, 1, -2 ], [ 3, -6, -2, 2, 2, -2 ], [ 5, -6, -2, 2, 0, -2 ], [ 4, -6, -2, 2, 2, -2 ] ], 1.75 ], - [ [ [ 3, -6, -2, 2, 1, -2 ], [ 3, -6, -2, 2, 2, -2 ], [ 5, -6, -2, 2, 0, -2 ], [ 5, -6, -2, 1, 1, -2 ] ], 0.5 ], - [ [ [ 3, -6, -2, 2, 1, -2 ], [ 3, -6, -2, 2, 2, -2 ], [ 4, -6, -2, 2, 2, -2 ], [ 5, -6, -2, 1, 1, -2 ] ], 1.75 ] - ], - [ - [ [ [ 3, -6, -2, 2, 1, -2 ], [ 5, -7, -2, 1, 1, -2 ], [ 4, -6, -2, 2, 2, -2 ], [ 5, -6, -2, 1, 1, -2 ] ], 0.875 ] - ], - [ - [ [ [ 3, -6, -2, 2, 1, -2 ], [ 5, -7, -2, 1, 1, -2 ], [ 6, -7, -2, 1, 0, -2 ], [ 5, -6, -2, 1, 1, -2 ] ], 1.25 ] - ], - [ - [ [ [ 3, -6, -2, 2, 1, -2 ], [ 5, -7, -2, 1, 1, -2 ], [ 6, -7, -3, 1, 1, -2 ], [ 5, -6, -2, 1, 1, -2 ] ], 1.625 ], - [ [ [ 3, -6, -2, 2, 1, -2 ], [ 5, -7, -2, 1, 1, -2 ], [ 6, -7, -3, 1, 1, -2 ], [ 5, -7, -2, 1, 1, -1 ] ], 1.375 ], - [ [ [ 5, -7, -2, 1, 0, -2 ], [ 5, -7, -2, 1, 1, -2 ], [ 6, -7, -3, 1, 1, -2 ], [ 5, -7, -2, 1, 1, -1 ] ], 1.375 ] - ], - [ - [ [ [ 5, -7, -2, 1, 0, -2 ], [ 5, -7, -2, 1, 1, -2 ], [ 7, -7, -2, 1, 0, -3 ], [ 5, -7, -2, 1, 1, -1 ] ], 1.5 ], - [ [ [ 5, -7, -2, 1, 0, -2 ], [ 5, -6, -2, 1, 0, -2 ], [ 7, -7, -2, 1, 0, -3 ], [ 5, -7, -2, 1, 1, -1 ] ], 0.875 ] - ], - [ - [ [ [ 5, -7, -2, 1, 0, -2 ], [ 5, -6, -2, 1, 0, -2 ], [ 7, -7, -2, 1, 0, -3 ], [ 5, -6, -2, 1, 0, -1 ] ], 0.75 ], - [ [ [ 6, -8, -2, 1, 0, -3 ], [ 5, -6, -2, 1, 0, -2 ], [ 7, -7, -2, 1, 0, -3 ], [ 5, -6, -2, 1, 0, -1 ] ], 1.75 ] - ], - [ - [ [ [ 6, -8, -2, 1, 0, -3 ], [ 5, -6, -2, 1, 0, -2 ], [ 5, -6, -2, 2, 0, -2 ], [ 5, -6, -2, 1, 0, -1 ] ], 0.5 ] - ], - [ - [ [ [ 6, -8, -2, 1, 0, -3 ], [ 5, -6, -2, 1, 0, -2 ], [ 5, -6, -2, 2, 0, -2 ], [ 6, -6, -2, 1, -1, -2 ] ], 1.375 ], - [ [ [ 6, -8, -2, 1, 0, -3 ], [ 5, -6, -2, 1, 0, -2 ], [ 6, -6, -3, 1, 0, -2 ], [ 6, -6, -2, 1, -1, -2 ] ], 1.25 ] - ], - [ - [ [ [ 5, -6, -3, 1, -1, -2 ], [ 5, -6, -2, 1, 0, -2 ], [ 6, -6, -3, 1, 0, -2 ], [ 6, -6, -2, 1, -1, -2 ] ], 1.75 ], - [ [ [ 5, -6, -3, 1, -1, -2 ], [ 5, -5, -2, 1, -1, -2 ], [ 6, -6, -3, 1, 0, -2 ], [ 6, -6, -2, 1, -1, -2 ] ], 1.375 ], - [ [ [ 5, -6, -3, 1, -1, -2 ], [ 5, -5, -2, 1, -1, -2 ], [ 4, -5, -2, 1, -1, -2 ], [ 6, -6, -2, 1, -1, -2 ] ], 1.25 ] - ], - [ - [ [ [ 5, -6, -3, 1, -1, -2 ], [ 6, -6, -3, 1, -1, -2 ], [ 4, -5, -2, 1, -1, -2 ], [ 6, -6, -2, 1, -1, -2 ] ], 1.375 ], - [ [ [ 4, -6, -2, 2, -1, -2 ], [ 6, -6, -3, 1, -1, -2 ], [ 4, -5, -2, 1, -1, -2 ], [ 6, -6, -2, 1, -1, -2 ] ], 1.125 ], - [ [ [ 4, -6, -2, 2, -1, -2 ], [ 6, -6, -3, 1, -1, -2 ], [ 4, -6, -2, 1, -1, -1 ], [ 6, -6, -2, 1, -1, -2 ] ], 1.75 ] - ], - [ - [ [ [ 4, -6, -2, 2, -1, -2 ], [ 5, -6, -2, 2, -1, -3 ], [ 4, -6, -2, 1, -1, -1 ], [ 6, -6, -2, 1, -1, -2 ] ], 1.625 ], - [ [ [ 4, -6, -2, 2, -1, -2 ], [ 5, -6, -2, 2, -1, -3 ], [ 4, -6, -2, 1, -1, -1 ], [ 5, -6, -1, 2, -1, -2 ] ], 0.875 ], - [ [ [ 4, -6, -2, 2, -1, -2 ], [ 5, -6, -2, 2, -1, -3 ], [ 3, -6, -2, 3, -1, -2 ], [ 5, -6, -1, 2, -1, -2 ] ], 1.625 ] - ], - [ - [ [ [ 4, -6, -2, 2, -1, -2 ], [ 5, -6, -2, 2, -1, -3 ], [ 3, -5, -1, 2, -1, -2 ], [ 5, -6, -1, 2, -1, -2 ] ], 0.875 ], - [ [ [ 3, -6, -1, 3, -1, -2 ], [ 5, -6, -2, 2, -1, -3 ], [ 3, -5, -1, 2, -1, -2 ], [ 5, -6, -1, 2, -1, -2 ] ], 1.375 ] - ], - [ - [ [ [ 3, -6, -1, 3, -1, -2 ], [ 4, -6, 0, 2, -1, -2 ], [ 3, -5, -1, 2, -1, -2 ], [ 5, -6, -1, 2, -1, -2 ] ], 1.25 ], - [ [ [ 3, -6, -1, 3, -1, -2 ], [ 4, -6, 0, 2, -1, -2 ], [ 4, -6, -2, 2, -1, -2 ], [ 5, -6, -1, 2, -1, -2 ] ], 1.25 ], - [ [ [ 3, -5, -1, 2, -1, -2 ], [ 4, -6, 0, 2, -1, -2 ], [ 4, -6, -2, 2, -1, -2 ], [ 5, -6, -1, 2, -1, -2 ] ], 1.25 ] - ], - [ - [ [ [ 3, -5, -1, 2, -1, -2 ], [ 4, -6, 0, 2, -1, -2 ], [ 4, -5, -1, 2, -1, -3 ], [ 5, -6, -1, 2, -1, -2 ] ], 1.5 ], - [ [ [ 3, -5, -1, 2, -1, -2 ], [ 5, -7, -1, 2, -1, -2 ], [ 4, -5, -1, 2, -1, -3 ], [ 5, -6, -1, 2, -1, -2 ] ], 1.125 ] - ], - [ - [ [ [ 3, -5, -1, 2, -1, -2 ], [ 5, -7, -1, 2, -1, -2 ], [ 4, -5, -1, 2, -1, -3 ], [ 5, -7, 0, 2, -1, -2 ] ], 0.75 ], - [ [ [ 3, -5, -1, 2, -1, -2 ], [ 5, -7, -1, 2, -1, -2 ], [ 4, -6, -1, 2, -1, -2 ], [ 5, -7, 0, 2, -1, -2 ] ], 1.5 ], - [ [ [ 5, -7, -1, 2, -1, -3 ], [ 5, -7, -1, 2, -1, -2 ], [ 4, -6, -1, 2, -1, -2 ], [ 5, -7, 0, 2, -1, -2 ] ], 1.625 ] - ], - [ - [ [ [ 5, -7, -1, 2, -1, -3 ], [ 4, -7, 0, 3, -1, -2 ], [ 4, -6, -1, 2, -1, -2 ], [ 5, -7, 0, 2, -1, -2 ] ], 1.375 ], - [ [ [ 5, -7, -1, 2, -1, -3 ], [ 4, -7, 0, 3, -1, -2 ], [ 6, -8, -1, 2, -1, -3 ], [ 5, -7, 0, 2, -1, -2 ] ], 0.375 ] - ], - [ - [ [ [ 5, -7, -1, 2, -1, -3 ], [ 4, -7, 0, 3, -1, -2 ], [ 3, -7, 0, 3, -1, -1 ], [ 5, -7, 0, 2, -1, -2 ] ], 1.125 ], - [ [ [ 4, -7, 0, 2, -1, -2 ], [ 4, -7, 0, 3, -1, -2 ], [ 3, -7, 0, 3, -1, -1 ], [ 5, -7, 0, 2, -1, -2 ] ], 0.875 ], - [ [ [ 4, -7, 0, 2, -1, -2 ], [ 4, -7, 0, 3, -1, -2 ], [ 3, -7, 0, 3, -1, -1 ], [ 5, -7, 0, 3, -1, -3 ] ], 1.125 ] - ], - [ - [ [ [ 3, -7, 0, 3, -1, -2 ], [ 4, -7, 0, 3, -1, -2 ], [ 3, -7, 0, 3, -1, -1 ], [ 5, -7, 0, 3, -1, -3 ] ], 0.75 ], - [ [ [ 3, -7, 0, 3, -1, -2 ], [ 4, -7, 0, 3, -1, -2 ], [ 3, -7, 0, 3, -1, -1 ], [ 5, -8, 0, 3, -1, -2 ] ], 0.625 ], - [ [ [ 3, -7, 0, 3, -1, -2 ], [ 4, -7, 0, 3, -1, -2 ], [ 3, -7, 0, 4, -1, -2 ], [ 5, -8, 0, 3, -1, -2 ] ], 1.125 ] - ], - [ - [ [ [ 3, -7, 0, 3, -1, -2 ], [ 4, -7, 0, 4, -1, -3 ], [ 3, -7, 0, 4, -1, -2 ], [ 5, -8, 0, 3, -1, -2 ] ], 0.5 ] - ], - [ - [ [ [ 3, -7, 0, 3, -1, -2 ], [ 4, -7, -1, 3, -1, -2 ], [ 3, -7, 0, 4, -1, -2 ], [ 5, -8, 0, 3, -1, -2 ] ], 0.625 ], - [ [ [ 3, -7, 0, 3, -1, -2 ], [ 4, -7, -1, 3, -1, -2 ], [ 4, -8, 0, 3, 0, -2 ], [ 5, -8, 0, 3, -1, -2 ] ], 1.625 ] - ], - [ - [ [ [ 3, -7, 0, 3, -1, -2 ], [ 4, -7, -1, 3, -1, -2 ], [ 4, -8, 0, 3, 0, -2 ], [ 5, -7, 0, 3, -2, -2 ] ], 1.125 ], - [ [ [ 3, -7, 0, 3, -1, -2 ], [ 4, -7, -1, 3, -1, -2 ], [ 4, -7, 0, 3, -1, -2 ], [ 5, -7, 0, 3, -2, -2 ] ], 1.625 ], - [ [ [ 3, -7, 0, 3, -1, -2 ], [ 3, -7, 0, 4, -1, -2 ], [ 4, -7, 0, 3, -1, -2 ], [ 5, -7, 0, 3, -2, -2 ] ], 1 ] - ], - [ - [ [ [ 3, -7, 0, 3, -1, -2 ], [ 3, -7, 0, 4, -1, -2 ], [ 4, -7, 0, 4, -1, -3 ], [ 5, -7, 0, 3, -2, -2 ] ], 0.875 ] - ], - [ - [ [ [ 4, -7, 0, 3, -3, -2 ], [ 3, -7, 0, 4, -1, -2 ], [ 4, -7, 0, 4, -1, -3 ], [ 5, -7, 0, 3, -2, -2 ] ], 1.625 ], - [ [ [ 4, -7, 0, 3, -3, -2 ], [ 3, -7, 0, 3, -1, -2 ], [ 4, -7, 0, 4, -1, -3 ], [ 5, -7, 0, 3, -2, -2 ] ], 1 ] - ], - [ - [ [ [ 4, -7, 0, 3, -3, -2 ], [ 3, -7, 0, 4, -1, -3 ], [ 4, -7, 0, 4, -1, -3 ], [ 5, -7, 0, 3, -2, -2 ] ], 0.75 ], - [ [ [ 4, -7, 0, 3, -3, -2 ], [ 3, -7, 0, 4, -1, -3 ], [ 4, -7, 0, 4, -1, -3 ], [ 5, -7, 0, 4, -1, -4 ] ], 1.5 ] - ], - [ - [ [ [ 4, -7, 0, 3, -3, -2 ], [ 3, -7, 0, 4, -1, -3 ], [ 3, -6, 0, 4, -1, -3 ], [ 5, -7, 0, 4, -1, -4 ] ], 1 ], - [ [ [ 3, -7, 0, 5, -1, -4 ], [ 3, -7, 0, 4, -1, -3 ], [ 3, -6, 0, 4, -1, -3 ], [ 5, -7, 0, 4, -1, -4 ] ], 0.625 ] - ], - [ - [ [ [ 3, -7, 0, 5, -1, -4 ], [ 3, -7, 0, 4, -1, -3 ], [ 5, -8, 0, 4, -1, -4 ], [ 5, -7, 0, 4, -1, -4 ] ], 1 ], - [ [ [ 3, -7, 0, 5, -1, -4 ], [ 3, -7, 0, 4, 0, -4 ], [ 5, -8, 0, 4, -1, -4 ], [ 5, -7, 0, 4, -1, -4 ] ], 0.5 ] - ], - [ - [ [ [ 3, -7, 0, 5, -1, -4 ], [ 3, -7, 0, 4, 0, -4 ], [ 5, -8, 0, 4, -1, -4 ], [ 4, -7, 1, 5, -1, -4 ] ], 1.25 ] - ], - [ - [ [ [ 4, -8, 0, 4, 0, -4 ], [ 3, -7, 0, 4, 0, -4 ], [ 5, -8, 0, 4, -1, -4 ], [ 4, -7, 1, 5, -1, -4 ] ], 1.75 ], - [ [ [ 4, -8, 0, 4, 0, -4 ], [ 3, -7, 0, 4, 0, -4 ], [ 3, -7, 0, 4, 0, -3 ], [ 4, -7, 1, 5, -1, -4 ] ], 1.75 ], - [ [ [ 4, -8, 0, 4, 0, -4 ], [ 3, -7, 0, 4, 0, -4 ], [ 3, -7, 0, 4, 0, -3 ], [ 4, -7, 0, 4, 1, -4 ] ], 1 ] - ], - [ - [ [ [ 4, -8, 0, 4, 0, -4 ], [ 3, -7, 0, 4, 0, -4 ], [ 3, -7, 0, 4, 2, -4 ], [ 4, -7, 0, 4, 1, -4 ] ], 1.25 ], - [ [ [ 4, -8, 0, 4, 0, -4 ], [ 3, -7, -1, 4, 1, -4 ], [ 3, -7, 0, 4, 2, -4 ], [ 4, -7, 0, 4, 1, -4 ] ], 0.625 ], - [ [ [ 2, -7, 0, 5, 1, -4 ], [ 3, -7, -1, 4, 1, -4 ], [ 3, -7, 0, 4, 2, -4 ], [ 4, -7, 0, 4, 1, -4 ] ], 0.875 ] - ], - [ - [ [ [ 2, -7, 0, 5, 1, -4 ], [ 3, -7, -1, 4, 1, -4 ], [ 3, -7, 0, 4, 2, -4 ], [ 3, -7, 0, 4, 2, -3 ] ], 0.875 ] - ], - [ - [ [ [ 2, -7, 0, 5, 1, -4 ], [ 3, -7, -1, 4, 1, -4 ], [ 3, -7, 0, 4, 2, -4 ], [ 4, -8, 0, 4, 2, -4 ] ], 0.5 ], - [ [ [ 2, -7, 0, 5, 1, -4 ], [ 3, -7, 0, 4, 2, -5 ], [ 3, -7, 0, 4, 2, -4 ], [ 4, -8, 0, 4, 2, -4 ] ], 1.375 ], - [ [ [ 2, -7, 0, 4, 3, -4 ], [ 3, -7, 0, 4, 2, -5 ], [ 3, -7, 0, 4, 2, -4 ], [ 4, -8, 0, 4, 2, -4 ] ], 0.5 ] - ], - [ - [ [ [ 2, -7, 0, 4, 3, -4 ], [ 3, -7, 0, 4, 2, -5 ], [ 3, -7, 0, 4, 2, -4 ], [ 3, -6, 0, 4, 2, -4 ] ], 1.375 ], - [ [ [ 2, -7, 0, 4, 3, -4 ], [ 3, -8, 0, 4, 2, -4 ], [ 3, -7, 0, 4, 2, -4 ], [ 3, -6, 0, 4, 2, -4 ] ], 0.375 ] - ], - [ - [ [ [ 1, -5, 0, 4, 2, -4 ], [ 3, -8, 0, 4, 2, -4 ], [ 3, -7, 0, 4, 2, -4 ], [ 3, -6, 0, 4, 2, -4 ] ], 1.375 ], - [ [ [ 1, -5, 0, 4, 2, -4 ], [ 2, -6, 0, 4, 2, -4 ], [ 3, -7, 0, 4, 2, -4 ], [ 3, -6, 0, 4, 2, -4 ] ], 1.125 ], - [ [ [ 1, -5, 0, 4, 2, -4 ], [ 2, -6, 0, 4, 2, -4 ], [ 2, -5, 0, 4, 2, -4 ], [ 3, -6, 0, 4, 2, -4 ] ], 1.5 ] - ], - [ - [ [ [ 2, -5, 0, 3, 2, -4 ], [ 2, -6, 0, 4, 2, -4 ], [ 2, -5, 0, 4, 2, -4 ], [ 3, -6, 0, 4, 2, -4 ] ], 1.5 ], - [ [ [ 2, -5, 0, 3, 2, -4 ], [ 1, -4, 0, 4, 2, -4 ], [ 2, -5, 0, 4, 2, -4 ], [ 3, -6, 0, 4, 2, -4 ] ], 1.125 ], - [ [ [ 2, -5, 0, 3, 2, -4 ], [ 1, -4, 0, 4, 2, -4 ], [ 2, -5, 0, 4, 2, -4 ], [ 3, -5, 0, 4, 1, -4 ] ], 0.625 ] - ], - [ - [ [ [ 2, -5, 0, 3, 2, -4 ], [ 1, -4, 0, 4, 2, -4 ], [ 2, -4, 0, 4, 1, -4 ], [ 3, -5, 0, 4, 1, -4 ] ], 1.25 ] - ], - [ - [ [ [ 2, -5, 0, 3, 2, -4 ], [ 3, -5, 0, 3, 1, -4 ], [ 2, -4, 0, 4, 1, -4 ], [ 3, -5, 0, 4, 1, -4 ] ], 1.75 ], - [ [ [ 2, -5, 0, 3, 2, -4 ], [ 3, -5, 0, 3, 1, -4 ], [ 3, -5, 0, 3, 2, -5 ], [ 3, -5, 0, 4, 1, -4 ] ], 1.625 ], - [ [ [ 2, -5, 0, 3, 2, -4 ], [ 3, -5, 0, 3, 1, -4 ], [ 3, -5, 0, 3, 2, -5 ], [ 3, -5, 0, 3, 2, -4 ] ], 0.625 ] - ], - [ - [ [ [ 3, -5, 0, 3, 0, -4 ], [ 3, -5, 0, 3, 1, -4 ], [ 3, -5, 0, 3, 2, -5 ], [ 3, -5, 0, 3, 2, -4 ] ], 1.625 ], - [ [ [ 3, -5, 0, 3, 0, -4 ], [ 3, -5, 0, 3, 1, -4 ], [ 3, -6, 0, 3, 2, -4 ], [ 3, -5, 0, 3, 2, -4 ] ], 1 ] - ], - [ - [ [ [ 3, -5, 0, 3, 0, -4 ], [ 3, -5, 0, 3, 1, -4 ], [ 3, -6, 0, 3, 2, -4 ], [ 3, -6, 0, 4, 2, -4 ] ], 1.375 ], - [ [ [ 2, -6, 1, 3, 2, -4 ], [ 3, -5, 0, 3, 1, -4 ], [ 3, -6, 0, 3, 2, -4 ], [ 3, -6, 0, 4, 2, -4 ] ], 1 ], - [ [ [ 2, -6, 1, 3, 2, -4 ], [ 3, -6, 1, 3, 2, -4 ], [ 3, -6, 0, 3, 2, -4 ], [ 3, -6, 0, 4, 2, -4 ] ], 0.75 ] - ], - [ - [ [ [ 2, -6, 1, 3, 2, -4 ], [ 3, -6, 0, 3, 3, -4 ], [ 3, -6, 0, 3, 2, -4 ], [ 3, -6, 0, 4, 2, -4 ] ], 0.875 ] - ], - [ - [ [ [ 2, -6, 0, 3, 3, -4 ], [ 3, -6, 0, 3, 3, -4 ], [ 3, -6, 0, 3, 2, -4 ], [ 3, -6, 0, 4, 2, -4 ] ], 1.5 ], - [ [ [ 2, -6, 0, 3, 3, -4 ], [ 3, -6, 0, 3, 3, -4 ], [ 3, -6, -1, 3, 3, -4 ], [ 3, -6, 0, 4, 2, -4 ] ], 0.5 ], - [ [ [ 2, -6, 0, 3, 3, -4 ], [ 3, -6, 0, 3, 3, -4 ], [ 3, -6, -1, 3, 3, -4 ], [ 3, -6, 0, 3, 4, -4 ] ], 1.5 ] - ], - [ - [ [ [ 2, -6, 0, 3, 3, -4 ], [ 3, -6, -1, 3, 4, -4 ], [ 3, -6, -1, 3, 3, -4 ], [ 3, -6, 0, 3, 4, -4 ] ], 1.125 ] - ], - [ - [ [ [ 2, -6, 0, 3, 3, -4 ], [ 4, -6, -2, 3, 3, -4 ], [ 3, -6, -1, 3, 3, -4 ], [ 3, -6, 0, 3, 4, -4 ] ], 1 ] - ], - [ - [ [ [ 2, -6, 0, 3, 3, -4 ], [ 4, -6, -2, 3, 3, -4 ], [ 3, -6, -1, 3, 3, -4 ], [ 3, -6, -2, 4, 3, -4 ] ], 1.625 ], - [ [ [ 2, -6, 0, 3, 3, -4 ], [ 4, -6, -2, 3, 3, -4 ], [ 3, -6, -2, 3, 4, -4 ], [ 3, -6, -2, 4, 3, -4 ] ], 0.625 ], - [ [ [ 2, -6, -2, 4, 3, -4 ], [ 4, -6, -2, 3, 3, -4 ], [ 3, -6, -2, 3, 4, -4 ], [ 3, -6, -2, 4, 3, -4 ] ], 1.625 ] - ], - [ - [ [ [ 2, -6, -2, 4, 3, -4 ], [ 3, -6, -1, 4, 3, -4 ], [ 3, -6, -2, 3, 4, -4 ], [ 3, -6, -2, 4, 3, -4 ] ], 1.375 ], - [ [ [ 2, -6, -2, 4, 3, -4 ], [ 3, -6, -1, 4, 3, -4 ], [ 2, -6, -2, 5, 3, -4 ], [ 3, -6, -2, 4, 3, -4 ] ], 0.5 ], - [ [ [ 1, -6, -2, 4, 3, -3 ], [ 3, -6, -1, 4, 3, -4 ], [ 2, -6, -2, 5, 3, -4 ], [ 3, -6, -2, 4, 3, -4 ] ], 1.625 ] - ], - [ - [ [ [ 1, -6, -2, 4, 3, -3 ], [ 2, -6, -2, 4, 3, -4 ], [ 2, -6, -2, 5, 3, -4 ], [ 3, -6, -2, 4, 3, -4 ] ], 1.125 ], - [ [ [ 1, -6, -2, 4, 3, -3 ], [ 2, -6, -2, 4, 3, -4 ], [ 3, -6, -2, 4, 3, -5 ], [ 3, -6, -2, 4, 3, -4 ] ], 1.125 ] - ], - [ - [ [ [ 1, -6, -2, 4, 3, -3 ], [ 2, -6, -2, 4, 3, -4 ], [ 3, -6, -2, 4, 3, -5 ], [ 3, -7, -2, 4, 3, -3 ] ], 1 ], - [ [ [ 1, -6, -2, 4, 3, -3 ], [ 2, -6, -2, 4, 3, -4 ], [ 1, -6, -2, 4, 3, -2 ], [ 3, -7, -2, 4, 3, -3 ] ], 0.875 ], - [ [ [ 1, -6, -2, 4, 3, -3 ], [ 2, -7, -2, 4, 3, -3 ], [ 1, -6, -2, 4, 3, -2 ], [ 3, -7, -2, 4, 3, -3 ] ], 1.125 ] - ], - [ - [ [ [ 1, -6, -2, 4, 3, -3 ], [ 3, -7, -2, 3, 3, -3 ], [ 1, -6, -2, 4, 3, -2 ], [ 3, -7, -2, 4, 3, -3 ] ], 1.75 ], - [ [ [ 1, -7, -2, 5, 3, -3 ], [ 3, -7, -2, 3, 3, -3 ], [ 1, -6, -2, 4, 3, -2 ], [ 3, -7, -2, 4, 3, -3 ] ], 1.5 ], - [ [ [ 1, -7, -2, 5, 3, -3 ], [ 3, -7, -2, 3, 3, -3 ], [ 2, -7, -2, 4, 4, -3 ], [ 3, -7, -2, 4, 3, -3 ] ], 0.75 ] - ], - [ - [ [ [ 1, -7, -2, 5, 3, -3 ], [ 3, -7, -2, 3, 3, -3 ], [ 2, -6, -2, 4, 3, -3 ], [ 3, -7, -2, 4, 3, -3 ] ], 0.625 ] - ], - [ - [ [ [ 1, -6, -1, 4, 3, -3 ], [ 3, -7, -2, 3, 3, -3 ], [ 2, -6, -2, 4, 3, -3 ], [ 3, -7, -2, 4, 3, -3 ] ], 1.375 ], - [ [ [ 1, -6, -1, 4, 3, -3 ], [ 3, -7, -2, 4, 3, -4 ], [ 2, -6, -2, 4, 3, -3 ], [ 3, -7, -2, 4, 3, -3 ] ], 1.625 ] - ], - [ - [ [ [ 1, -6, -1, 4, 3, -3 ], [ 3, -7, -2, 4, 3, -4 ], [ 2, -6, -1, 4, 3, -4 ], [ 3, -7, -2, 4, 3, -3 ] ], 0.875 ], - [ [ [ 1, -6, -1, 4, 3, -3 ], [ 3, -7, -2, 4, 3, -4 ], [ 2, -6, -1, 4, 3, -4 ], [ 3, -6, -1, 3, 3, -3 ] ], 1.625 ], - [ [ [ 1, -6, -1, 4, 3, -3 ], [ 2, -6, -1, 4, 2, -3 ], [ 2, -6, -1, 4, 3, -4 ], [ 3, -6, -1, 3, 3, -3 ] ], 1.375 ] - ], - [ - [ [ [ 1, -6, -1, 4, 3, -3 ], [ 0, -6, -1, 4, 3, -2 ], [ 2, -6, -1, 4, 3, -4 ], [ 3, -6, -1, 3, 3, -3 ] ], 1.5 ] - ], - [ - [ [ [ 1, -5, -1, 3, 3, -3 ], [ 0, -6, -1, 4, 3, -2 ], [ 2, -6, -1, 4, 3, -4 ], [ 3, -6, -1, 3, 3, -3 ] ], 1.625 ], - [ [ [ 1, -5, -1, 3, 3, -3 ], [ 0, -6, -1, 4, 3, -2 ], [ 3, -6, -1, 3, 3, -4 ], [ 3, -6, -1, 3, 3, -3 ] ], 1.625 ] - ], - [ - [ [ [ 1, -5, -1, 3, 3, -3 ], [ 1, -6, -1, 3, 3, -2 ], [ 3, -6, -1, 3, 3, -4 ], [ 3, -6, -1, 3, 3, -3 ] ], 1.875 ], - [ [ [ 1, -5, -1, 3, 3, -3 ], [ 1, -6, -1, 3, 3, -2 ], [ 1, -6, -1, 4, 3, -3 ], [ 3, -6, -1, 3, 3, -3 ] ], 1.5 ], - [ [ [ 2, -6, -2, 3, 3, -3 ], [ 1, -6, -1, 3, 3, -2 ], [ 1, -6, -1, 4, 3, -3 ], [ 3, -6, -1, 3, 3, -3 ] ], 0.625 ] - ], - [ - [ [ [ 2, -6, -1, 3, 2, -3 ], [ 1, -6, -1, 3, 3, -2 ], [ 1, -6, -1, 4, 3, -3 ], [ 3, -6, -1, 3, 3, -3 ] ], 1 ] - ], - [ - [ [ [ 0, -6, -1, 5, 3, -3 ], [ 1, -6, -1, 3, 3, -2 ], [ 1, -6, -1, 4, 3, -3 ], [ 3, -6, -1, 3, 3, -3 ] ], 1.75 ] - ], - [ - [ [ [ 0, -6, -1, 5, 3, -3 ], [ 1, -6, -1, 3, 3, -2 ], [ 2, -6, -1, 2, 3, -2 ], [ 3, -6, -1, 3, 3, -3 ] ], 0.625 ], - [ [ [ 1, -6, -1, 4, 3, -3 ], [ 1, -6, -1, 3, 3, -2 ], [ 2, -6, -1, 2, 3, -2 ], [ 3, -6, -1, 3, 3, -3 ] ], 0.875 ] - ], - [ - [ [ [ 1, -5, -1, 2, 3, -2 ], [ 1, -6, -1, 3, 3, -2 ], [ 2, -6, -1, 2, 3, -2 ], [ 3, -6, -1, 3, 3, -3 ] ], 0.875 ], - [ [ [ 1, -5, -1, 2, 3, -2 ], [ 1, -6, -1, 3, 3, -2 ], [ 2, -6, -1, 2, 3, -2 ], [ 4, -6, -1, 1, 3, -2 ] ], 1 ] - ], - [ - [ [ [ 3, -6, -1, 1, 2, -2 ], [ 1, -6, -1, 3, 3, -2 ], [ 2, -6, -1, 2, 3, -2 ], [ 4, -6, -1, 1, 3, -2 ] ], 1.375 ], - [ [ [ 3, -6, -1, 1, 2, -2 ], [ 2, -6, -1, 1, 3, -1 ], [ 2, -6, -1, 2, 3, -2 ], [ 4, -6, -1, 1, 3, -2 ] ], 0.5 ], - [ [ [ 3, -6, -1, 1, 2, -2 ], [ 2, -6, -1, 1, 3, -1 ], [ 3, -6, -1, 1, 3, -2 ], [ 4, -6, -1, 1, 3, -2 ] ], 1.5 ] - ], - [ - [ [ [ 3, -6, -1, 1, 2, -2 ], [ 2, -6, -1, 1, 3, -1 ], [ 3, -6, -1, 1, 3, -2 ], [ 3, -6, -1, 2, 3, -2 ] ], 0.625 ], - [ [ [ 3, -6, -2, 1, 3, -2 ], [ 2, -6, -1, 1, 3, -1 ], [ 3, -6, -1, 1, 3, -2 ], [ 3, -6, -1, 2, 3, -2 ] ], 1.75 ] - ], - [ - [ [ [ 3, -6, -2, 1, 3, -2 ], [ 2, -6, -1, 1, 3, -1 ], [ 3, -6, -2, 1, 4, -2 ], [ 3, -6, -1, 2, 3, -2 ] ], 1.25 ], - [ [ [ 3, -6, -2, 1, 3, -2 ], [ 4, -6, -2, 0, 3, -2 ], [ 3, -6, -2, 1, 4, -2 ], [ 3, -6, -1, 2, 3, -2 ] ], 1.625 ], - [ [ [ 3, -6, -2, 1, 3, -2 ], [ 4, -6, -2, 0, 3, -2 ], [ 3, -6, -2, 1, 4, -2 ], [ 5, -6, -2, 1, 3, -3 ] ], 0.875 ] - ], - [ - [ [ [ 3, -6, -2, 1, 3, -2 ], [ 4, -6, -2, 0, 3, -2 ], [ 3, -6, -2, 1, 4, -2 ], [ 4, -6, -2, 1, 3, -2 ] ], 1.125 ], - [ [ [ 3, -7, -2, 0, 3, -2 ], [ 4, -6, -2, 0, 3, -2 ], [ 3, -6, -2, 1, 4, -2 ], [ 4, -6, -2, 1, 3, -2 ] ], 0.375 ] - ], - [ - [ [ [ 3, -7, -2, 0, 3, -2 ], [ 2, -6, -2, 2, 3, -2 ], [ 3, -6, -2, 1, 4, -2 ], [ 4, -6, -2, 1, 3, -2 ] ], 1 ] - ], - [ - [ [ [ 1, -6, -2, 2, 3, -2 ], [ 2, -6, -2, 2, 3, -2 ], [ 3, -6, -2, 1, 4, -2 ], [ 4, -6, -2, 1, 3, -2 ] ], 0.5 ] - ], - [ - [ [ [ 2, -6, -2, 1, 2, -2 ], [ 2, -6, -2, 2, 3, -2 ], [ 3, -6, -2, 1, 4, -2 ], [ 4, -6, -2, 1, 3, -2 ] ], 0.875 ] - ], - [ - [ [ [ 2, -6, -2, 1, 2, -2 ], [ 2, -6, -2, 2, 3, -2 ], [ 3, -6, -2, 1, 4, -2 ], [ 4, -6, -2, 2, 3, -3 ] ], 1.125 ], - [ [ [ 2, -6, -2, 1, 2, -2 ], [ 2, -6, -2, 2, 3, -2 ], [ 3, -6, -2, 1, 3, -2 ], [ 4, -6, -2, 2, 3, -3 ] ], 0.5 ] - ], - [ - [ [ [ 2, -6, -2, 1, 2, -2 ], [ 2, -6, -2, 2, 3, -2 ], [ 4, -6, -2, 1, 1, -2 ], [ 4, -6, -2, 2, 3, -3 ] ], 1 ], - [ [ [ 2, -6, -2, 1, 2, -2 ], [ 3, -6, -2, 1, 3, -2 ], [ 4, -6, -2, 1, 1, -2 ], [ 4, -6, -2, 2, 3, -3 ] ], 1.625 ] - ], - [ - [ [ [ 2, -6, -2, 1, 2, -2 ], [ 3, -6, -2, 1, 3, -2 ], [ 4, -6, -2, 1, 1, -2 ], [ 6, -6, -2, 0, 1, -2 ] ], 1.375 ], - [ [ [ 3, -6, -2, 1, 0, -2 ], [ 3, -6, -2, 1, 3, -2 ], [ 4, -6, -2, 1, 1, -2 ], [ 6, -6, -2, 0, 1, -2 ] ], 1.5 ], - [ [ [ 3, -6, -2, 1, 0, -2 ], [ 3, -5, -2, 1, 1, -2 ], [ 4, -6, -2, 1, 1, -2 ], [ 6, -6, -2, 0, 1, -2 ] ], 0.5 ] - ], - [ - [ [ [ 3, -6, -2, 1, 0, -2 ], [ 5, -6, -2, 0, 0, -2 ], [ 4, -6, -2, 1, 1, -2 ], [ 6, -6, -2, 0, 1, -2 ] ], 1.25 ], - [ [ [ 4, -6, -2, 0, 0, -2 ], [ 5, -6, -2, 0, 0, -2 ], [ 4, -6, -2, 1, 1, -2 ], [ 6, -6, -2, 0, 1, -2 ] ], 0.5 ], - [ [ [ 4, -6, -2, 0, 0, -2 ], [ 5, -6, -2, 0, 0, -2 ], [ 5, -6, -2, 0, 1, -2 ], [ 6, -6, -2, 0, 1, -2 ] ], 0.625 ] - ], - [ - [ [ [ 5, -6, -2, -1, 0, -2 ], [ 5, -6, -2, 0, 0, -2 ], [ 5, -6, -2, 0, 1, -2 ], [ 6, -6, -2, 0, 1, -2 ] ], 1.625 ], - [ [ [ 5, -6, -2, -1, 0, -2 ], [ 5, -6, -2, 0, 0, -2 ], [ 5, -5, -2, 0, 0, -2 ], [ 6, -6, -2, 0, 1, -2 ] ], 1.625 ], - [ [ [ 5, -6, -2, -1, 0, -2 ], [ 5, -6, -2, 0, 0, -2 ], [ 5, -5, -2, 0, 0, -2 ], [ 7, -6, -2, 0, -1, -2 ] ], 1 ] - ], - [ - [ [ [ 5, -6, -2, -1, 0, -2 ], [ 4, -4, -2, 0, 0, -2 ], [ 5, -5, -2, 0, 0, -2 ], [ 7, -6, -2, 0, -1, -2 ] ], 1.625 ] - ], - [ - [ [ [ 5, -6, -2, -1, 0, -2 ], [ 4, -4, -2, 0, 0, -2 ], [ 7, -6, -2, -1, -1, -2 ], [ 7, -6, -2, 0, -1, -2 ] ], 1 ] - ], - [ - [ [ [ 6, -6, -2, -1, -2, -2 ], [ 4, -4, -2, 0, 0, -2 ], [ 7, -6, -2, -1, -1, -2 ], [ 7, -6, -2, 0, -1, -2 ] ], 0.5 ], - [ [ [ 6, -6, -2, -1, -2, -2 ], [ 7, -6, -2, -1, -2, -2 ], [ 7, -6, -2, -1, -1, -2 ], [ 7, -6, -2, 0, -1, -2 ] ], 1.375 ], - [ [ [ 6, -6, -2, -1, -2, -2 ], [ 7, -6, -2, -1, -2, -2 ], [ 7, -6, -2, -1, -1, -2 ], [ 7, -5, -2, -1, -1, -2 ] ], 1.125 ] - ], - [ - [ [ [ 6, -6, -2, -1, -2, -2 ], [ 7, -6, -3, -1, -1, -2 ], [ 7, -6, -2, -1, -1, -2 ], [ 7, -5, -2, -1, -1, -2 ] ], 0.625 ], - [ [ [ 6, -6, -3, -1, -1, -2 ], [ 7, -6, -3, -1, -1, -2 ], [ 7, -6, -2, -1, -1, -2 ], [ 7, -5, -2, -1, -1, -2 ] ], 0.875 ] - ], - [ - [ [ [ 6, -6, -3, -1, -1, -2 ], [ 7, -6, -3, -1, -1, -2 ], [ 7, -6, -2, -1, -1, -2 ], [ 8, -6, -3, -1, -1, -2 ] ], 0.625 ], - [ [ [ 6, -6, -3, -1, -1, -2 ], [ 8, -6, -3, -2, -1, -2 ], [ 7, -6, -2, -1, -1, -2 ], [ 8, -6, -3, -1, -1, -2 ] ], 1.5 ] - ], - [ - [ [ [ 6, -6, -3, -1, -1, -2 ], [ 8, -6, -3, -2, -1, -2 ], [ 7, -6, -2, -1, -1, -2 ], [ 7, -6, -2, 0, -1, -2 ] ], 1.125 ] - ], - [ - [ [ [ 6, -6, -3, -1, -1, -2 ], [ 8, -6, -3, -2, -1, -2 ], [ 7, -6, -2, -1, -1, -2 ], [ 7, -5, -3, -2, -1, -2 ] ], 0.375 ] - ], - [ - [ [ [ 6, -6, -3, -1, -1, -2 ], [ 8, -6, -3, -2, -1, -2 ], [ 7, -6, -2, -1, -1, -2 ], [ 7, -6, -2, -1, -2, -2 ] ], 1.5 ] - ], - [ - [ [ [ 6, -6, -3, -1, -1, -2 ], [ 8, -6, -3, -2, -1, -2 ], [ 7, -6, -2, -1, -1, -2 ], [ 6, -6, -2, -1, -1, -1 ] ], 1.25 ] - ], - [ - [ [ [ 6, -6, -3, -1, -1, -2 ], [ 8, -6, -3, -2, -1, -2 ], [ 7, -6, -2, -1, -1, -2 ], [ 6, -6, -2, 0, -1, -2 ] ], 1.625 ], - [ [ [ 6, -6, -3, -1, -1, -2 ], [ 7, -6, -2, -1, -2, -2 ], [ 7, -6, -2, -1, -1, -2 ], [ 6, -6, -2, 0, -1, -2 ] ], 1.75 ], - [ [ [ 5, -6, -2, 0, -1, -2 ], [ 7, -6, -2, -1, -2, -2 ], [ 7, -6, -2, -1, -1, -2 ], [ 6, -6, -2, 0, -1, -2 ] ], 0.5 ] - ], - [ - [ [ [ 5, -6, -2, 0, -1, -2 ], [ 7, -6, -2, -1, -2, -2 ], [ 7, -5, -2, -1, -2, -2 ], [ 6, -6, -2, 0, -1, -2 ] ], 1.5 ] - ], - [ - [ [ [ 5, -6, -2, 0, -1, -2 ], [ 7, -5, -2, -1, -3, -2 ], [ 7, -5, -2, -1, -2, -2 ], [ 6, -6, -2, 0, -1, -2 ] ], 1.375 ], - [ [ [ 5, -5, -2, 0, -2, -2 ], [ 7, -5, -2, -1, -3, -2 ], [ 7, -5, -2, -1, -2, -2 ], [ 6, -6, -2, 0, -1, -2 ] ], 1.25 ] - ], - [ - [ [ [ 5, -5, -2, 0, -2, -2 ], [ 7, -5, -2, -1, -3, -2 ], [ 8, -5, -2, -1, -4, -2 ], [ 6, -6, -2, 0, -1, -2 ] ], 0.75 ], - [ [ [ 5, -5, -2, 0, -2, -2 ], [ 7, -5, -2, -1, -3, -2 ], [ "Rest" ], [ 6, -6, -2, 0, -1, -2 ] ], 1.25 ], - [ [ [ "Rest" ], [ 7, -5, -2, -1, -3, -2 ], [ "Rest" ], [ 6, -6, -2, 0, -1, -2 ] ], 0.5 ], - [ [ [ "Rest" ], [ "Rest" ], [ "Rest" ], [ 6, -6, -2, 0, -1, -2 ] ], 1.25 ], - [ [ [ "Rest" ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 6.625 ] - ] - ] -], -"last_changes": -[ - [ [ 5, -6, -2, 0, -1, -2 ], [ 7, -6, -2, -1, -2, -2 ], [ 7, -6, -2, -1, -1, -2 ], [ 6, -6, -2, 0, -1, -2 ] ], - [ [ 5, -6, -2, 0, -1, -2 ], [ 7, -6, -2, -1, -2, -2 ], [ 7, -5, -2, -1, -2, -2 ], [ 6, -6, -2, 0, -1, -2 ] ], - [ [ 5, -6, -2, 0, -1, -2 ], [ 7, -5, -2, -1, -3, -2 ], [ 7, -5, -2, -1, -2, -2 ], [ 6, -6, -2, 0, -1, -2 ] ], - [ [ 5, -5, -2, 0, -2, -2 ], [ 7, -5, -2, -1, -3, -2 ], [ 7, -5, -2, -1, -2, -2 ], [ 6, -6, -2, 0, -1, -2 ] ], - [ [ 5, -5, -2, 0, -2, -2 ], [ 7, -5, -2, -1, -3, -2 ], [ 8, -5, -2, -1, -4, -2 ], [ 6, -6, -2, 0, -1, -2 ] ] -], -"cur_uid": "6a9928d6", -"ref_uid": "55f9b81e", -"order_seed": 963124, -"dur_seed": 397683, -"motifs_seed": 845264, -"entrances_probs_vals": [ 0, 0, 0, 0.41, 1.8406593406593, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"passages_probs_vals": [ 0, 0, 0, 0.41, 1.8406593406593, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"exits_probs_vals": [ 0, 0, 0, 0.41, 1.8406593406593, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"ranges": [ [ -2430, -293.49845201238 ], [ -869, 1211.1455108359 ], [ -832.19814241486, 1285 ], [ -702, 1211.1455108359 ] ], -"step_probs_vals": [ -1200, 1200, 0.0020576131687243, 0.068181818181818, 0.074074074074074, 0.0625, 0.20576131687243, 0.0625, 0.45679012345679, 0.011363636363636, 0.53086419753086, 0, 0.54320987654321, 0.92045454545455, 0.58641975308642, 0.92613636363636, 0.61316872427983, 0, 0.98971193415638, 0 ], -"passages_weights": [ 0.48, 0.46, 0.48, 1, 1 ], -"hd_exp": 1.52, -"hd_invert": 0, -"order": -[ - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 3 ], [ 1, 2, 0 ], [ ] ], - [ [ 0 ], [ 2, 3, 1 ], [ ] ], - [ [ 2 ], [ 1, 0, 3 ], [ ] ], - [ [ 3, 1 ], [ 2, 0 ], [ ] ], - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 0 ], [ 2, 1, 3 ], [ ] ], - [ [ 0 ], [ 1, 3, 2 ], [ ] ], - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 2 ], [ 0, 1, 3 ], [ ] ], - [ [ 0, 2, 1 ], [ 3 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 3 ], [ 0, 2, 1 ], [ ] ], - [ [ 0 ], [ 1, 3, 2 ], [ ] ], - [ [ 0, 1 ], [ 3, 2 ], [ ] ], - [ [ 2 ], [ 3, 0, 1 ], [ ] ], - [ [ 0 ], [ 1, 3, 2 ], [ ] ], - [ [ 0 ], [ 1, 3, 2 ], [ ] ], - [ [ 0 ], [ 1, 3, 2 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 1 ], [ 2, 3, 0 ], [ ] ], - [ [ 3, 0 ], [ 2, 1 ], [ ] ], - [ [ 2, 1 ], [ 3, 0 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 1, 0 ], [ 3, 2 ], [ ] ], - [ [ 3 ], [ 0, 1, 2 ], [ ] ], - [ [ 3 ], [ 1, 0, 2 ], [ ] ], - [ [ 0 ], [ 1, 3, 2 ], [ ] ], - [ [ 1, 3 ], [ 2, 0 ], [ ] ], - [ [ 3 ], [ 1, 2, 0 ], [ ] ], - [ [ 3, 0 ], [ 2, 1 ], [ ] ], - [ [ 1 ], [ 3, 2, 0 ], [ ] ], - [ [ 3, 0 ], [ 1, 2 ], [ ] ], - [ [ 1 ], [ 2, 0, 3 ], [ ] ], - [ [ 1 ], [ 0, 3, 2 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 0, 3 ], [ 1, 2 ], [ ] ], - [ [ 0 ], [ 3, 2, 1 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 2, 3 ], [ 0, 1 ], [ ] ], - [ [ 0, 2 ], [ 1, 3 ], [ ] ], - [ [ 3, 1 ], [ 2, 0 ], [ ] ], - [ [ 3, 0 ], [ 2, 1 ], [ ] ], - [ [ 0, 1, 2 ], [ 3 ], [ ] ], - [ [ 1 ], [ 0, 2, 3 ], [ ] ], - [ [ 3 ], [ 2, 1, 0 ], [ ] ], - [ [ 2, 0, 1 ], [ 3 ], [ ] ], - [ [ 2 ], [ 3, 1, 0 ], [ ] ], - [ [ 0, 2 ], [ 3, 1 ], [ ] ], - [ [ 3 ], [ 0, 1, 2 ], [ ] ], - [ [ 2 ], [ 0, 1, 3 ], [ ] ], - [ [ 1, 3, 0 ], [ 2 ], [ ] ], - [ [ 0 ], [ 1, 2, 3 ], [ ] ], - [ [ 3, 1 ], [ 0, 2 ], [ ] ], - [ [ 2 ], [ 3, 0, 1 ], [ ] ], - [ [ 2, 3, 0 ], [ 1 ], [ ] ], - [ [ 1 ], [ 0, 2, 3 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 3, 2, 0 ], [ 1 ], [ ] ], - [ [ 1 ], [ 3, 2, 0 ], [ ] ], - [ [ 3 ], [ 1, 2, 0 ], [ ] ], - [ [ 3, 0 ], [ 1, 2 ], [ ] ], - [ [ 0 ], [ 3, 2, 1 ], [ ] ], - [ [ 3 ], [ 1, 0, 2 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 3, 2 ], [ 0, 1 ], [ ] ], - [ [ 0 ], [ 2, 3, 1 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 1, 3 ], [ 0, 2 ], [ ] ], - [ [ 3 ], [ 1, 2, 0 ], [ ] ], - [ [ 1, 2, 3 ], [ 0 ], [ ] ], - [ [ 3, 2, 1 ], [ 0 ], [ ] ], - [ [ 1, 3 ], [ 2, 0 ], [ ] ], - [ [ 2, 1 ], [ 0, 3 ], [ ] ], - [ [ 3 ], [ 0, 1, 2 ], [ ] ], - [ [ 1, 2 ], [ 3, 0 ], [ ] ], - [ [ 0 ], [ 2, 1, 3 ], [ ] ], - [ [ 1, 2 ], [ 3, 0 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 1, 3, 2 ], [ 0 ], [ ] ], - [ [ 1, 3, 2 ], [ 0 ], [ ] ], - [ [ 1, 0 ], [ 3, 2 ], [ ] ], - [ [ 3, 0 ], [ 2, 1 ], [ ] ], - [ [ 2 ], [ 3, 0, 1 ], [ ] ], - [ [ 3 ], [ 1, 0, 2 ], [ ] ], - [ [ 1 ], [ 0, 2, 3 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 2 ], [ 0, 1, 3 ], [ ] ], - [ [ 3, 2 ], [ 1, 0 ], [ ] ], - [ [ 0, 2 ], [ 3, 1 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 0, 2, 1 ], [ 3 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 2 ], [ 3, 1, 0 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 3, 2 ], [ 1, 0 ], [ ] ], - [ [ 3, 0, 1 ], [ 2 ], [ ] ] -], -"sus_weights": [ 0.35, 0.37, 0.38 ], -"order_size": [ 100, 100 ], -"passages_size": [ 0, 0 ], -"motif_edited": "false", -"order_edited": "false" -} \ No newline at end of file diff --git a/resources/string_quartet_3/6f0f638f/6f0f638f_code.scd b/resources/string_quartet_3/6f0f638f/6f0f638f_code.scd deleted file mode 100644 index c194eef..0000000 --- a/resources/string_quartet_3/6f0f638f/6f0f638f_code.scd +++ /dev/null @@ -1,945 +0,0 @@ -( -// helper funcs -var hsArrayToCents, pDist, hdSum, hsChordalDistance, hsArrayToFreq; - -// score funcs -var isInRange, spacingScore, rangeScore, intervalScore, inclusionScore; - -// subroutines -var genTuples, initVoices, genOrders, genSubMotif, updateVoices, genDurFunc, genStepFunc; - -// primary routines -var genMotif, genSecondarySeq; - -// audition funcs -var genPatterns, genMidiPatterns; - -// resource management funcs -var seedFunc, genUID, writeResources, stringifyToDepth, setSeeds, sanityCheck, -msgInterpret, loadLedgerFile, loadLedgerJSON, loadModelFile, loadModelJSON, -setGlobalVars, globalVarsToDict, saveLedger; - -// model vars -//(model and global vars mostly set by OSC funcs -var seq, lastXChanges, -curUID, refUID, orderSeed, durSeed, motifSeed, -entrancesProbVals, passagesProbVals, exitsProbVals, -ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, -orders, susWeights, orderSize, passagesSize, -motifEdited, orderEdited; - -// model aux vars -var entrancesDurFunc, passagesDurFunc, exitsDurFunc, stepFunc; - -// other global vars -var popSize, exPath, dir, primes, dims, tuples, -group, player, resourceDir, ledgerPath, ledger, currentlyPlayingUID, -nameSpaces; - -// install JSON quark (not used) -/* -if(Quarks.isInstalled("JSONlib").not, { - Quarks.install("https://github.com/musikinformatik/JSONlib.git"); - thisProcess.recompile; - //HelpBrowser.openHelpFor("Classes/JSONlib"); -}); -*/ - - -//------helper funcs - -hsArrayToCents = { - arg hsArray; - hsArray.collect({arg dist, p; dist * 1200 * log2(primes[p][0]/primes[p][1])}).sum -}; - -pDist = { - arg array1, array2, signed = false; - var pDistance; - pDistance = hsArrayToCents.value(array1) - hsArrayToCents.value(array2); - if(signed, {pDistance}, {abs(pDistance)}) -}; - -hdSum = { - arg hsArrays; - var size, distances, mean; - size = hsArrays.size; - distances = (size - 1).collect({arg i; - ((i + 1)..(size - 1)).collect({arg j; - abs(hsArrays[i] - hsArrays[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsChordalDistance = { - arg hsArrays1, hsArrays2; - var size, distances, mean; - size = hsArrays1.size; - distances = hsArrays1.size.collect({arg i; - hsArrays2.size.collect({arg j; - abs(hsArrays1[i] - hsArrays2[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsArrayToFreq = { - arg array; - array.collect({arg dim, d; pow(primes[d][0]/primes[d][1], dim)}).product -}; - -//------score funcs - -/* -isInRange = { - arg hsArray, min, max; - var cents; - cents = hsArrayToCents.value(hsArray); - (cents >= min) && (cents <= max) -}; -*/ - -spacingScore = { - arg hsArrays, min; - var centsArray; - centsArray = hsArrays.collect({arg hsArray; hsArrayToCents.value(hsArray)}).sort({arg a, b; a < b}); - centsArray.differentiate.drop(1).collect({arg pDistance; if(pDistance >= min, {1}, {0.01})}).sum; -}; - -rangeScore = { - arg hsArray1, hsArray2, min, max, low, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - if((pDistance >= min) && (pDistance <= max), {1}, {low}); -}; - -intervalScore = { - arg hsArray1, hsArray2, mean, sd, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - //pDistance.gaussCurve(1, mean, sd) - stepFunc.value(pDistance); -}; - -inclusionScore = { - arg array, test, min = 0.01; - if(array.collect({arg v; v.hash}).includes(test.hash), {min}, {1}); -}; - - -//------subroutines - -genTuples = { - var tuples; - tuples = dims.collect({[-1, 0, 1]}).allTuples.select({arg tuple; (abs(tuple.drop(1)).sum <= 1) && (tuple[0] == 0)}); - tuples = tuples ++ tuples.collect({arg tuple; [-3, -2, -1, 1, 2, 3].collect({arg octTrans; tuple.deepCopy.put(0, octTrans)})}).flatten; -}; - -initVoices = { - var init, voicesInit; - voicesInit = popSize.collect({dims.collect({0})}); - /* - voicesInit = [dims.collect({0})]; - (popSize - 1).do({ - arg rep, new; - rep = dims.rand; - new = voicesInit.last.deepCopy; - new[rep] = new[rep] + [-1, 1].choose(); - voicesInit = voicesInit.add(new); - }); - */ - voicesInit.deepCopy; -}; - -genDurFunc = {arg chordProb, minPad, maxPad, minDur, maxDur, envData, seed; - var env, pTable, durFunc; - env = Env.pairs([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).asSignal(256).asList.asArray; - pTable = env.asRandomTable; - [chordProb, minPad, maxPad, minDur, maxDur, envData].postln; - durFunc = {arg allowChord, pad = false; - var res; - res = if(allowChord.not, { - pTable.tableRand * (maxDur - minDur) + minDur - }, { - if(1.0.rand < chordProb, {0}, {pTable.tableRand * (maxDur - minDur) + minDur}); - }).round(0.125); - if(pad, {res = res + rrand(minPad.asFloat, maxPad.asFloat).round(0.125)}); - if(res.asInteger == res, {res = res.asInteger}); - res - }; - seedFunc.value(durFunc, seed); -}; - -genStepFunc = {arg minStep, maxStep, envData, seed; - var envDataNorm, env, pTable, stepFunc; - [minStep, maxStep, envData].postln; - envDataNorm = ([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).flop; - envDataNorm = [envDataNorm[0].normalize(minStep, maxStep), envDataNorm[1]].flop; - env = Env.pairs(envDataNorm); - stepFunc = {arg pDist; - env.at(pDist).clip(0.001, 1); - }; - seedFunc.value(stepFunc, seed); -}; - -genOrders = {arg minMotifLength = 1, maxMotifLength = 5, minProgLength = 0, maxProgLength = 5; - ((maxMotifLength - minMotifLength).rand + minMotifLength).collect({ - var noProgIns, noSusIns, noSilentIns, prog, sus, silent, order; - noSusIns = [1, 2, 3].wchoose(susWeights.normalizeSum); - noProgIns = (popSize - noSusIns).rand + 1; - noSilentIns = popSize - noSusIns - noProgIns; - - # prog, sus, silent = (0..(popSize-1)).scramble.clumps([noProgIns, noSusIns, noSilentIns]); - - prog = (prog.scramble ++ ((maxProgLength - minProgLength).rand + minProgLength).collect({prog.choose}).scramble); - if(silent == nil, {silent = []}); - [sus.scramble, prog, silent.scramble] - }); -}; - -updateVoices = {arg ins, sus; - var voices, candidates, nWeights, nProbs, sel; - - voices = lastXChanges.deepCopy.last; - - candidates = sus.collect({arg v; tuples.collect({arg t; voices[v] + t})}).flatten; - candidates = difference(candidates.asSet, voices.asSet).asList; - nProbs = candidates.collect({arg candidate; - var stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore; - - //stepScore = intervalScore.value(voices[ins], candidate, 30, 400, 0.1); - stepScore = intervalScore.value(voices[ins], candidate, 100, 100); - recentlySoundedScore = inclusionScore.value(lastXChanges.flop[ins], candidate, 0); - isInRangeScore = rangeScore.value(candidate, candidate.collect({0}), ranges[ins][0], ranges[ins][1], 0, true); - regScore = spacingScore.value(voices.deepCopy.put(ins, candidate), 300); - hdScore = pow(hdSum.value(voices.deepCopy.put(ins, candidate)), hdExp); - if(hdInvert == 0, {hdScore = 1/hdScore}); - //maybe what you want here is a vector to another root and then favoring movement towards it. - //distScore = pow(hsChordalDistance.value(voices, voices.put(ins, candidate)), 2); - - [stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore] - }); - - nWeights = passagesWeights; - - //this handles nWeights of 0; mainly for testing - nProbs = nProbs.flop.select({arg scores, s; nWeights[s] != 0}).flop; - nWeights = nWeights.select({arg weight; weight != 0}); - nProbs = nProbs.flop.collect({arg scores, s; - if(scores.sum == 0, {scores}, {scores.normalizeSum * nWeights[s]}) - }); - nProbs = nProbs.flop.collect({arg scores, s; scores.product}).normalizeSum; - - sel = candidates.wchoose(nProbs); - - voices[ins] = sel; - lastXChanges = lastXChanges.add(voices).keep(-5); -}; - -genSubMotif = {arg order, orderIndex, lastState, repeatLast = false, startFromLast = false, isLastOrder = false; - var sus, prog, silent, flatOrder, res, isInChord, allowChord, pad, lastXChangesHold, voices, adder; - # sus, prog, silent = order; - flatOrder = silent ++ sus ++ prog; - lastXChangesHold = lastXChanges.deepCopy; - voices = lastState.deepCopy; - isInChord = popSize.collect({false}); - allowChord = false; - pad = false; - res = []; - "------generating motif".postln; - //need to figure out here if voices move between motifs - flatOrder.do({arg ins, i; - - if(prog.includes(ins) && repeatLast.not, {updateVoices.value(ins, sus)}); - adder = if(silent.includes(ins), {["Rest"]}, {lastXChanges.last.deepCopy[ins]}); - - if(voices[ins] != adder, { - var dur; - - if((sus ++ silent).includes(ins), { - allowChord = (ins != sus.last); - pad = (ins == sus.last); - }, { - if(i < (flatOrder.size - 1), { - allowChord = (isInChord[flatOrder[i + 1]] || (ins == flatOrder[i + 1])).not; - pad = false; - }, { - allowChord = false; - pad = true - }); - }); - if((orderIndex == 0) && sus.includes(ins), { - dur = entrancesDurFunc.value(allowChord, pad); - }, { - dur = passagesDurFunc.value(allowChord, pad); - }); - if(dur == 0, {isInChord[ins] = true}, {isInChord = popSize.collect({false})}); - - voices[ins] = adder; - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - - // pad ending - if(orderIndex == (orders.size - 1), { - (0..(popSize-1)).scramble.do({arg ins; - if(res.last.first[ins] != ["Rest"], { - var dur; - voices[ins] = ["Rest"]; - allowChord = (voices != popSize.collect({["Rest"]})); - pad = allowChord.not; - dur = exitsDurFunc.value(allowChord, pad); - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - }); - - //format and return - if(startFromLast, {lastXChanges = lastXChangesHold.deepCopy}); - res; -}; - - -//------primary routines - -genMotif = { - var repeats, fSeq, fDur, durAdd; - - repeats = 1; - fSeq = []; - - repeats.do({arg index; - var motif; - - motif = []; - - orders.do({arg order, o; - var lastState, subMotif; - lastState = if(o == 0, {popSize.collect({["Rest"]})}, {motif.last.last.first}); - subMotif = genSubMotif.value(order, o, lastState, isLastOrder: o == (orders.size - 1)); - motif = motif.add(subMotif); - - }); - - sanityCheck.value(motif, index); - - fSeq = fSeq.add(motif); - }); - - //round last duration to measure - fDur = fSeq.flatten.flatten.slice(nil, 1).sum; - durAdd = fDur.round(4) - fDur; - if(durAdd < 0, {durAdd = 4 - durAdd}); - fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] = fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] + durAdd; - - fSeq -}; - -genSecondarySeq = {arg seq; - var curdles, fSeq; - curdles = []; - while({curdles.sum < seq.size}, {curdles = curdles ++ [3.rand + 1]}); - - fSeq = seq.clumps(curdles).collect({arg clump, m; - var repeats, paddedSeq; - - //add rest - paddedSeq = clump.add([[[popSize.collect({["Rest"]}), 0.5.rand]]]); - - //implement repeats - repeats = [0.rand + 1, 1].wchoose([1, 0].normalizeSum); - repeats.collect({paddedSeq}); - }); - fSeq -}; - - -//------audition funcs - -/* -Event.addEventType(\osc, { - if (~addr.postln.notNil) { - ~addr.sendMsg(~indexPath, ~indexMsg); - ~addr.sendMsg(~seqPath, stringifyToDepth.value(~seqMsg, 3)); - //~addr.sendMsg("/STATE/OPEN", (dir.replace("supercollider", "resources") +/+ ~idMsg +/+ ~idMsg ++ "_gui_state" ++ ".state").standardizePath.postln); - }; -}); -*/ - -Event.addEventType(\osc, { - if (~addr.notNil) { - ~msg; - ~addr.sendMsg(~path, *~msg); - }; -}); - -genPatterns = {arg inSeq, addr, oneShot = false; - var voices, durs, pbinds, res, indices, sectionDurs, msg, ids, seq; - seq = inSeq.collect({arg mSeq; mSeq[0]}); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - pbinds = voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs, attacks, rels, amps; - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - //attacks = 2.collect({rrand(1, 3)}) ++ freqs.drop(2).collect({rrand(0.3, 0.5)}); - attacks = fDurs.collect({arg dur; dur * rrand(0.2, 0.4)}); - //rels = freqs.drop(2).collect({rrand(0.3, 0.5)}) ++ 2.collect({rrand(1, 3)}); - rels = (clumps.size - 1).collect({arg c; - if(clumps[c + 1][0] == ["Rest"], {rrand(1.0, 3.0)}, {rrand(0.3, 0.5)}); - }); - rels = rels.add(rrand(1.0, 3.0)); - amps = freqs.collect({rrand(0.6, 0.99)}); - - [ - Pbind( - \instrument, \string_model, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \attack, Pseq(attacks, 1), - \sustain, Pseq(fDurs, 1), - \release, Pseq(rels, 1), - //\amp, Pseq(amps, 1), - \amp, Pbrown(0.5, 1, 0.5), - \busIndex, v - ), - Pbind( - \instrument, \sine, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \sustain, Pseq(fDurs, 1), - \busIndex, v - ) - ] - }).flatten; - if(oneShot.not, { - msg = inSeq.collect({arg mSeq, m; mSeq[1..]}); - //ids = inSeq.collect({arg mSeq, m; mSeq[2]}); - sectionDurs = seq.collect({arg mSeq; mSeq.flatten2(mSeq.maxDepth - 5).flop[1].sum}); - pbinds = pbinds ++ - [ - Pbind( - \type, \osc, - \addr, addr, - \path, "/playing", - \msg, Pseq(msg, 1), - \dur, Pseq(sectionDurs, 1) - ); - ] - }); - res = Ppar(pbinds); - res -}; - -/* -genMidiPatterns = {arg seq; - var voices, durs, patterns, res, mOut, pbRange; - pbRange = 1; //semitones - change this as needed for your situation - mOut = MIDIOut.newByName("TiMidity", "TiMidity port 0").latency_(Server.default.latency); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - res = Ppar( - voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs; - - mOut.program(v, 70); - - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - - Pbind( - \type, \midi, - \chan, v, - \noteval, Pseq(freqs.cpsmidi - 24, 1), - \note, Pfunc({ | event | event[\noteval].floor }), - \dur, Pseq(fDurs, 1), - \midiout, mOut, - \amp, 1, - \bend, Pfunc({ - | event | - if (event[\note].isRest.not) { - var pitchbendvalue = event[\noteval].frac.linlin(0, pbRange, 8192, 8192*2).asInteger; - m.bend(v, pitchbendvalue); - }; - 0; // return something other than nil to avoid stopping the pattern - }), - ); - }); - ); - res -}; -*/ - - -//------resource management funcs - -genUID = {Date.seed.asHexString.toLower}; - -seedFunc = {arg func, seed; - var funcArgs, next; - next = Routine({loop{func.valueArray(funcArgs).yield }}); - next.randSeed_(seed); - {arg ...args; funcArgs = args; next.value} -}; - -stringifyToDepth = {arg data, maxDepth = 1; - var prettyString = "", rCount = 0, writeArray, indent; - - if(maxDepth == 0, { - data.asCompileString - }, { - indent = {arg size; size.collect({" "}).join("")}; - writeArray = {arg array; - prettyString = prettyString ++ indent.value(rCount) ++ "[\n"; - rCount = rCount + 1; - if(rCount < maxDepth, { - array.do({arg subArray; writeArray.value(subArray)}); - }, { - prettyString = prettyString ++ array.collect({arg subArray; - indent.value(rCount + 1) ++ subArray.asCompileString - }).join(",\n"); - }); - rCount = rCount - 1; - prettyString = prettyString ++ "\n" ++ indent.value(rCount) ++ "],\n"; - }; - - writeArray.value(data); - prettyString.replace(",\n\n", "\n").drop(-2); - }) -}; - -sanityCheck = {arg motif, index; - //print functions = very helpful - ("----------" + index + "------------").postln; - - motif.flatten.do({arg val, v; - if(v > 0, { - if(motif.flatten[v-1][0].hammingDistance(val[0]) > 1, {"problem 1".postln}); - if(motif.flatten[v-1][0].hammingDistance(val[0]) == 0, {"problem 2".postln}); - }); - val.postln - }); - "***********".postln; -}; - -msgInterpret = {arg in, escapeDoubleQuotes = true, escapeSingleQuotes = true; - var res; - - res = in; - if(res.isNil.not, { - if((res.isArray && res.isString.not), { - res = res.asCompileString; - res = res.replace(" ", "").replace("\n", "").replace("\t", ""); - if(escapeSingleQuotes, {res = res.replace("\'", "")}); - if(escapeDoubleQuotes, {res = res.replace("\"", "")}); - res = res.replace("Rest", "\"Rest\""); - res = res.interpret; - }, { - var tmpRes; - if(res.every({arg char; char.isDecDigit}), {tmpRes = res.asInteger}); - if(res.contains("."), {tmpRes = res.asFloat}); - if(tmpRes != nil, {res = tmpRes}); - }); - }); - res -}; - -writeResources = {arg path, dict; - var file, modelItems, resString; - file = File(path,"w"); - - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - - resString = nameSpaces.collect({arg nameSpace; - var depth = 0, insert = " "; - if(nameSpace == "music_data", {depth = 3; insert = "\n"}); - if(nameSpace == "last_changes", {depth = 1; insert = "\n"}); - if(nameSpace == "order", {depth = 1; insert = "\n"}); - if((nameSpace == "ref_uid") && (dict[nameSpace] == nil), {dict[nameSpace] = "nil"}); - "\"" ++ nameSpace ++ "\":" ++ insert ++ stringifyToDepth.value(dict[nameSpace], depth) - }).join(",\n"); - - resString = "{\n" ++ resString ++ "\n}"; - - file.write(resString); - file.close; - resString -}; - -loadModelFile = {arg path; loadModelJSON.value(File(path, "r").readAllString.parseJSON)}; - -loadModelJSON = {arg jsonObject; - var dict; - dict = Dictionary.with(*nameSpaces.collect({arg nS; nS->msgInterpret.value(jsonObject[nS])})); - dict -}; - -setGlobalVars = {arg dict, skipLastXChanges = false; - var tmpLastXChanges; - tmpLastXChanges = lastXChanges.deepCopy; - // order really matters!!!! - # seq, lastXChanges, curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited = nameSpaces.collect({arg nS; dict[nS]}); - if(skipLastXChanges, {lastXChanges = tmpLastXChanges}); - dict -}; - -globalVarsToDict = { - var modelItems, dict; - // order really matters!!!! - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - dict = Dictionary.with(*nameSpaces.collect({arg nS, n; nS->modelItems[n]})); -}; - -loadLedgerFile = {arg path; - ledgerPath = path; - resourceDir = path.splitext(".").drop(-1).join; - loadLedgerJSON.value(File(ledgerPath, "r").readAllString.parseJSON) -}; - -loadLedgerJSON = {arg jsonObject; ledger = jsonObject["ledger"]}; - -saveLedger = {arg ledger, path; - var file, curResourceDir; - file = File(path, "w"); - curResourceDir = resourceDir; - resourceDir = path.splitext(".").drop(-1).join; - if(curResourceDir != resourceDir, { - File.mkdir(resourceDir); - ledger.do({arg id; - File.copy(curResourceDir +/+ id, resourceDir +/+ id); - }); - }); - file.write("{\n\"ledger\":\n" ++ stringifyToDepth.value(ledger, 1) ++ "\n}"); - file.close; -}; - -//------global vars - -primes = [[2, 1], [3, 2], [5, 4], [7, 4], [11, 8], [13, 8]]; -//ranges = [[-2400, 0], [-1200, 1200], [0, 2400], [0, 2400]]; -exPath = thisProcess.nowExecutingPath; -dir = exPath.dirname; -//popSize = 4; -dims = primes.size; -tuples = genTuples.value(); -//refUID = nil; -group = Group.new; -~group = group; -loadLedgerFile.value(dir +/+ ".." +/+ "resources" +/+ "piece_ledger.json"); -resourceDir = (dir +/+ ".." +/+ "resources" +/+ "piece_ledger"); -//passagesWeights = [1, 1, 1, 1, 1]; -//susWeights = [1, 1, 1]; -// order really matters!!!! -nameSpaces = [ - "music_data", "last_changes", "cur_uid", "ref_uid", "order_seed", "dur_seed", "motifs_seed", - "entrances_probs_vals","passages_probs_vals", "exits_probs_vals", - "ranges", "step_probs_vals", "passages_weights", "hd_exp", "hd_invert", - "order", "sus_weights", "order_size", "passages_size", - "motif_edited", "order_edited" -]; - - -//------OSC funcs - -OSCdef(\load_ledger, {arg msg, time, addr, port; - loadLedgerFile.value(msg[1].asString); -}, \load_ledger); - -OSCdef(\load_model, {arg msg, time, addr, port; - var dict; - dict = loadModelFile.value(msg[1].asString); - setGlobalVars.value(dict); -}, \load_model); - -OSCdef(\save_ledger, {arg msg, time, addr, port; - msg.postln; - ledger = msgInterpret.value(msg[1].asString.parseJSON["ledger"], false).postln; - //loadLedgerJSON.value(msg[0]) - saveLedger.value(ledger, msg[2].asString); - //loadLedgerFile.value(msg[1].asString); -}, \save_ledger); - -OSCdef(\generate, {arg msg, time, addr, port; - var path, dict, durSeeds, musPath, modelString; - msg.postln; - - path = msg[1].asString; - - dict = loadModelFile.value(path); - setGlobalVars.value(dict, true); - - popSize = ranges.size; - - //refUID.postln; - - loadLedgerFile.value(ledgerPath); - if(ledger == nil, {ledger = ["tmp"]}); - if(ledger.last != "tmp", {ledger = ledger.add("tmp")}); - - if(refUID == nil, {lastXChanges = [initVoices.value().deepCopy]}); - if((refUID != nil) && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - lastXChanges = msgInterpret.value(file.readAllString.parseJSON["last_changes"]); - }); - - refUID.postln; - lastXChanges.collect({arg item; item.postln}); - - durSeeds = seedFunc.value({3.collect({rrand(100000, 999999)})}, durSeed).value.postln; - entrancesDurFunc = genDurFunc.valueArray(entrancesProbVals[..4] ++ [entrancesProbVals[5..]] ++ [durSeeds[0]]); - passagesDurFunc = genDurFunc.valueArray(passagesProbVals[..4] ++ [passagesProbVals[5..]] ++ [durSeeds[1]]); - exitsDurFunc = genDurFunc.valueArray(exitsProbVals[..4] ++ [exitsProbVals[5..]] ++ [durSeeds[2]]); - - if(orders == nil, { - orders = seedFunc.value(genOrders, orderSeed).valueArray(orderSize ++ passagesSize); - //addr.sendMsg("/order", stringifyToDepth.value(orders, 1)); - }); - - stepFunc = genStepFunc.valueArray(stepProbsVals[..1] ++ [stepProbsVals[2..]] ++ [motifSeed]); - seq = seedFunc.value(genMotif, motifSeed).value; - - lastXChanges.collect({arg item; item.postln}); - - dict = globalVarsToDict.value; - modelString = writeResources.value(path, dict); - - //addr.sendMsg("/generated", musPath, stringifyToDepth.value(seq, 3)); - //~seq = seq; - - addr.sendMsg("/generated", path, modelString, ledgerPath); -}, \generate); - - -OSCdef(\commit, {arg msg, time, addr, port; - var musicData, musicChanged, dict, newLedger, modelPath, musString, musFile, test1, test2, lastCurUID, commitType, commitPos, equalityLedger; - //msg.postln; - - /* - test1 = msg[1].asString.parseJSON; - test2 = (dir +/+ ".." +/+ "resources/tmp/tmp_music" ++ ".json").standardizePath.parseJSONFile; - msgInterpret.value(test1["music"])[0][0][0][1].class.postln; - msgInterpret.value(test2["music_data"])[0][0][0][1].class.postln; - (test1["music"] == test2["music_data"]).postln; - */ - - musicData = loadModelJSON.value(msg[1].asString.parseJSON)["music_data"].postln; - musicChanged = (musicData != seq).postln; - commitType = msg[2].asString; - commitPos = msg[3].postln.asInteger; - - lastCurUID = curUID.deepCopy; - curUID = genUID.value; - - File.mkdir((resourceDir +/+ curUID).standardizePath); - File.copy(exPath, (resourceDir +/+ curUID +/+ curUID ++ "_code" ++ ".scd").standardizePath); - - modelPath = (resourceDir +/+ curUID +/+ curUID ++ "_mus_model" ++ ".json").standardizePath; - dict = globalVarsToDict.value; - if(musicChanged, { - seq = musicData; - dict["music_data"] = seq; - dict["motif_edited"] = "true" - }); - dict["cur_uid"] = curUID; - - writeResources.value(modelPath, dict); - - File.delete(ledgerPath ++ "_bak"); - File.copy(ledgerPath, ledgerPath ++ "_bak"); - File.delete(ledgerPath); - - /* - if(commitType == "add", { - if(lastCurUID == "tmp", { - ledger = ledger.drop(-1).add(curUID); - }, { - ledger = ledger.add(curUID); - }) - }); - */ - - ledger.postln; - - if(commitType == "add", {ledger = ledger.add(curUID)}); - - if(commitType == "insert", {ledger = ledger.insert(commitPos + 1, curUID)}); - - if(commitType == "replace", {ledger = ledger.put(commitPos, curUID)}); - - equalityLedger = ledger.collect({arg item; item.asSymbol}); - if(equalityLedger.includes(\tmp).postln, {ledger.removeAt(equalityLedger.indexOf(\tmp).postln)}); - - ledger.postln; - - saveLedger.value(ledger, ledgerPath); - - addr.sendMsg("/committed", curUID, ledgerPath); - //refUID = curUID; - -}, \commit); - -OSCdef(\transport, {arg msg, time, addr, port; - msg.postln; - if(msg[1] == 0, { - group.set(\release, 2); - group.set(\gate, 0); - player.stop; - }, { - // the cued sequence can now be read from file, so this can be cleaned up - var cSize, patterns, pSeq, cuedSeek, indexStart, indexEnd, tmpLedger; - if(msg[1] == 1, { - pSeq = []; - cuedSeek = (seq != nil); - indexStart = msg[2].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.postln.parseJSON["music_data"]), path, indexStart + index, uid]); - file.close; - }); - }); - if(cuedSeek, { - var path, file; - path = (resourceDir +/+ "tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - patterns = genPatterns.value(pSeq, addr); - }, { - pSeq = [loadModelJSON.value(msg[2].asString.parseJSON)["music_data"].postln]; - patterns = genPatterns.value(pSeq, addr, true); - }); - player = Pfset(pattern: patterns, cleanupFunc: { - addr.sendMsg("/transport", 0); - addr.sendMsg("/one_shot", 0); - }); - player = player.play - }); -}, \transport); - - -OSCdef(\transcribe_motif, {arg msg, time, addr, port; - var tSeq, refChord, refUID; - - msg.postln; - - tSeq = [loadModelJSON.value(msg[1].asString.parseJSON)["music_data"]]; - refUID = msg[2].asString.postln; - - if((refUID != "nil") && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }, { - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - }); - - ~transcribe.value(tSeq, refChord, (dir +/+ ".." +/+ "lilypond" +/+ "includes").standardizePath, addr, "/transcribe_motif"); -}, \transcribe_motif); - - -OSCdef(\transcribe_all, {arg msg, time, addr, port; - var cSize, patterns, cuedSeek, indexStart, indexEnd, tmpLedger; - if(true, { - cuedSeek = (seq != nil); - indexStart = msg[1].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - - //tmp for testing transcription - //indexEnd = (indexStart+5); - - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - var lilyPartLedgerFiles; - - lilyPartLedgerFiles = 4.collect({arg p; - File((dir +/+ ".." +/+ "lilypond" +/+ "includes" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly").standardizePath, "w"); - }); - - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file, fileString, tSeq, refUID, refChord; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - fileString = file.readAllString; - tSeq = msgInterpret.value(fileString.parseJSON["music_data"]); - refUID = msgInterpret.value(fileString.parseJSON["ref_uid"]); - file.close; - - //uid.postln; - //(refUID == "nil").postln; - - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - - if(refUID != "nil", { - path = (resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }); - - if(index != indexEnd, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath); - }, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath, addr, "/transcribe_all"); - }); - - lilyPartLedgerFiles.do({arg f, p; - f.write("\\include \"" ++ resourceDir +/+ uid +/+ "lilypond" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly\"\n"); - }); - - }); - - lilyPartLedgerFiles.do({arg f; - f.close - }); - }); - /* - if(cuedSeek, { - var path, file; - path = (dir +/+ ".." +/+ "resources/tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - */ - }, { - - }); - -}, \transcribe_all); - -) - - diff --git a/resources/string_quartet_3/6f0f638f/6f0f638f_mus_model.json b/resources/string_quartet_3/6f0f638f/6f0f638f_mus_model.json deleted file mode 100644 index e65877d..0000000 --- a/resources/string_quartet_3/6f0f638f/6f0f638f_mus_model.json +++ /dev/null @@ -1,105 +0,0 @@ -{ -"music_data": -[ - [ - [ - [ [ [ 0, 0, 0, -1, -1, 0 ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 0 ], - [ [ [ 0, 0, 0, -1, -1, 0 ], [ "Rest" ], [ 1, 0, 0, -1, -1, 1 ], [ "Rest" ] ], 0 ], - [ [ [ 0, 0, 0, -1, -1, 0 ], [ "Rest" ], [ 1, 0, 0, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 2 ] ], 1.25 ], - [ [ [ 0, 0, 0, -1, -1, 0 ], [ 0, 0, 0, -1, -2, 2 ], [ 1, 0, 0, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 2 ] ], 1.5 ], - [ [ [ 0, 0, 0, -1, -1, 0 ], [ 0, -1, 0, -1, -1, 2 ], [ 1, 0, 0, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 2 ] ], 2.625 ] - ], - [ - [ [ [ 0, 0, 0, -1, -1, 0 ], [ "Rest" ], [ 1, 0, 0, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 2 ] ], 0 ], - [ [ [ -1, 0, -1, -1, -1, 2 ], [ "Rest" ], [ 1, 0, 0, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 2 ] ], 0 ], - [ [ [ -1, 0, -1, -1, -1, 2 ], [ "Rest" ], [ 1, -1, 0, -1, -1, 2 ], [ 1, 0, 0, -1, -1, 2 ] ], 1.25 ], - [ [ [ -1, 0, -1, -1, -1, 2 ], [ "Rest" ], [ 1, 0, 0, -1, -2, 2 ], [ 1, 0, 0, -1, -1, 2 ] ], 0.75 ], - [ [ [ -1, 0, -1, -1, -1, 2 ], [ "Rest" ], [ 0, 0, 0, -1, 0, 2 ], [ 1, 0, 0, -1, -1, 2 ] ], 1.5 ] - ], - [ - [ [ [ -1, 0, -1, -1, -1, 2 ], [ "Rest" ], [ 0, 0, 0, -1, 0, 2 ], [ "Rest" ] ], 0 ], - [ [ [ -1, 0, 0, -1, 0, 1 ], [ "Rest" ], [ 0, 0, 0, -1, 0, 2 ], [ "Rest" ] ], 0 ], - [ [ [ -1, 0, 0, -1, 0, 1 ], [ -1, 0, 0, -1, 0, 2 ], [ 0, 0, 0, -1, 0, 2 ], [ "Rest" ] ], 1.125 ], - [ [ [ -2, 0, 1, -1, 0, 2 ], [ -1, 0, 0, -1, 0, 2 ], [ 0, 0, 0, -1, 0, 2 ], [ "Rest" ] ], 2 ], - [ [ [ -1, 0, 0, -2, 0, 2 ], [ -1, 0, 0, -1, 0, 2 ], [ 0, 0, 0, -1, 0, 2 ], [ "Rest" ] ], 0.875 ], - [ [ [ 0, 0, 0, -2, 0, 2 ], [ -1, 0, 0, -1, 0, 2 ], [ 0, 0, 0, -1, 0, 2 ], [ "Rest" ] ], 0 ], - [ [ [ 0, 0, 0, -2, 0, 2 ], [ -1, 0, 1, -1, 0, 2 ], [ 0, 0, 0, -1, 0, 2 ], [ "Rest" ] ], 1.75 ] - ], - [ - [ [ [ 0, 0, 0, -2, 0, 2 ], [ -1, 0, 1, -1, 0, 2 ], [ 0, 0, 0, -1, 0, 2 ], [ 1, 0, 0, -1, -1, 2 ] ], 3 ], - [ [ [ 0, 0, 0, -2, 0, 2 ], [ -1, 0, 1, -1, 0, 2 ], [ 0, 0, 1, -1, -1, 2 ], [ 1, 0, 0, -1, -1, 2 ] ], 0 ], - [ [ [ 0, 0, 0, -2, 0, 2 ], [ 0, 0, -1, -1, -1, 2 ], [ 0, 0, 1, -1, -1, 2 ], [ 1, 0, 0, -1, -1, 2 ] ], 0.875 ], - [ [ [ 0, 0, 0, -2, 0, 2 ], [ -1, 1, 0, -1, -1, 2 ], [ 0, 0, 1, -1, -1, 2 ], [ 1, 0, 0, -1, -1, 2 ] ], 0 ], - [ [ [ 0, 0, 0, -2, 0, 2 ], [ -1, 1, 0, -1, -1, 2 ], [ 1, 0, 0, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 2 ] ], 1.625 ], - [ [ [ 0, 0, 0, -2, 0, 2 ], [ -1, 0, 0, -1, 0, 2 ], [ 1, 0, 0, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 2 ] ], 0 ], - [ [ [ 0, 0, 0, -2, 0, 2 ], [ -1, 0, 0, -1, 0, 2 ], [ 1, 0, 0, -2, -1, 2 ], [ 1, 0, 0, -1, -1, 2 ] ], 1.125 ] - ], - [ - [ [ [ 0, 0, 0, -2, 0, 2 ], [ -1, 0, 0, -1, 0, 2 ], [ -1, 0, 0, -1, 0, 3 ], [ 1, 0, 0, -1, -1, 2 ] ], 0 ], - [ [ [ 0, 0, 0, -1, 0, 1 ], [ -1, 0, 0, -1, 0, 2 ], [ -1, 0, 0, -1, 0, 3 ], [ 1, 0, 0, -1, -1, 2 ] ], 1.125 ], - [ [ [ 0, -1, 0, -1, 0, 2 ], [ -1, 0, 0, -1, 0, 2 ], [ -1, 0, 0, -1, 0, 3 ], [ 1, 0, 0, -1, -1, 2 ] ], 2.5 ] - ], - [ - [ [ [ 0, -1, 0, -1, 0, 2 ], [ -1, 0, 0, -1, 0, 2 ], [ -1, 0, 0, -1, 0, 3 ], [ -1, 0, 1, -1, 0, 3 ] ], 1.125 ], - [ [ [ 0, -1, 0, -1, 0, 2 ], [ -1, 0, 0, -1, 0, 2 ], [ -1, 0, 0, -1, 0, 3 ], [ 1, 0, 0, -2, 0, 2 ] ], 3 ] - ], - [ - [ [ [ 0, -1, 0, -1, 0, 2 ], [ -1, 0, 0, -1, 0, 2 ], [ -1, 0, 0, -1, 0, 3 ], [ "Rest" ] ], 0 ], - [ [ [ 0, -1, 0, -1, 0, 2 ], [ 0, -1, 0, -1, -1, 2 ], [ -1, 0, 0, -1, 0, 3 ], [ "Rest" ] ], 1.375 ], - [ [ [ 0, -1, 0, -1, 0, 2 ], [ 0, -2, 0, -1, 0, 2 ], [ -1, 0, 0, -1, 0, 3 ], [ "Rest" ] ], 2.5 ], - [ [ [ 0, -1, 0, -1, 0, 2 ], [ -1, -1, 1, -1, 0, 2 ], [ -1, 0, 0, -1, 0, 3 ], [ "Rest" ] ], 1 ], - [ [ [ 0, -1, 0, -1, 0, 2 ], [ -2, 0, 0, -1, 0, 3 ], [ -1, 0, 0, -1, 0, 3 ], [ "Rest" ] ], 2.125 ], - [ [ [ 0, -1, 0, -1, 0, 2 ], [ 0, -1, 0, -2, 0, 2 ], [ -1, 0, 0, -1, 0, 3 ], [ "Rest" ] ], 1.375 ] - ], - [ - [ [ [ -2, 1, 0, -1, 0, 3 ], [ 0, -1, 0, -2, 0, 2 ], [ -1, 0, 0, -1, 0, 3 ], [ "Rest" ] ], 1.625 ], - [ [ [ -2, 1, 0, -1, 0, 3 ], [ 0, -1, 0, -2, 0, 2 ], [ -1, 0, 0, -1, 0, 3 ], [ 0, -1, 0, -1, 0, 3 ] ], 0.5 ], - [ [ [ -2, 1, 0, -1, 0, 3 ], [ -1, 0, 1, -1, 0, 3 ], [ -1, 0, 0, -1, 0, 3 ], [ 0, -1, 0, -1, 0, 3 ] ], 0 ], - [ [ [ -2, 1, 0, -1, 0, 3 ], [ -1, 0, 1, -1, 0, 3 ], [ -1, 0, 0, -1, 0, 3 ], [ 0, 0, 0, -1, -1, 3 ] ], 2.5 ], - [ [ [ -2, 1, 0, -1, 0, 3 ], [ 0, -1, 0, -1, 0, 3 ], [ -1, 0, 0, -1, 0, 3 ], [ 0, 0, 0, -1, -1, 3 ] ], 0 ], - [ [ [ -2, 0, 0, -1, 1, 3 ], [ 0, -1, 0, -1, 0, 3 ], [ -1, 0, 0, -1, 0, 3 ], [ 0, 0, 0, -1, -1, 3 ] ], 1.125 ], - [ [ [ -2, 0, 0, -1, 1, 3 ], [ 0, -1, 0, -1, 0, 3 ], [ -1, 0, 0, -1, 0, 3 ], [ "Rest" ] ], 0 ], - [ [ [ -2, 0, 0, -1, 1, 3 ], [ "Rest" ], [ -1, 0, 0, -1, 0, 3 ], [ "Rest" ] ], 0 ], - [ [ [ "Rest" ], [ "Rest" ], [ -1, 0, 0, -1, 0, 3 ], [ "Rest" ] ], 0 ], - [ [ [ "Rest" ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 0.875 ] - ] - ] -], -"last_changes": -[ - [ [ -2, 1, 0, -1, 0, 3 ], [ 0, -1, 0, -2, 0, 2 ], [ -1, 0, 0, -1, 0, 3 ], [ 0, -1, 0, -1, 0, 3 ] ], - [ [ -2, 1, 0, -1, 0, 3 ], [ -1, 0, 1, -1, 0, 3 ], [ -1, 0, 0, -1, 0, 3 ], [ 0, -1, 0, -1, 0, 3 ] ], - [ [ -2, 1, 0, -1, 0, 3 ], [ -1, 0, 1, -1, 0, 3 ], [ -1, 0, 0, -1, 0, 3 ], [ 0, 0, 0, -1, -1, 3 ] ], - [ [ -2, 1, 0, -1, 0, 3 ], [ 0, -1, 0, -1, 0, 3 ], [ -1, 0, 0, -1, 0, 3 ], [ 0, 0, 0, -1, -1, 3 ] ], - [ [ -2, 0, 0, -1, 1, 3 ], [ 0, -1, 0, -1, 0, 3 ], [ -1, 0, 0, -1, 0, 3 ], [ 0, 0, 0, -1, -1, 3 ] ] -], -"cur_uid": "6f0f638f", -"ref_uid": "781442dc", -"order_seed": 778672, -"dur_seed": 554838, -"motifs_seed": 420644, -"entrances_probs_vals": [ 0.76, 0, 0, 0.38461538461538, 3.08, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"passages_probs_vals": [ 0.76, 0, 0, 0.38461538461538, 3.08, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"exits_probs_vals": [ 0.76, 0, 0, 0.38461538461538, 3.08, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"ranges": [ [ -1984, 932.50773993808 ], [ -999, 951.08359133127 ], [ -15, 1043.9628482972 ], [ 78, 1081.1145510836 ] ], -"step_probs_vals": [ 0, 1200, 0, 0, 0.076131687242798, 0.91477272727273, 0.17489711934156, 0, 0.57818930041152, 0, 1, 0 ], -"passages_weights": [ 1, 1, 1, 1, 1 ], -"hd_exp": 2, -"hd_invert": 0, -"order": -[ - [ [ 0, 2, 3 ], [ 1, 1 ], [ ] ], - [ [ 3 ], [ 0, 2, 2, 2 ], [ 1 ] ], - [ [ 2 ], [ 0, 1, 0, 0, 0, 1 ], [ 3 ] ], - [ [ 0, 3 ], [ 2, 1, 1, 2, 1, 2 ], [ ] ], - [ [ 1, 3 ], [ 2, 0, 0 ], [ ] ], - [ [ 2, 1, 0 ], [ 3, 3 ], [ ] ], - [ [ 2, 0 ], [ 1, 1, 1, 1, 1 ], [ 3 ] ], - [ [ 2 ], [ 0, 3, 1, 3, 1, 0 ], [ ] ] -], -"sus_weights": [ 1, 1, 1 ], -"order_size": [ 5, 10 ], -"passages_size": [ 0, 5 ], -"motif_edited": "false", -"order_edited": "false" -} \ No newline at end of file diff --git a/resources/string_quartet_3/726a40c7/726a40c7_code.scd b/resources/string_quartet_3/726a40c7/726a40c7_code.scd deleted file mode 100644 index f822edb..0000000 --- a/resources/string_quartet_3/726a40c7/726a40c7_code.scd +++ /dev/null @@ -1,946 +0,0 @@ -( -// helper funcs -var hsArrayToCents, pDist, hdSum, hsChordalDistance, hsArrayToFreq; - -// score funcs -var isInRange, spacingScore, rangeScore, intervalScore, inclusionScore; - -// subroutines -var genTuples, initVoices, genOrders, genSubMotif, updateVoices, genDurFunc, genStepFunc; - -// primary routines -var genMotif, genSecondarySeq; - -// audition funcs -var genPatterns, genMidiPatterns; - -// resource management funcs -var seedFunc, genUID, writeResources, stringifyToDepth, setSeeds, sanityCheck, -msgInterpret, loadLedgerFile, loadLedgerJSON, loadModelFile, loadModelJSON, -setGlobalVars, globalVarsToDict, saveLedger; - -// model vars -//(model and global vars mostly set by OSC funcs -var seq, lastXChanges, -curUID, refUID, orderSeed, durSeed, motifSeed, -entrancesProbVals, passagesProbVals, exitsProbVals, -ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, -orders, susWeights, orderSize, passagesSize, -motifEdited, orderEdited; - -// model aux vars -var entrancesDurFunc, passagesDurFunc, exitsDurFunc, stepFunc; - -// other global vars -var popSize, exPath, dir, primes, dims, tuples, -group, player, resourceDir, ledgerPath, ledger, currentlyPlayingUID, -nameSpaces; - -// install JSON quark (not used) -/* -if(Quarks.isInstalled("JSONlib").not, { - Quarks.install("https://github.com/musikinformatik/JSONlib.git"); - thisProcess.recompile; - //HelpBrowser.openHelpFor("Classes/JSONlib"); -}); -*/ - - -//------helper funcs - -hsArrayToCents = { - arg hsArray; - hsArray.collect({arg dist, p; dist * 1200 * log2(primes[p][0]/primes[p][1])}).sum -}; - -pDist = { - arg array1, array2, signed = false; - var pDistance; - pDistance = hsArrayToCents.value(array1) - hsArrayToCents.value(array2); - if(signed, {pDistance}, {abs(pDistance)}) -}; - -hdSum = { - arg hsArrays; - var size, distances, mean; - size = hsArrays.size; - distances = (size - 1).collect({arg i; - ((i + 1)..(size - 1)).collect({arg j; - abs(hsArrays[i] - hsArrays[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsChordalDistance = { - arg hsArrays1, hsArrays2; - var size, distances, mean; - size = hsArrays1.size; - distances = hsArrays1.size.collect({arg i; - hsArrays2.size.collect({arg j; - abs(hsArrays1[i] - hsArrays2[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsArrayToFreq = { - arg array; - array.collect({arg dim, d; pow(primes[d][0]/primes[d][1], dim)}).product -}; - -//------score funcs - -/* -isInRange = { - arg hsArray, min, max; - var cents; - cents = hsArrayToCents.value(hsArray); - (cents >= min) && (cents <= max) -}; -*/ - -spacingScore = { - arg hsArrays, min; - var centsArray; - centsArray = hsArrays.collect({arg hsArray; hsArrayToCents.value(hsArray)}).sort({arg a, b; a < b}); - centsArray.differentiate.drop(1).collect({arg pDistance; if(pDistance >= min, {1}, {0.01})}).sum; -}; - -rangeScore = { - arg hsArray1, hsArray2, min, max, low, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - if((pDistance >= min) && (pDistance <= max), {1}, {low}); -}; - -intervalScore = { - arg hsArray1, hsArray2, mean, sd, signed = true; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - //pDistance.gaussCurve(1, mean, sd) - if(pDistance < 0, {stepFunc.value(abs(pDistance))}, {0.001}); - //stepFunc.value(pDistance) -}; - -inclusionScore = { - arg array, test, min = 0.01; - if(array.collect({arg v; v.hash}).includes(test.hash), {min}, {1}); -}; - - -//------subroutines - -genTuples = { - var tuples; - tuples = dims.collect({[-1, 0, 1]}).allTuples.select({arg tuple; (abs(tuple.drop(1)).sum <= 1) && (tuple[0] == 0)}); - tuples = tuples ++ tuples.collect({arg tuple; [-3, -2, -1, 1, 2, 3].collect({arg octTrans; tuple.deepCopy.put(0, octTrans)})}).flatten; -}; - -initVoices = { - var init, voicesInit; - voicesInit = popSize.collect({dims.collect({0})}); - /* - voicesInit = [dims.collect({0})]; - (popSize - 1).do({ - arg rep, new; - rep = dims.rand; - new = voicesInit.last.deepCopy; - new[rep] = new[rep] + [-1, 1].choose(); - voicesInit = voicesInit.add(new); - }); - */ - voicesInit.deepCopy; -}; - -genDurFunc = {arg chordProb, minPad, maxPad, minDur, maxDur, envData, seed; - var env, pTable, durFunc; - env = Env.pairs([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).asSignal(256).asList.asArray; - pTable = env.asRandomTable; - [chordProb, minPad, maxPad, minDur, maxDur, envData].postln; - durFunc = {arg allowChord, pad = false; - var res; - res = if(allowChord.not, { - pTable.tableRand * (maxDur - minDur) + minDur - }, { - if(1.0.rand < chordProb, {0}, {pTable.tableRand * (maxDur - minDur) + minDur}); - }).round(0.125); - if(pad, {res = res + rrand(minPad.asFloat, maxPad.asFloat).round(0.125)}); - if(res.asInteger == res, {res = res.asInteger}); - res - }; - seedFunc.value(durFunc, seed); -}; - -genStepFunc = {arg minStep, maxStep, envData, seed; - var envDataNorm, env, pTable, stepFunc; - [minStep, maxStep, envData].postln; - envDataNorm = ([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).flop; - envDataNorm = [envDataNorm[0].normalize(minStep, maxStep), envDataNorm[1]].flop; - env = Env.pairs(envDataNorm); - stepFunc = {arg pDist; - env.at(pDist).clip(0.001, 1); - }; - seedFunc.value(stepFunc, seed); -}; - -genOrders = {arg minMotifLength = 1, maxMotifLength = 5, minProgLength = 0, maxProgLength = 5; - ((maxMotifLength - minMotifLength).rand + minMotifLength).collect({ - var noProgIns, noSusIns, noSilentIns, prog, sus, silent, order; - noSusIns = [1, 2, 3].wchoose(susWeights.normalizeSum); - noProgIns = (popSize - noSusIns).rand + 1; - noSilentIns = popSize - noSusIns - noProgIns; - - # prog, sus, silent = (0..(popSize-1)).scramble.clumps([noProgIns, noSusIns, noSilentIns]); - - prog = (prog.scramble ++ ((maxProgLength - minProgLength).rand + minProgLength).collect({prog.choose}).scramble); - if(silent == nil, {silent = []}); - [sus.scramble, prog, silent.scramble] - }); -}; - -updateVoices = {arg ins, sus; - var voices, candidates, nWeights, nProbs, sel; - - voices = lastXChanges.deepCopy.last; - - candidates = sus.collect({arg v; tuples.collect({arg t; voices[v] + t})}).flatten; - candidates = difference(candidates.asSet, voices.asSet).asList; - nProbs = candidates.collect({arg candidate; - var stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore; - - //stepScore = intervalScore.value(voices[ins], candidate, 30, 400, 0.1); - stepScore = intervalScore.value(voices[ins], candidate, 100, 100); - recentlySoundedScore = inclusionScore.value(lastXChanges.flop[ins], candidate, 0); - isInRangeScore = rangeScore.value(candidate, candidate.collect({0}), ranges[ins][0], ranges[ins][1], 0, true); - regScore = spacingScore.value(voices.deepCopy.put(ins, candidate), 300); - hdScore = pow(hdSum.value(voices.deepCopy.put(ins, candidate)), hdExp); - if(hdInvert == 0, {hdScore = 1/hdScore}); - //maybe what you want here is a vector to another root and then favoring movement towards it. - //distScore = pow(hsChordalDistance.value(voices, voices.put(ins, candidate)), 2); - - [stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore] - }); - - nWeights = passagesWeights; - - //this handles nWeights of 0; mainly for testing - nProbs = nProbs.flop.select({arg scores, s; nWeights[s] != 0}).flop; - nWeights = nWeights.select({arg weight; weight != 0}); - nProbs = nProbs.flop.collect({arg scores, s; - if(scores.sum == 0, {scores}, {scores.normalizeSum * nWeights[s]}) - }); - nProbs = nProbs.flop.collect({arg scores, s; scores.product}).normalizeSum; - - sel = candidates.wchoose(nProbs); - - voices[ins] = sel; - lastXChanges = lastXChanges.add(voices).keep(-5); -}; - -genSubMotif = {arg order, orderIndex, lastState, repeatLast = false, startFromLast = false, isLastOrder = false; - var sus, prog, silent, flatOrder, res, isInChord, allowChord, pad, lastXChangesHold, voices, adder; - # sus, prog, silent = order; - flatOrder = silent ++ sus ++ prog; - lastXChangesHold = lastXChanges.deepCopy; - voices = lastState.deepCopy; - isInChord = popSize.collect({false}); - allowChord = false; - pad = false; - res = []; - "------generating motif".postln; - //need to figure out here if voices move between motifs - flatOrder.do({arg ins, i; - - if(prog.includes(ins) && repeatLast.not, {updateVoices.value(ins, sus)}); - adder = if(silent.includes(ins), {["Rest"]}, {lastXChanges.last.deepCopy[ins]}); - - if(voices[ins] != adder, { - var dur; - - if((sus ++ silent).includes(ins), { - allowChord = (ins != sus.last); - pad = (ins == sus.last); - }, { - if(i < (flatOrder.size - 1), { - allowChord = (isInChord[flatOrder[i + 1]] || (ins == flatOrder[i + 1])).not; - pad = false; - }, { - allowChord = false; - pad = true - }); - }); - if((orderIndex == 0) && sus.includes(ins), { - dur = entrancesDurFunc.value(allowChord, pad); - }, { - dur = passagesDurFunc.value(allowChord, pad); - }); - if(dur == 0, {isInChord[ins] = true}, {isInChord = popSize.collect({false})}); - - voices[ins] = adder; - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - - // pad ending - if(orderIndex == (orders.size - 1), { - (0..(popSize-1)).scramble.do({arg ins; - if(res.last.first[ins] != ["Rest"], { - var dur; - voices[ins] = ["Rest"]; - allowChord = (voices != popSize.collect({["Rest"]})); - pad = allowChord.not; - dur = exitsDurFunc.value(allowChord, pad); - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - }); - - //format and return - if(startFromLast, {lastXChanges = lastXChangesHold.deepCopy}); - res; -}; - - -//------primary routines - -genMotif = { - var repeats, fSeq, fDur, durAdd; - - repeats = 1; - fSeq = []; - - repeats.do({arg index; - var motif; - - motif = []; - - orders.do({arg order, o; - var lastState, subMotif; - lastState = if(o == 0, {popSize.collect({["Rest"]})}, {motif.last.last.first}); - subMotif = genSubMotif.value(order, o, lastState, isLastOrder: o == (orders.size - 1)); - motif = motif.add(subMotif); - - }); - - sanityCheck.value(motif, index); - - fSeq = fSeq.add(motif); - }); - - //round last duration to measure - fDur = fSeq.flatten.flatten.slice(nil, 1).sum; - durAdd = fDur.round(4) - fDur; - if(durAdd < 0, {durAdd = 4 - durAdd}); - fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] = fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] + durAdd; - - fSeq -}; - -genSecondarySeq = {arg seq; - var curdles, fSeq; - curdles = []; - while({curdles.sum < seq.size}, {curdles = curdles ++ [3.rand + 1]}); - - fSeq = seq.clumps(curdles).collect({arg clump, m; - var repeats, paddedSeq; - - //add rest - paddedSeq = clump.add([[[popSize.collect({["Rest"]}), 0.5.rand]]]); - - //implement repeats - repeats = [0.rand + 1, 1].wchoose([1, 0].normalizeSum); - repeats.collect({paddedSeq}); - }); - fSeq -}; - - -//------audition funcs - -/* -Event.addEventType(\osc, { - if (~addr.postln.notNil) { - ~addr.sendMsg(~indexPath, ~indexMsg); - ~addr.sendMsg(~seqPath, stringifyToDepth.value(~seqMsg, 3)); - //~addr.sendMsg("/STATE/OPEN", (dir.replace("supercollider", "resources") +/+ ~idMsg +/+ ~idMsg ++ "_gui_state" ++ ".state").standardizePath.postln); - }; -}); -*/ - -Event.addEventType(\osc, { - if (~addr.notNil) { - ~msg; - ~addr.sendMsg(~path, *~msg); - }; -}); - -genPatterns = {arg inSeq, addr, oneShot = false; - var voices, durs, pbinds, res, indices, sectionDurs, msg, ids, seq; - seq = inSeq.collect({arg mSeq; mSeq[0]}); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - pbinds = voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs, attacks, rels, amps; - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - //attacks = 2.collect({rrand(1, 3)}) ++ freqs.drop(2).collect({rrand(0.3, 0.5)}); - attacks = fDurs.collect({arg dur; dur * rrand(0.2, 0.4)}); - //rels = freqs.drop(2).collect({rrand(0.3, 0.5)}) ++ 2.collect({rrand(1, 3)}); - rels = (clumps.size - 1).collect({arg c; - if(clumps[c + 1][0] == ["Rest"], {rrand(1.0, 3.0)}, {rrand(0.3, 0.5)}); - }); - rels = rels.add(rrand(1.0, 3.0)); - amps = freqs.collect({rrand(0.6, 0.99)}); - - [ - Pbind( - \instrument, \string_model, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \attack, Pseq(attacks, 1), - \sustain, Pseq(fDurs, 1), - \release, Pseq(rels, 1), - //\amp, Pseq(amps, 1), - \amp, Pbrown(0.5, 1, 0.5), - \busIndex, v - ), - Pbind( - \instrument, \sine, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \sustain, Pseq(fDurs, 1), - \busIndex, v - ) - ] - }).flatten; - if(oneShot.not, { - msg = inSeq.collect({arg mSeq, m; mSeq[1..]}); - //ids = inSeq.collect({arg mSeq, m; mSeq[2]}); - sectionDurs = seq.collect({arg mSeq; mSeq.flatten2(mSeq.maxDepth - 5).flop[1].sum}); - pbinds = pbinds ++ - [ - Pbind( - \type, \osc, - \addr, addr, - \path, "/playing", - \msg, Pseq(msg, 1), - \dur, Pseq(sectionDurs, 1) - ); - ] - }); - res = Ppar(pbinds); - res -}; - -/* -genMidiPatterns = {arg seq; - var voices, durs, patterns, res, mOut, pbRange; - pbRange = 1; //semitones - change this as needed for your situation - mOut = MIDIOut.newByName("TiMidity", "TiMidity port 0").latency_(Server.default.latency); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - res = Ppar( - voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs; - - mOut.program(v, 70); - - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - - Pbind( - \type, \midi, - \chan, v, - \noteval, Pseq(freqs.cpsmidi - 24, 1), - \note, Pfunc({ | event | event[\noteval].floor }), - \dur, Pseq(fDurs, 1), - \midiout, mOut, - \amp, 1, - \bend, Pfunc({ - | event | - if (event[\note].isRest.not) { - var pitchbendvalue = event[\noteval].frac.linlin(0, pbRange, 8192, 8192*2).asInteger; - m.bend(v, pitchbendvalue); - }; - 0; // return something other than nil to avoid stopping the pattern - }), - ); - }); - ); - res -}; -*/ - - -//------resource management funcs - -genUID = {Date.seed.asHexString.toLower}; - -seedFunc = {arg func, seed; - var funcArgs, next; - next = Routine({loop{func.valueArray(funcArgs).yield }}); - next.randSeed_(seed); - {arg ...args; funcArgs = args; next.value} -}; - -stringifyToDepth = {arg data, maxDepth = 1; - var prettyString = "", rCount = 0, writeArray, indent; - - if(maxDepth == 0, { - data.asCompileString - }, { - indent = {arg size; size.collect({" "}).join("")}; - writeArray = {arg array; - prettyString = prettyString ++ indent.value(rCount) ++ "[\n"; - rCount = rCount + 1; - if(rCount < maxDepth, { - array.do({arg subArray; writeArray.value(subArray)}); - }, { - prettyString = prettyString ++ array.collect({arg subArray; - indent.value(rCount + 1) ++ subArray.asCompileString - }).join(",\n"); - }); - rCount = rCount - 1; - prettyString = prettyString ++ "\n" ++ indent.value(rCount) ++ "],\n"; - }; - - writeArray.value(data); - prettyString.replace(",\n\n", "\n").drop(-2); - }) -}; - -sanityCheck = {arg motif, index; - //print functions = very helpful - ("----------" + index + "------------").postln; - - motif.flatten.do({arg val, v; - if(v > 0, { - if(motif.flatten[v-1][0].hammingDistance(val[0]) > 1, {"problem 1".postln}); - if(motif.flatten[v-1][0].hammingDistance(val[0]) == 0, {"problem 2".postln}); - }); - val.postln - }); - "***********".postln; -}; - -msgInterpret = {arg in, escapeDoubleQuotes = true, escapeSingleQuotes = true; - var res; - - res = in; - if(res.isNil.not, { - if((res.isArray && res.isString.not), { - res = res.asCompileString; - res = res.replace(" ", "").replace("\n", "").replace("\t", ""); - if(escapeSingleQuotes, {res = res.replace("\'", "")}); - if(escapeDoubleQuotes, {res = res.replace("\"", "")}); - res = res.replace("Rest", "\"Rest\""); - res = res.interpret; - }, { - var tmpRes; - if(res.every({arg char; char.isDecDigit}), {tmpRes = res.asInteger}); - if(res.contains("."), {tmpRes = res.asFloat}); - if(tmpRes != nil, {res = tmpRes}); - }); - }); - res -}; - -writeResources = {arg path, dict; - var file, modelItems, resString; - file = File(path,"w"); - - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - - resString = nameSpaces.collect({arg nameSpace; - var depth = 0, insert = " "; - if(nameSpace == "music_data", {depth = 3; insert = "\n"}); - if(nameSpace == "last_changes", {depth = 1; insert = "\n"}); - if(nameSpace == "order", {depth = 1; insert = "\n"}); - if((nameSpace == "ref_uid") && (dict[nameSpace] == nil), {dict[nameSpace] = "nil"}); - "\"" ++ nameSpace ++ "\":" ++ insert ++ stringifyToDepth.value(dict[nameSpace], depth) - }).join(",\n"); - - resString = "{\n" ++ resString ++ "\n}"; - - file.write(resString); - file.close; - resString -}; - -loadModelFile = {arg path; loadModelJSON.value(File(path, "r").readAllString.parseJSON)}; - -loadModelJSON = {arg jsonObject; - var dict; - dict = Dictionary.with(*nameSpaces.collect({arg nS; nS->msgInterpret.value(jsonObject[nS])})); - dict -}; - -setGlobalVars = {arg dict, skipLastXChanges = false; - var tmpLastXChanges; - tmpLastXChanges = lastXChanges.deepCopy; - // order really matters!!!! - # seq, lastXChanges, curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited = nameSpaces.collect({arg nS; dict[nS]}); - if(skipLastXChanges, {lastXChanges = tmpLastXChanges}); - dict -}; - -globalVarsToDict = { - var modelItems, dict; - // order really matters!!!! - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - dict = Dictionary.with(*nameSpaces.collect({arg nS, n; nS->modelItems[n]})); -}; - -loadLedgerFile = {arg path; - ledgerPath = path; - resourceDir = path.splitext(".").drop(-1).join; - loadLedgerJSON.value(File(ledgerPath, "r").readAllString.parseJSON) -}; - -loadLedgerJSON = {arg jsonObject; ledger = jsonObject["ledger"]}; - -saveLedger = {arg ledger, path; - var file, curResourceDir; - file = File(path, "w"); - curResourceDir = resourceDir; - resourceDir = path.splitext(".").drop(-1).join; - if(curResourceDir != resourceDir, { - File.mkdir(resourceDir); - ledger.do({arg id; - File.copy(curResourceDir +/+ id, resourceDir +/+ id); - }); - }); - file.write("{\n\"ledger\":\n" ++ stringifyToDepth.value(ledger, 1) ++ "\n}"); - file.close; -}; - -//------global vars - -primes = [[2, 1], [3, 2], [5, 4], [7, 4], [11, 8], [13, 8]]; -//ranges = [[-2400, 0], [-1200, 1200], [0, 2400], [0, 2400]]; -exPath = thisProcess.nowExecutingPath; -dir = exPath.dirname; -//popSize = 4; -dims = primes.size; -tuples = genTuples.value(); -//refUID = nil; -group = Group.new; -~group = group; -loadLedgerFile.value(dir +/+ ".." +/+ "resources" +/+ "piece_ledger.json"); -resourceDir = (dir +/+ ".." +/+ "resources" +/+ "piece_ledger"); -//passagesWeights = [1, 1, 1, 1, 1]; -//susWeights = [1, 1, 1]; -// order really matters!!!! -nameSpaces = [ - "music_data", "last_changes", "cur_uid", "ref_uid", "order_seed", "dur_seed", "motifs_seed", - "entrances_probs_vals","passages_probs_vals", "exits_probs_vals", - "ranges", "step_probs_vals", "passages_weights", "hd_exp", "hd_invert", - "order", "sus_weights", "order_size", "passages_size", - "motif_edited", "order_edited" -]; - - -//------OSC funcs - -OSCdef(\load_ledger, {arg msg, time, addr, port; - loadLedgerFile.value(msg[1].asString); -}, \load_ledger); - -OSCdef(\load_model, {arg msg, time, addr, port; - var dict; - dict = loadModelFile.value(msg[1].asString); - setGlobalVars.value(dict); -}, \load_model); - -OSCdef(\save_ledger, {arg msg, time, addr, port; - msg.postln; - ledger = msgInterpret.value(msg[1].asString.parseJSON["ledger"], false).postln; - //loadLedgerJSON.value(msg[0]) - saveLedger.value(ledger, msg[2].asString); - //loadLedgerFile.value(msg[1].asString); -}, \save_ledger); - -OSCdef(\generate, {arg msg, time, addr, port; - var path, dict, durSeeds, musPath, modelString; - msg.postln; - - path = msg[1].asString; - - dict = loadModelFile.value(path); - setGlobalVars.value(dict, true); - - popSize = ranges.size; - - //refUID.postln; - - loadLedgerFile.value(ledgerPath); - if(ledger == nil, {ledger = ["tmp"]}); - if(ledger.last != "tmp", {ledger = ledger.add("tmp")}); - - if(refUID == nil, {lastXChanges = [initVoices.value().deepCopy]}); - if((refUID != nil) && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - lastXChanges = msgInterpret.value(file.readAllString.parseJSON["last_changes"]); - }); - - refUID.postln; - lastXChanges.collect({arg item; item.postln}); - - durSeeds = seedFunc.value({3.collect({rrand(100000, 999999)})}, durSeed).value.postln; - entrancesDurFunc = genDurFunc.valueArray(entrancesProbVals[..4] ++ [entrancesProbVals[5..]] ++ [durSeeds[0]]); - passagesDurFunc = genDurFunc.valueArray(passagesProbVals[..4] ++ [passagesProbVals[5..]] ++ [durSeeds[1]]); - exitsDurFunc = genDurFunc.valueArray(exitsProbVals[..4] ++ [exitsProbVals[5..]] ++ [durSeeds[2]]); - - if(orders == nil, { - orders = seedFunc.value(genOrders, orderSeed).valueArray(orderSize ++ passagesSize); - //addr.sendMsg("/order", stringifyToDepth.value(orders, 1)); - }); - - stepFunc = genStepFunc.valueArray(stepProbsVals[..1] ++ [stepProbsVals[2..]] ++ [motifSeed]); - seq = seedFunc.value(genMotif, motifSeed).value; - - lastXChanges.collect({arg item; item.postln}); - - dict = globalVarsToDict.value; - modelString = writeResources.value(path, dict); - - //addr.sendMsg("/generated", musPath, stringifyToDepth.value(seq, 3)); - //~seq = seq; - - addr.sendMsg("/generated", path, modelString, ledgerPath); -}, \generate); - - -OSCdef(\commit, {arg msg, time, addr, port; - var musicData, musicChanged, dict, newLedger, modelPath, musString, musFile, test1, test2, lastCurUID, commitType, commitPos, equalityLedger; - //msg.postln; - - /* - test1 = msg[1].asString.parseJSON; - test2 = (dir +/+ ".." +/+ "resources/tmp/tmp_music" ++ ".json").standardizePath.parseJSONFile; - msgInterpret.value(test1["music"])[0][0][0][1].class.postln; - msgInterpret.value(test2["music_data"])[0][0][0][1].class.postln; - (test1["music"] == test2["music_data"]).postln; - */ - - musicData = loadModelJSON.value(msg[1].asString.parseJSON)["music_data"].postln; - musicChanged = (musicData != seq).postln; - commitType = msg[2].asString; - commitPos = msg[3].postln.asInteger; - - lastCurUID = curUID.deepCopy; - curUID = genUID.value; - - File.mkdir((resourceDir +/+ curUID).standardizePath); - File.copy(exPath, (resourceDir +/+ curUID +/+ curUID ++ "_code" ++ ".scd").standardizePath); - - modelPath = (resourceDir +/+ curUID +/+ curUID ++ "_mus_model" ++ ".json").standardizePath; - dict = globalVarsToDict.value; - if(musicChanged, { - seq = musicData; - dict["music_data"] = seq; - dict["motif_edited"] = "true" - }); - dict["cur_uid"] = curUID; - - writeResources.value(modelPath, dict); - - File.delete(ledgerPath ++ "_bak"); - File.copy(ledgerPath, ledgerPath ++ "_bak"); - File.delete(ledgerPath); - - /* - if(commitType == "add", { - if(lastCurUID == "tmp", { - ledger = ledger.drop(-1).add(curUID); - }, { - ledger = ledger.add(curUID); - }) - }); - */ - - ledger.postln; - - if(commitType == "add", {ledger = ledger.add(curUID)}); - - if(commitType == "insert", {ledger = ledger.insert(commitPos + 1, curUID)}); - - if(commitType == "replace", {ledger = ledger.put(commitPos, curUID)}); - - equalityLedger = ledger.collect({arg item; item.asSymbol}); - if(equalityLedger.includes(\tmp).postln, {ledger.removeAt(equalityLedger.indexOf(\tmp).postln)}); - - ledger.postln; - - saveLedger.value(ledger, ledgerPath); - - addr.sendMsg("/committed", curUID, ledgerPath); - //refUID = curUID; - -}, \commit); - -OSCdef(\transport, {arg msg, time, addr, port; - msg.postln; - if(msg[1] == 0, { - group.set(\release, 2); - group.set(\gate, 0); - player.stop; - }, { - // the cued sequence can now be read from file, so this can be cleaned up - var cSize, patterns, pSeq, cuedSeek, indexStart, indexEnd, tmpLedger; - if(msg[1] == 1, { - pSeq = []; - cuedSeek = (seq != nil); - indexStart = msg[2].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.postln.parseJSON["music_data"]), path, indexStart + index, uid]); - file.close; - }); - }); - if(cuedSeek, { - var path, file; - path = (resourceDir +/+ "tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - patterns = genPatterns.value(pSeq, addr); - }, { - pSeq = [loadModelJSON.value(msg[2].asString.parseJSON)["music_data"].postln]; - patterns = genPatterns.value(pSeq, addr, true); - }); - player = Pfset(pattern: patterns, cleanupFunc: { - addr.sendMsg("/transport", 0); - addr.sendMsg("/one_shot", 0); - }); - player = player.play - }); -}, \transport); - - -OSCdef(\transcribe_motif, {arg msg, time, addr, port; - var tSeq, refChord, refUID; - - msg.postln; - - tSeq = [loadModelJSON.value(msg[1].asString.parseJSON)["music_data"]]; - refUID = msg[2].asString.postln; - - if((refUID != "nil") && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }, { - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - }); - - ~transcribe.value(tSeq, refChord, (dir +/+ ".." +/+ "lilypond" +/+ "includes").standardizePath, addr, "/transcribe_motif"); -}, \transcribe_motif); - - -OSCdef(\transcribe_all, {arg msg, time, addr, port; - var cSize, patterns, cuedSeek, indexStart, indexEnd, tmpLedger; - if(true, { - cuedSeek = (seq != nil); - indexStart = msg[1].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - - //tmp for testing transcription - //indexEnd = (indexStart+5); - - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - var lilyPartLedgerFiles; - - lilyPartLedgerFiles = 4.collect({arg p; - File((dir +/+ ".." +/+ "lilypond" +/+ "includes" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly").standardizePath, "w"); - }); - - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file, fileString, tSeq, refUID, refChord; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - fileString = file.readAllString; - tSeq = msgInterpret.value(fileString.parseJSON["music_data"]); - refUID = msgInterpret.value(fileString.parseJSON["ref_uid"]); - file.close; - - //uid.postln; - //(refUID == "nil").postln; - - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - - if(refUID != "nil", { - path = (resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }); - - if(index != indexEnd, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath); - }, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath, addr, "/transcribe_all"); - }); - - lilyPartLedgerFiles.do({arg f, p; - f.write("\\include \"" ++ resourceDir +/+ uid +/+ "lilypond" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly\"\n"); - }); - - }); - - lilyPartLedgerFiles.do({arg f; - f.close - }); - }); - /* - if(cuedSeek, { - var path, file; - path = (dir +/+ ".." +/+ "resources/tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - */ - }, { - - }); - -}, \transcribe_all); - -) - - diff --git a/resources/string_quartet_3/726a40c7/726a40c7_mus_model.json b/resources/string_quartet_3/726a40c7/726a40c7_mus_model.json deleted file mode 100644 index 06e11db..0000000 --- a/resources/string_quartet_3/726a40c7/726a40c7_mus_model.json +++ /dev/null @@ -1,163 +0,0 @@ -{ -"music_data": -[ - [ - [ - [ [ [ "Rest" ], [ 0, -1, 0, 2, 1, -2 ], [ "Rest" ], [ "Rest" ] ], 0.5 ], - [ [ [ -1, 0, 1, 2, 0, -2 ], [ 0, -1, 0, 2, 1, -2 ], [ "Rest" ], [ "Rest" ] ], 0.625 ], - [ [ [ -1, 0, 1, 2, 0, -2 ], [ 0, -1, 0, 2, 1, -2 ], [ -1, -1, 0, 3, 1, -2 ], [ "Rest" ] ], 0.25 ], - [ [ [ -1, 0, 1, 2, 0, -2 ], [ 0, -1, 0, 2, 1, -2 ], [ -1, -1, 0, 3, 1, -2 ], [ -1, -1, 0, 3, 1, -1 ] ], 0.875 ] - ], - [ - [ [ [ 0, -1, 0, 2, 0, -2 ], [ 0, -1, 0, 2, 1, -2 ], [ -1, -1, 0, 3, 1, -2 ], [ -1, -1, 0, 3, 1, -1 ] ], 1 ] - ], - [ - [ [ [ 0, -1, 0, 2, 0, -2 ], [ 0, -1, 0, 2, 1, -2 ], [ -2, -1, 1, 3, 1, -1 ], [ -1, -1, 0, 3, 1, -1 ] ], 0.375 ] - ], - [ - [ [ [ 0, -1, 0, 2, 0, -2 ], [ 0, -1, 0, 2, 1, -2 ], [ -2, -1, 1, 3, 1, -1 ], [ -2, -1, 1, 3, 1, 0 ] ], 0.625 ] - ], - [ - [ [ [ 0, -1, 0, 2, 0, -2 ], [ 0, -1, 0, 2, 1, -2 ], [ -2, -1, 1, 3, 1, -1 ], [ 1, -1, 0, 2, 0, -2 ] ], 1.125 ] - ], - [ - [ [ [ 0, -1, 0, 2, 0, -2 ], [ 0, -1, 0, 2, 1, -2 ], [ -2, -1, 1, 3, 1, -1 ], [ 0, 0, 0, 2, 1, -2 ] ], 0.125 ] - ], - [ - [ [ [ 0, -1, 0, 2, 0, -2 ], [ 0, -1, 0, 2, 1, -2 ], [ -2, -1, 1, 3, 1, -1 ], [ 0, -1, 0, 2, 1, -1 ] ], 0.75 ] - ], - [ - [ [ [ -1, 0, 0, 2, 1, -2 ], [ 0, -1, 0, 2, 1, -2 ], [ -2, -1, 1, 3, 1, -1 ], [ 0, -1, 0, 2, 1, -1 ] ], 0.625 ] - ], - [ - [ [ [ -1, 0, 0, 2, 1, -2 ], [ 0, -2, 0, 2, 1, -1 ], [ -2, -1, 1, 3, 1, -1 ], [ 0, -1, 0, 2, 1, -1 ] ], 0.875 ] - ], - [ - [ [ [ -1, 0, 0, 2, 1, -2 ], [ 0, -2, 0, 2, 1, -1 ], [ -2, -1, 1, 3, 1, -1 ], [ 1, -2, -1, 2, 1, -1 ] ], 1.125 ] - ], - [ - [ [ [ -1, 0, 0, 2, 1, -2 ], [ 0, -2, 0, 2, 1, -1 ], [ -1, 0, 1, 2, 1, -2 ], [ 1, -2, -1, 2, 1, -1 ] ], 0.375 ] - ], - [ - [ [ [ -1, 0, 0, 2, 1, -2 ], [ 0, -2, 0, 2, 1, -1 ], [ -1, 0, 1, 2, 1, -2 ], [ 1, 0, 0, 2, 1, -3 ] ], 0.875 ] - ], - [ - [ [ [ -1, 0, 0, 2, 1, -2 ], [ 0, -2, 0, 2, 1, -1 ], [ -1, 0, 1, 2, 1, -2 ], [ 0, 0, 1, 2, 1, -2 ] ], 0.5 ] - ], - [ - [ [ [ 0, -2, 0, 2, 0, -1 ], [ 0, -2, 0, 2, 1, -1 ], [ -1, 0, 1, 2, 1, -2 ], [ 0, 0, 1, 2, 1, -2 ] ], 0.75 ] - ], - [ - [ [ [ 0, -2, 0, 2, 0, -1 ], [ 0, 0, 1, 2, 1, -3 ], [ -1, 0, 1, 2, 1, -2 ], [ 0, 0, 1, 2, 1, -2 ] ], 1.125 ] - ], - [ - [ [ [ -2, 0, 1, 3, 1, -2 ], [ 0, 0, 1, 2, 1, -3 ], [ -1, 0, 1, 2, 1, -2 ], [ 0, 0, 1, 2, 1, -2 ] ], 0.625 ] - ], - [ - [ [ [ -2, 0, 1, 3, 1, -2 ], [ -1, 0, 1, 3, 0, -2 ], [ -1, 0, 1, 2, 1, -2 ], [ 0, 0, 1, 2, 1, -2 ] ], 0.5 ] - ], - [ - [ [ [ -2, 0, 1, 3, 1, -2 ], [ -1, 0, 1, 3, 0, -2 ], [ -1, 0, 0, 3, 0, -2 ], [ 0, 0, 1, 2, 1, -2 ] ], 1.125 ] - ], - [ - [ [ [ -2, 0, 1, 3, 1, -2 ], [ -2, 1, 1, 3, 1, -2 ], [ -1, 0, 0, 3, 0, -2 ], [ 0, 0, 1, 2, 1, -2 ] ], 0.125 ] - ], - [ - [ [ [ -2, 0, 1, 3, 1, -2 ], [ -2, 1, 1, 3, 1, -2 ], [ -2, 1, 0, 3, 1, -2 ], [ 0, 0, 1, 2, 1, -2 ] ], 0.125 ] - ], - [ - [ [ [ -3, 1, 0, 4, 1, -2 ], [ -2, 1, 1, 3, 1, -2 ], [ -2, 1, 0, 3, 1, -2 ], [ 0, 0, 1, 2, 1, -2 ] ], 0.25 ] - ], - [ - [ [ [ -3, 2, 1, 3, 1, -2 ], [ -2, 1, 1, 3, 1, -2 ], [ -2, 1, 0, 3, 1, -2 ], [ 0, 0, 1, 2, 1, -2 ] ], 0.5 ] - ], - [ - [ [ [ -2, 0, 2, 2, 1, -2 ], [ -2, 1, 1, 3, 1, -2 ], [ -2, 1, 0, 3, 1, -2 ], [ 0, 0, 1, 2, 1, -2 ] ], 0.875 ] - ], - [ - [ [ [ -2, 0, 2, 2, 1, -2 ], [ -2, 1, 1, 3, 1, -2 ], [ -2, 1, 0, 3, 1, -2 ], [ -1, 1, 0, 3, 1, -2 ] ], 0.75 ] - ], - [ - [ [ [ -2, 1, 0, 3, 1, -3 ], [ -2, 1, 1, 3, 1, -2 ], [ -2, 1, 0, 3, 1, -2 ], [ -1, 1, 0, 3, 1, -2 ] ], 0 ] - ], - [ - [ [ [ -3, 1, 1, 3, 1, -2 ], [ -2, 1, 1, 3, 1, -2 ], [ -2, 1, 0, 3, 1, -2 ], [ -1, 1, 0, 3, 1, -2 ] ], 0.5 ] - ], - [ - [ [ [ -2, 0, 0, 3, 1, -2 ], [ -2, 1, 1, 3, 1, -2 ], [ -2, 1, 0, 3, 1, -2 ], [ -1, 1, 0, 3, 1, -2 ] ], 0.75 ] - ], - [ - [ [ [ -2, 0, 0, 3, 1, -2 ], [ -2, 1, 1, 3, 1, -2 ], [ -1, 0, -1, 3, 1, -2 ], [ -1, 1, 0, 3, 1, -2 ] ], 0.875 ] - ], - [ - [ [ [ -2, 0, 0, 3, 1, -2 ], [ -2, 1, 1, 3, 1, -2 ], [ -1, 0, -1, 3, 1, -2 ], [ -2, 1, 1, 3, 1, -1 ] ], 0.75 ] - ], - [ - [ [ [ -2, 0, 0, 3, 1, -2 ], [ -2, 1, 1, 3, 1, -2 ], [ -3, 1, 1, 4, 1, -2 ], [ -2, 1, 1, 3, 1, -1 ] ], 0.125 ], - [ [ [ -2, 0, 0, 3, 1, -2 ], [ -2, 1, 1, 3, 1, -2 ], [ -3, 1, 1, 4, 1, -2 ], [ "Rest" ] ], 1 ], - [ [ [ -2, 0, 0, 3, 1, -2 ], [ "Rest" ], [ -3, 1, 1, 4, 1, -2 ], [ "Rest" ] ], 0.875 ], - [ [ [ "Rest" ], [ "Rest" ], [ -3, 1, 1, 4, 1, -2 ], [ "Rest" ] ], 0 ], - [ [ [ "Rest" ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 1.75 ] - ] - ] -], -"last_changes": -[ - [ [ -3, 1, 1, 3, 1, -2 ], [ -2, 1, 1, 3, 1, -2 ], [ -2, 1, 0, 3, 1, -2 ], [ -1, 1, 0, 3, 1, -2 ] ], - [ [ -2, 0, 0, 3, 1, -2 ], [ -2, 1, 1, 3, 1, -2 ], [ -2, 1, 0, 3, 1, -2 ], [ -1, 1, 0, 3, 1, -2 ] ], - [ [ -2, 0, 0, 3, 1, -2 ], [ -2, 1, 1, 3, 1, -2 ], [ -1, 0, -1, 3, 1, -2 ], [ -1, 1, 0, 3, 1, -2 ] ], - [ [ -2, 0, 0, 3, 1, -2 ], [ -2, 1, 1, 3, 1, -2 ], [ -1, 0, -1, 3, 1, -2 ], [ -2, 1, 1, 3, 1, -1 ] ], - [ [ -2, 0, 0, 3, 1, -2 ], [ -2, 1, 1, 3, 1, -2 ], [ -3, 1, 1, 4, 1, -2 ], [ -2, 1, 1, 3, 1, -1 ] ] -], -"cur_uid": "726a40c7", -"ref_uid": "5ec14635", -"order_seed": 439818, -"dur_seed": 544932, -"motifs_seed": 109123, -"entrances_probs_vals": [ 0, 0, 0, 0, 1.2087912087912, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"passages_probs_vals": [ 0, 0, 0, 0, 1.2087912087912, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"exits_probs_vals": [ 0, 0, 0, 0, 1.2087912087912, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"ranges": [ [ -2170, 338 ], [ -2373.9938080495, 1453 ], [ -1650, 1676 ], [ -1370.8978328173, 1694 ] ], -"step_probs_vals": [ 0, 1200, 0, 0, 0.063786008230453, 0.92613636363636, 0.12757201646091, 0, 0.54732510288066, 0, 0.71604938271605, 0, 1, 0 ], -"passages_weights": [ 1, 0, 0.2, 0.74, 0.68 ], -"hd_exp": 2, -"hd_invert": 0, -"order": -[ - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 0, 1, 2 ], [ 3 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 2, 0, 1 ], [ 3 ], [ ] ], - [ [ 2, 0, 1 ], [ 3 ], [ ] ], - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 1, 3, 0 ], [ 2 ], [ ] ], - [ [ 2, 0, 1 ], [ 3 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 1, 3, 2 ], [ 0 ], [ ] ], - [ [ 2, 0, 3 ], [ 1 ], [ ] ], - [ [ 1, 3, 2 ], [ 0 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 2, 1, 3 ], [ 0 ], [ ] ], - [ [ 3, 2, 1 ], [ 0 ], [ ] ], - [ [ 1, 2, 3 ], [ 0 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ] -], -"sus_weights": [ 0, 0, 0.61 ], -"order_size": [ 30, 30 ], -"passages_size": [ 0, 0 ], -"motif_edited": "false", -"order_edited": "false" -} \ No newline at end of file diff --git a/resources/string_quartet_3/75316bf0/75316bf0_code.scd b/resources/string_quartet_3/75316bf0/75316bf0_code.scd deleted file mode 100644 index 49436ca..0000000 --- a/resources/string_quartet_3/75316bf0/75316bf0_code.scd +++ /dev/null @@ -1,973 +0,0 @@ -( -// helper funcs -var hsArrayToCents, pDist, hdSum, hsChordalDistance, hsArrayToFreq; - -// score funcs -var isInRange, spacingScore, rangeScore, intervalScore, inclusionScore; - -// subroutines -var genTuples, initVoices, genOrders, genSubMotif, updateVoices, genDurFunc, genStepFunc; - -// primary routines -var genMotif, genSecondarySeq; - -// audition funcs -var genPatterns, genMidiPatterns; - -// resource management funcs -var seedFunc, genUID, writeResources, stringifyToDepth, setSeeds, sanityCheck, -msgInterpret, loadLedgerFile, loadLedgerJSON, loadModelFile, loadModelJSON, -setGlobalVars, globalVarsToDict, saveLedger; - -// model vars -//(model and global vars mostly set by OSC funcs -var seq, lastXChanges, -curUID, refUID, orderSeed, durSeed, motifSeed, -entrancesProbVals, passagesProbVals, exitsProbVals, -ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, -orders, susWeights, orderSize, passagesSize, -motifEdited, orderEdited; - -// model aux vars -var entrancesDurFunc, passagesDurFunc, exitsDurFunc, stepFunc; - -// other global vars -var popSize, exPath, dir, primes, dims, tuples, -group, player, resourceDir, ledgerPath, ledger, currentlyPlayingUID, -nameSpaces; - -// install JSON quark (not used) -/* -if(Quarks.isInstalled("JSONlib").not, { - Quarks.install("https://github.com/musikinformatik/JSONlib.git"); - thisProcess.recompile; - //HelpBrowser.openHelpFor("Classes/JSONlib"); -}); -*/ - - -//------helper funcs - -hsArrayToCents = { - arg hsArray; - hsArray.collect({arg dist, p; dist * 1200 * log2(primes[p][0]/primes[p][1])}).sum -}; - -pDist = { - arg array1, array2, signed = false; - var pDistance; - pDistance = hsArrayToCents.value(array2) - hsArrayToCents.value(array1); - if(signed, {pDistance}, {abs(pDistance)}) -}; - -hdSum = { - arg hsArrays; - var size, distances, mean; - size = hsArrays.size; - distances = (size - 1).collect({arg i; - ((i + 1)..(size - 1)).collect({arg j; - abs(hsArrays[i] - hsArrays[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsChordalDistance = { - arg hsArrays1, hsArrays2; - var size, distances, mean; - size = hsArrays1.size; - distances = hsArrays1.size.collect({arg i; - hsArrays2.size.collect({arg j; - abs(hsArrays1[i] - hsArrays2[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsArrayToFreq = { - arg array; - array.collect({arg dim, d; pow(primes[d][0]/primes[d][1], dim)}).product -}; - -//------score funcs - -/* -isInRange = { - arg hsArray, min, max; - var cents; - cents = hsArrayToCents.value(hsArray); - (cents >= min) && (cents <= max) -}; -*/ - -spacingScore = { - arg hsArrays, min; - var centsArray; - centsArray = hsArrays.collect({arg hsArray; hsArrayToCents.value(hsArray)}).sort({arg a, b; a < b}); - centsArray.differentiate.drop(1).collect({arg pDistance; if(pDistance >= min, {1}, {0.01})}).sum; -}; - -rangeScore = { - arg hsArray1, hsArray2, min, max, low, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - if((pDistance >= min) && (pDistance <= max), {1}, {low}); -}; - -/* -intervalScore = { - arg hsArray1, hsArray2, mean, sd, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - //pDistance.gaussCurve(1, mean, sd) - stepFunc.value(pDistance) -}; -*/ - -intervalScore = { - arg hsArray1, hsArray2, mean, sd, signed = true; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - //pDistance.gaussCurve(1, mean, sd) - //if(pDistance >= 0, {stepFunc.value(abs(pDistance))}, {0.01}); - stepFunc.value(pDistance) -}; - -inclusionScore = { - arg array, test, min = 0.01; - if(array.collect({arg v; v.hash}).includes(test.hash), {min}, {1}); -}; - - -//------subroutines - -genTuples = { - var tuples; - tuples = dims.collect({[-1, 0, 1]}).allTuples.select({arg tuple; (abs(tuple.drop(1)).sum <= 1) && (tuple[0] == 0)}); - //tuples = dims.collect({[0, 1]}).allTuples.select({arg tuple; (abs(tuple.drop(1)).sum <= 1) && (tuple[0] == 0)}); - tuples = tuples ++ tuples.collect({arg tuple; [-3, -2, -1, 1, 2, 3].collect({arg octTrans; tuple.deepCopy.put(0, octTrans)})}).flatten; -}; - -initVoices = { - var init, voicesInit; - voicesInit = popSize.collect({dims.collect({0})}); - /* - voicesInit = [dims.collect({0})]; - (popSize - 1).do({ - arg rep, new; - rep = dims.rand; - new = voicesInit.last.deepCopy; - new[rep] = new[rep] + [-1, 1].choose(); - voicesInit = voicesInit.add(new); - }); - */ - voicesInit.deepCopy; -}; - -genDurFunc = {arg chordProb, minPad, maxPad, minDur, maxDur, envData, seed; - var env, pTable, durFunc; - env = Env.pairs([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).asSignal(256).asList.asArray; - pTable = env.asRandomTable; - [chordProb, minPad, maxPad, minDur, maxDur, envData].postln; - durFunc = {arg allowChord, pad = false; - var res; - res = if(allowChord.not, { - pTable.tableRand * (maxDur - minDur) + minDur - }, { - if(1.0.rand < chordProb, {0}, {pTable.tableRand * (maxDur - minDur) + minDur}); - }).round(0.125); - if(pad, {res = res + rrand(minPad.asFloat, maxPad.asFloat).round(0.125)}); - if(res.asInteger == res, {res = res.asInteger}); - res - }; - seedFunc.value(durFunc, seed); -}; - -genStepFunc = {arg minStep, maxStep, envData, seed; - var envDataNorm, env, pTable, stepFunc; - [minStep, maxStep, envData].postln; - envDataNorm = ([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).flop; - envDataNorm = [envDataNorm[0].normalize(minStep, maxStep), envDataNorm[1]].flop; - env = Env.pairs(envDataNorm); - stepFunc = {arg pDist; - env.at(pDist).clip(0.001, 1); - }; - seedFunc.value(stepFunc, seed); -}; - -genOrders = {arg minMotifLength = 1, maxMotifLength = 5, minProgLength = 0, maxProgLength = 5; - ((maxMotifLength.asInteger - minMotifLength.asInteger).rand + minMotifLength.asInteger).collect({ - var noProgIns, noSusIns, noSilentIns, prog, sus, silent, order; - noSusIns = [1, 2, 3].wchoose(susWeights.normalizeSum); - //noProgIns = (popSize - noSusIns).rand + 1; - noProgIns = (popSize - noSusIns); - noSilentIns = popSize - noSusIns - noProgIns; - - # prog, sus, silent = (0..(popSize-1)).scramble.clumps([noProgIns, noSusIns, noSilentIns]); - - prog = (prog.scramble ++ ((maxProgLength.asInteger - minProgLength.asInteger).rand + minProgLength.asInteger).collect({prog.choose}).scramble); - if(silent == nil, {silent = []}); - [sus.scramble, prog, silent.scramble] - }); -}; - -updateVoices = {arg ins, sus; - var voices, candidates, nWeights, nProbs, sel; - - voices = lastXChanges.deepCopy.last; - - candidates = sus.collect({arg v; tuples.collect({arg t; voices[v] + t})}).flatten; - candidates = difference(candidates.asSet, voices.asSet).asList; - nProbs = candidates.collect({arg candidate; - var stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore; - - //stepScore = intervalScore.value(voices[ins], candidate, 30, 400, 0.1); - stepScore = intervalScore.value(voices[ins], candidate, 100, 100); - recentlySoundedScore = inclusionScore.value(lastXChanges.flop[ins], candidate, 0.01); - - - - if(rangeScore.value(candidate.collect({0}), voices[ins], ranges[ins][1] - 500, ranges[ins][1], 0, true) == 1, { - isInRangeScore = 1 - rangeScore.value(candidate.collect({0}), candidate, ranges[ins][0] + 500, ranges[ins][1] - 500, 0, true); - isInRangeScore = isInRangeScore * rangeScore.value(candidate.collect({0}), candidate, ranges[ins][0], ranges[ins][1], 0, true) - }, { - isInRangeScore = rangeScore.value(candidate.collect({0}), candidate, ranges[ins][0], ranges[ins][1], 0, true); - }); - - - //isInRangeScore = rangeScore.value(candidate.collect({0}), candidate, ranges[ins][0], ranges[ins][1], 0, true); - //old way - worked but actually by accident (I think) - //isInRangeScore = rangeScore.value(candidate, candidate.collect({0}), ranges[ins][0], ranges[ins][1], 0, true); - - - regScore = spacingScore.value(voices.deepCopy.put(ins, candidate), 300); - hdScore = pow(hdSum.value(voices.deepCopy.put(ins, candidate)), hdExp); - if(hdInvert == 0, {hdScore = 1/hdScore}); - //maybe what you want here is a vector to another root and then favoring movement towards it. - //distScore = pow(hsChordalDistance.value(voices, voices.put(ins, candidate)), 2); - - [stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore] - }); - - nWeights = passagesWeights; - - //this handles nWeights of 0; mainly for testing - nProbs = nProbs.flop.select({arg scores, s; nWeights[s] != 0}).flop; - nWeights = nWeights.select({arg weight; weight != 0}); - nProbs = nProbs.flop.collect({arg scores, s; - if(scores.sum == 0, {scores}, {scores.normalizeSum * nWeights[s]}) - }); - nProbs = nProbs.flop.collect({arg scores, s; scores.product}).normalizeSum; - - sel = candidates.wchoose(nProbs); - - voices[ins] = sel; - lastXChanges = lastXChanges.add(voices).keep(-5); -}; - -genSubMotif = {arg order, orderIndex, lastState, repeatLast = false, startFromLast = false, isLastOrder = false; - var sus, prog, silent, flatOrder, res, isInChord, allowChord, pad, lastXChangesHold, voices, adder; - # sus, prog, silent = order; - flatOrder = silent ++ sus ++ prog; - lastXChangesHold = lastXChanges.deepCopy; - voices = lastState.deepCopy; - isInChord = popSize.collect({false}); - allowChord = false; - pad = false; - res = []; - "------generating motif".postln; - //need to figure out here if voices move between motifs - flatOrder.do({arg ins, i; - - if(prog.includes(ins) && repeatLast.not, {updateVoices.value(ins, sus)}); - adder = if(silent.includes(ins), {["Rest"]}, {lastXChanges.last.deepCopy[ins]}); - - if(voices[ins] != adder, { - var dur; - - if((sus ++ silent).includes(ins), { - allowChord = (ins != sus.last); - pad = (ins == sus.last); - }, { - if(i < (flatOrder.size - 1), { - allowChord = (isInChord[flatOrder[i + 1]] || (ins == flatOrder[i + 1])).not; - pad = false; - }, { - allowChord = false; - pad = true - }); - }); - if((orderIndex == 0) && sus.includes(ins), { - dur = entrancesDurFunc.value(allowChord, pad); - }, { - dur = passagesDurFunc.value(allowChord, pad); - }); - if(dur == 0, {isInChord[ins] = true}, {isInChord = popSize.collect({false})}); - - voices[ins] = adder; - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - - // pad ending - if(orderIndex == (orders.size - 1), { - (0..(popSize-1)).scramble.do({arg ins; - if(res.last.first[ins] != ["Rest"], { - var dur; - voices[ins] = ["Rest"]; - allowChord = (voices != popSize.collect({["Rest"]})); - pad = allowChord.not; - dur = exitsDurFunc.value(allowChord, pad); - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - }); - - //format and return - if(startFromLast, {lastXChanges = lastXChangesHold.deepCopy}); - res; -}; - - -//------primary routines - -genMotif = { - var repeats, fSeq, fDur, durAdd; - - repeats = 1; - fSeq = []; - - repeats.do({arg index; - var motif; - - motif = []; - - orders.do({arg order, o; - var lastState, subMotif; - lastState = if(o == 0, {popSize.collect({["Rest"]})}, {motif.last.last.first}); - subMotif = genSubMotif.value(order, o, lastState, isLastOrder: o == (orders.size - 1)); - motif = motif.add(subMotif); - - }); - - sanityCheck.value(motif, index); - - fSeq = fSeq.add(motif); - }); - - //round last duration to measure - fDur = fSeq.flatten.flatten.slice(nil, 1).sum; - durAdd = fDur.round(4) - fDur; - if(durAdd < 0, {durAdd = 4 - durAdd}); - fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] = fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] + durAdd; - - fSeq -}; - -genSecondarySeq = {arg seq; - var curdles, fSeq; - curdles = []; - while({curdles.sum < seq.size}, {curdles = curdles ++ [3.rand + 1]}); - - fSeq = seq.clumps(curdles).collect({arg clump, m; - var repeats, paddedSeq; - - //add rest - paddedSeq = clump.add([[[popSize.collect({["Rest"]}), 0.5.rand]]]); - - //implement repeats - repeats = [0.rand + 1, 1].wchoose([1, 0].normalizeSum); - repeats.collect({paddedSeq}); - }); - fSeq -}; - - -//------audition funcs - -/* -Event.addEventType(\osc, { - if (~addr.postln.notNil) { - ~addr.sendMsg(~indexPath, ~indexMsg); - ~addr.sendMsg(~seqPath, stringifyToDepth.value(~seqMsg, 3)); - //~addr.sendMsg("/STATE/OPEN", (dir.replace("supercollider", "resources") +/+ ~idMsg +/+ ~idMsg ++ "_gui_state" ++ ".state").standardizePath.postln); - }; -}); -*/ - -Event.addEventType(\osc, { - if (~addr.notNil) { - ~msg; - ~addr.sendMsg(~path, *~msg); - }; -}); - -genPatterns = {arg inSeq, addr, oneShot = false; - var voices, durs, pbinds, res, indices, sectionDurs, msg, ids, seq; - seq = inSeq.collect({arg mSeq; mSeq[0]}); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - pbinds = voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs, attacks, rels, amps; - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - //attacks = 2.collect({rrand(1, 3)}) ++ freqs.drop(2).collect({rrand(0.3, 0.5)}); - attacks = fDurs.collect({arg dur; dur * rrand(0.2, 0.4)}); - //rels = freqs.drop(2).collect({rrand(0.3, 0.5)}) ++ 2.collect({rrand(1, 3)}); - rels = (clumps.size - 1).collect({arg c; - if(clumps[c + 1][0] == ["Rest"], {rrand(1.0, 3.0)}, {rrand(0.3, 0.5)}); - }); - rels = rels.add(rrand(1.0, 3.0)); - amps = freqs.collect({rrand(0.6, 0.99)}); - - [ - Pbind( - \instrument, \string_model, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \attack, Pseq(attacks, 1), - \sustain, Pseq(fDurs, 1), - \release, Pseq(rels, 1), - //\amp, Pseq(amps, 1), - \amp, Pbrown(0.5, 1, 0.5), - \busIndex, v - ), - Pbind( - \instrument, \sine, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \sustain, Pseq(fDurs, 1), - \busIndex, v - ) - ] - }).flatten; - if(oneShot.not, { - msg = inSeq.collect({arg mSeq, m; mSeq[1..]}); - //ids = inSeq.collect({arg mSeq, m; mSeq[2]}); - sectionDurs = seq.collect({arg mSeq; mSeq.flatten2(mSeq.maxDepth - 5).flop[1].sum}); - pbinds = pbinds ++ - [ - Pbind( - \type, \osc, - \addr, addr, - \path, "/playing", - \msg, Pseq(msg, 1), - \dur, Pseq(sectionDurs, 1) - ); - ] - }); - res = Ppar(pbinds); - res -}; - -/* -genMidiPatterns = {arg seq; - var voices, durs, patterns, res, mOut, pbRange; - pbRange = 1; //semitones - change this as needed for your situation - mOut = MIDIOut.newByName("TiMidity", "TiMidity port 0").latency_(Server.default.latency); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - res = Ppar( - voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs; - - mOut.program(v, 70); - - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - - Pbind( - \type, \midi, - \chan, v, - \noteval, Pseq(freqs.cpsmidi - 24, 1), - \note, Pfunc({ | event | event[\noteval].floor }), - \dur, Pseq(fDurs, 1), - \midiout, mOut, - \amp, 1, - \bend, Pfunc({ - | event | - if (event[\note].isRest.not) { - var pitchbendvalue = event[\noteval].frac.linlin(0, pbRange, 8192, 8192*2).asInteger; - m.bend(v, pitchbendvalue); - }; - 0; // return something other than nil to avoid stopping the pattern - }), - ); - }); - ); - res -}; -*/ - - -//------resource management funcs - -genUID = {Date.seed.asHexString.toLower}; - -seedFunc = {arg func, seed; - var funcArgs, next; - next = Routine({loop{func.valueArray(funcArgs).yield }}); - next.randSeed_(seed); - {arg ...args; funcArgs = args; next.value} -}; - -stringifyToDepth = {arg data, maxDepth = 1; - var prettyString = "", rCount = 0, writeArray, indent; - - if(maxDepth == 0, { - data.asCompileString - }, { - indent = {arg size; size.collect({" "}).join("")}; - writeArray = {arg array; - prettyString = prettyString ++ indent.value(rCount) ++ "[\n"; - rCount = rCount + 1; - if(rCount < maxDepth, { - array.do({arg subArray; writeArray.value(subArray)}); - }, { - prettyString = prettyString ++ array.collect({arg subArray; - indent.value(rCount + 1) ++ subArray.asCompileString - }).join(",\n"); - }); - rCount = rCount - 1; - prettyString = prettyString ++ "\n" ++ indent.value(rCount) ++ "],\n"; - }; - - writeArray.value(data); - prettyString.replace(",\n\n", "\n").drop(-2); - }) -}; - -sanityCheck = {arg motif, index; - //print functions = very helpful - ("----------" + index + "------------").postln; - - motif.flatten.do({arg val, v; - if(v > 0, { - if(motif.flatten[v-1][0].hammingDistance(val[0]) > 1, {"problem 1".postln}); - if(motif.flatten[v-1][0].hammingDistance(val[0]) == 0, {"problem 2".postln}); - }); - val.postln - }); - "***********".postln; -}; - -msgInterpret = {arg in, escapeDoubleQuotes = true, escapeSingleQuotes = true; - var res; - - res = in; - if(res.isNil.not, { - if((res.isArray && res.isString.not), { - res = res.asCompileString; - res = res.replace(" ", "").replace("\n", "").replace("\t", ""); - if(escapeSingleQuotes, {res = res.replace("\'", "")}); - if(escapeDoubleQuotes, {res = res.replace("\"", "")}); - res = res.replace("Rest", "\"Rest\""); - res = res.interpret; - }, { - var tmpRes; - if(res.every({arg char; char.isDecDigit}), {tmpRes = res.asInteger}); - if(res.contains("."), {tmpRes = res.asFloat}); - if(tmpRes != nil, {res = tmpRes}); - }); - }); - res -}; - -writeResources = {arg path, dict; - var file, modelItems, resString; - file = File(path,"w"); - - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - - resString = nameSpaces.collect({arg nameSpace; - var depth = 0, insert = " "; - if(nameSpace == "music_data", {depth = 3; insert = "\n"}); - if(nameSpace == "last_changes", {depth = 1; insert = "\n"}); - if(nameSpace == "order", {depth = 1; insert = "\n"}); - if((nameSpace == "ref_uid") && (dict[nameSpace] == nil), {dict[nameSpace] = "nil"}); - "\"" ++ nameSpace ++ "\":" ++ insert ++ stringifyToDepth.value(dict[nameSpace], depth) - }).join(",\n"); - - resString = "{\n" ++ resString ++ "\n}"; - - file.write(resString); - file.close; - resString -}; - -loadModelFile = {arg path; loadModelJSON.value(File(path, "r").readAllString.parseJSON)}; - -loadModelJSON = {arg jsonObject; - var dict; - dict = Dictionary.with(*nameSpaces.collect({arg nS; nS->msgInterpret.value(jsonObject[nS])})); - dict -}; - -setGlobalVars = {arg dict, skipLastXChanges = false; - var tmpLastXChanges; - tmpLastXChanges = lastXChanges.deepCopy; - // order really matters!!!! - # seq, lastXChanges, curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited = nameSpaces.collect({arg nS; dict[nS]}); - if(skipLastXChanges, {lastXChanges = tmpLastXChanges}); - dict -}; - -globalVarsToDict = { - var modelItems, dict; - // order really matters!!!! - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - dict = Dictionary.with(*nameSpaces.collect({arg nS, n; nS->modelItems[n]})); -}; - -loadLedgerFile = {arg path; - ledgerPath = path; - resourceDir = path.splitext(".").drop(-1).join; - loadLedgerJSON.value(File(ledgerPath, "r").readAllString.parseJSON) -}; - -loadLedgerJSON = {arg jsonObject; ledger = jsonObject["ledger"]}; - -saveLedger = {arg ledger, path; - var file, curResourceDir; - file = File(path, "w"); - curResourceDir = resourceDir; - resourceDir = path.splitext(".").drop(-1).join; - if(curResourceDir != resourceDir, { - File.mkdir(resourceDir); - ledger.do({arg id; - File.copy(curResourceDir +/+ id, resourceDir +/+ id); - }); - }); - file.write("{\n\"ledger\":\n" ++ stringifyToDepth.value(ledger, 1) ++ "\n}"); - file.close; -}; - -//------global vars - -primes = [[2, 1], [3, 2], [5, 4], [7, 4], [11, 8], [13, 8]]; -//ranges = [[-2400, 0], [-1200, 1200], [0, 2400], [0, 2400]]; -exPath = thisProcess.nowExecutingPath; -dir = exPath.dirname; -//popSize = 4; -dims = primes.size; -tuples = genTuples.value(); -//refUID = nil; -group = Group.new; -~group = group; -loadLedgerFile.value(dir +/+ ".." +/+ "resources" +/+ "piece_ledger.json"); -resourceDir = (dir +/+ ".." +/+ "resources" +/+ "piece_ledger"); -//passagesWeights = [1, 1, 1, 1, 1]; -//susWeights = [1, 1, 1]; -// order really matters!!!! -nameSpaces = [ - "music_data", "last_changes", "cur_uid", "ref_uid", "order_seed", "dur_seed", "motifs_seed", - "entrances_probs_vals","passages_probs_vals", "exits_probs_vals", - "ranges", "step_probs_vals", "passages_weights", "hd_exp", "hd_invert", - "order", "sus_weights", "order_size", "passages_size", - "motif_edited", "order_edited" -]; - - -//------OSC funcs - -OSCdef(\load_ledger, {arg msg, time, addr, port; - loadLedgerFile.value(msg[1].asString); -}, \load_ledger); - -OSCdef(\load_model, {arg msg, time, addr, port; - var dict; - dict = loadModelFile.value(msg[1].asString); - setGlobalVars.value(dict); -}, \load_model); - -OSCdef(\save_ledger, {arg msg, time, addr, port; - msg.postln; - ledger = msgInterpret.value(msg[1].asString.parseJSON["ledger"], false).postln; - //loadLedgerJSON.value(msg[0]) - saveLedger.value(ledger, msg[2].asString); - //loadLedgerFile.value(msg[1].asString); -}, \save_ledger); - -OSCdef(\generate, {arg msg, time, addr, port; - var path, dict, durSeeds, musPath, modelString; - msg.postln; - - path = msg[1].asString; - - dict = loadModelFile.value(path); - setGlobalVars.value(dict, true); - - popSize = ranges.size; - - //refUID.postln; - - loadLedgerFile.value(ledgerPath); - if(ledger == nil, {ledger = ["tmp"]}); - if(ledger.last != "tmp", {ledger = ledger.add("tmp")}); - - if(refUID == nil, {lastXChanges = [initVoices.value().deepCopy]}); - if((refUID != nil) && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - lastXChanges = msgInterpret.value(file.readAllString.parseJSON["last_changes"]); - }); - - refUID.postln; - lastXChanges.collect({arg item; item.postln}); - - durSeeds = seedFunc.value({3.collect({rrand(100000, 999999)})}, durSeed).value.postln; - entrancesDurFunc = genDurFunc.valueArray(entrancesProbVals[..4] ++ [entrancesProbVals[5..]] ++ [durSeeds[0]]); - passagesDurFunc = genDurFunc.valueArray(passagesProbVals[..4] ++ [passagesProbVals[5..]] ++ [durSeeds[1]]); - exitsDurFunc = genDurFunc.valueArray(exitsProbVals[..4] ++ [exitsProbVals[5..]] ++ [durSeeds[2]]); - - if(orders == nil, { - orders = seedFunc.value(genOrders, orderSeed).valueArray(orderSize ++ passagesSize); - //addr.sendMsg("/order", stringifyToDepth.value(orders, 1)); - }); - - stepFunc = genStepFunc.valueArray(stepProbsVals[..1] ++ [stepProbsVals[2..]] ++ [motifSeed]); - seq = seedFunc.value(genMotif, motifSeed).value; - - lastXChanges.collect({arg item; item.postln}); - - dict = globalVarsToDict.value; - modelString = writeResources.value(path, dict); - - //addr.sendMsg("/generated", musPath, stringifyToDepth.value(seq, 3)); - //~seq = seq; - - addr.sendMsg("/generated", path, modelString, ledgerPath); -}, \generate); - - -OSCdef(\commit, {arg msg, time, addr, port; - var musicData, musicChanged, dict, newLedger, modelPath, musString, musFile, test1, test2, lastCurUID, commitType, commitPos, equalityLedger; - //msg.postln; - - /* - test1 = msg[1].asString.parseJSON; - test2 = (dir +/+ ".." +/+ "resources/tmp/tmp_music" ++ ".json").standardizePath.parseJSONFile; - msgInterpret.value(test1["music"])[0][0][0][1].class.postln; - msgInterpret.value(test2["music_data"])[0][0][0][1].class.postln; - (test1["music"] == test2["music_data"]).postln; - */ - - musicData = loadModelJSON.value(msg[1].asString.parseJSON)["music_data"].postln; - musicChanged = (musicData != seq).postln; - commitType = msg[2].asString; - commitPos = msg[3].postln.asInteger; - - lastCurUID = curUID.deepCopy; - curUID = genUID.value; - - File.mkdir((resourceDir +/+ curUID).standardizePath); - File.copy(exPath, (resourceDir +/+ curUID +/+ curUID ++ "_code" ++ ".scd").standardizePath); - - modelPath = (resourceDir +/+ curUID +/+ curUID ++ "_mus_model" ++ ".json").standardizePath; - dict = globalVarsToDict.value; - if(musicChanged, { - seq = musicData; - dict["music_data"] = seq; - dict["motif_edited"] = "true" - }); - dict["cur_uid"] = curUID; - - writeResources.value(modelPath, dict); - - File.delete(ledgerPath ++ "_bak"); - File.copy(ledgerPath, ledgerPath ++ "_bak"); - File.delete(ledgerPath); - - /* - if(commitType == "add", { - if(lastCurUID == "tmp", { - ledger = ledger.drop(-1).add(curUID); - }, { - ledger = ledger.add(curUID); - }) - }); - */ - - ledger.postln; - - if(commitType == "add", {ledger = ledger.add(curUID)}); - - if(commitType == "insert", {ledger = ledger.insert(commitPos + 1, curUID)}); - - if(commitType == "replace", {ledger = ledger.put(commitPos, curUID)}); - - equalityLedger = ledger.collect({arg item; item.asSymbol}); - if(equalityLedger.includes(\tmp).postln, {ledger.removeAt(equalityLedger.indexOf(\tmp).postln)}); - - ledger.postln; - - saveLedger.value(ledger, ledgerPath); - - addr.sendMsg("/committed", curUID, ledgerPath); - //refUID = curUID; - -}, \commit); - -OSCdef(\transport, {arg msg, time, addr, port; - msg.postln; - if(msg[1] == 0, { - group.set(\release, 2); - group.set(\gate, 0); - player.stop; - }, { - // the cued sequence can now be read from file, so this can be cleaned up - var cSize, patterns, pSeq, cuedSeek, indexStart, indexEnd, tmpLedger; - if(msg[1] == 1, { - pSeq = []; - cuedSeek = (seq != nil); - indexStart = msg[2].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.postln.parseJSON["music_data"]), path, indexStart + index, uid]); - file.close; - }); - }); - if(cuedSeek, { - var path, file; - path = (resourceDir +/+ "tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - patterns = genPatterns.value(pSeq, addr); - }, { - pSeq = [loadModelJSON.value(msg[2].asString.parseJSON)["music_data"].postln]; - patterns = genPatterns.value(pSeq, addr, true); - }); - player = Pfset(pattern: patterns, cleanupFunc: { - addr.sendMsg("/transport", 0); - addr.sendMsg("/one_shot", 0); - }); - player = player.play - }); -}, \transport); - - -OSCdef(\transcribe_motif, {arg msg, time, addr, port; - var tSeq, refChord, refUID; - - msg.postln; - - tSeq = [loadModelJSON.value(msg[1].asString.parseJSON)["music_data"]]; - refUID = msg[2].asString.postln; - - if((refUID != "nil") && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }, { - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - }); - - ~transcribe.value(tSeq, refChord, (dir +/+ ".." +/+ "lilypond" +/+ "includes").standardizePath, addr, "/transcribe_motif"); -}, \transcribe_motif); - - -OSCdef(\transcribe_all, {arg msg, time, addr, port; - var cSize, patterns, cuedSeek, indexStart, indexEnd, tmpLedger; - if(true, { - cuedSeek = (seq != nil); - indexStart = msg[1].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - - //tmp for testing transcription - //indexEnd = (indexStart+5); - - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - var lilyPartLedgerFiles; - - lilyPartLedgerFiles = 4.collect({arg p; - File((dir +/+ ".." +/+ "lilypond" +/+ "includes" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly").standardizePath, "w"); - }); - - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file, fileString, tSeq, refUID, refChord; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - fileString = file.readAllString; - tSeq = msgInterpret.value(fileString.parseJSON["music_data"]); - refUID = msgInterpret.value(fileString.parseJSON["ref_uid"]); - file.close; - - //uid.postln; - //(refUID == "nil").postln; - - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - - if(refUID != "nil", { - path = (resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }); - - if(index != indexEnd, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath); - }, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath, addr, "/transcribe_all"); - }); - - lilyPartLedgerFiles.do({arg f, p; - f.write("\\include \"" ++ resourceDir +/+ uid +/+ "lilypond" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly\"\n"); - }); - - }); - - lilyPartLedgerFiles.do({arg f; - f.close - }); - }); - /* - if(cuedSeek, { - var path, file; - path = (dir +/+ ".." +/+ "resources/tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - */ - }, { - - }); - -}, \transcribe_all); - -) - - diff --git a/resources/string_quartet_3/75316bf0/75316bf0_mus_model.json b/resources/string_quartet_3/75316bf0/75316bf0_mus_model.json deleted file mode 100644 index e03d000..0000000 --- a/resources/string_quartet_3/75316bf0/75316bf0_mus_model.json +++ /dev/null @@ -1,550 +0,0 @@ -{ -"music_data": -[ - [ - [ - [ [ [ "Rest" ], [ 2, -1, -2, 2, -3, 0 ], [ "Rest" ], [ "Rest" ] ], 0.625 ], - [ [ [ "Rest" ], [ 2, -1, -2, 2, -3, 0 ], [ 2, -1, -2, 1, -3, 0 ], [ "Rest" ] ], 1 ], - [ [ [ "Rest" ], [ 2, -1, -2, 2, -3, 0 ], [ 2, -1, -2, 1, -3, 0 ], [ 1, 0, -2, 2, -3, 0 ] ], 1.5 ], - [ [ [ 1, -2, -2, 2, -3, 0 ], [ 2, -1, -2, 2, -3, 0 ], [ 2, -1, -2, 1, -3, 0 ], [ 1, 0, -2, 2, -3, 0 ] ], 1.875 ] - ], - [ - [ [ [ 1, -2, -2, 2, -3, 0 ], [ 2, -1, -2, 2, -3, 0 ], [ 2, -1, -2, 1, -3, 0 ], [ 2, -2, -1, 2, -3, 0 ] ], 1.625 ], - [ [ [ 1, -2, -2, 2, -3, 0 ], [ 3, -2, -2, 1, -3, 0 ], [ 2, -1, -2, 1, -3, 0 ], [ 2, -2, -1, 2, -3, 0 ] ], 1.5 ] - ], - [ - [ [ [ 1, -2, -2, 2, -3, 0 ], [ 3, -2, -2, 1, -3, 0 ], [ 2, -3, -2, 2, -3, 0 ], [ 2, -2, -1, 2, -3, 0 ] ], 1.5 ], - [ [ [ 1, -2, -2, 2, -3, 0 ], [ 3, -2, -2, 1, -3, 0 ], [ 2, -3, -2, 2, -3, 0 ], [ 3, -3, -2, 2, -3, 0 ] ], 0.875 ] - ], - [ - [ [ [ 2, -3, -3, 2, -3, 0 ], [ 3, -2, -2, 1, -3, 0 ], [ 2, -3, -2, 2, -3, 0 ], [ 3, -3, -2, 2, -3, 0 ] ], 1.125 ], - [ [ [ 2, -3, -3, 2, -3, 0 ], [ 3, -2, -2, 1, -3, 0 ], [ 3, -3, -2, 1, -3, 0 ], [ 3, -3, -2, 2, -3, 0 ] ], 1.75 ] - ], - [ - [ [ [ 2, -3, -3, 2, -3, 0 ], [ 3, -2, -2, 1, -3, 0 ], [ 3, -3, -2, 1, -3, 0 ], [ 4, -4, -3, 2, -3, 0 ] ], 1.5 ], - [ [ [ 2, -3, -3, 2, -3, 0 ], [ 4, -3, -3, 1, -3, 0 ], [ 3, -3, -2, 1, -3, 0 ], [ 4, -4, -3, 2, -3, 0 ] ], 1.5 ] - ], - [ - [ [ [ 2, -3, -3, 2, -3, 0 ], [ 3, -3, -2, 2, -3, 0 ], [ 3, -3, -2, 1, -3, 0 ], [ 4, -4, -3, 2, -3, 0 ] ], 1.75 ], - [ [ [ 2, -3, -3, 2, -3, 0 ], [ 3, -3, -2, 2, -3, 0 ], [ 3, -4, -3, 2, -3, 0 ], [ 4, -4, -3, 2, -3, 0 ] ], 1.5 ] - ], - [ - [ [ [ 2, -3, -3, 2, -3, 0 ], [ 3, -3, -2, 2, -3, 0 ], [ 2, -2, -3, 2, -3, 0 ], [ 4, -4, -3, 2, -3, 0 ] ], 0.5 ] - ], - [ - [ [ [ 2, -3, -3, 2, -3, 0 ], [ 4, -4, -4, 2, -3, 0 ], [ 2, -2, -3, 2, -3, 0 ], [ 4, -4, -3, 2, -3, 0 ] ], 0.5 ], - [ [ [ 2, -3, -3, 2, -3, 0 ], [ 4, -4, -4, 2, -3, 0 ], [ 2, -4, -3, 3, -3, 0 ], [ 4, -4, -3, 2, -3, 0 ] ], 0.75 ], - [ [ [ 3, -4, -4, 2, -3, 0 ], [ 4, -4, -4, 2, -3, 0 ], [ 2, -4, -3, 3, -3, 0 ], [ 4, -4, -3, 2, -3, 0 ] ], 0.625 ] - ], - [ - [ [ [ 3, -4, -4, 2, -3, 0 ], [ 4, -4, -4, 2, -3, 0 ], [ 3, -5, -3, 2, -3, 0 ], [ 4, -4, -3, 2, -3, 0 ] ], 0.625 ] - ], - [ - [ [ [ 1, -3, -4, 2, -3, 0 ], [ 4, -4, -4, 2, -3, 0 ], [ 3, -5, -3, 2, -3, 0 ], [ 4, -4, -3, 2, -3, 0 ] ], 1.25 ], - [ [ [ 1, -3, -4, 2, -3, 0 ], [ 4, -4, -4, 2, -3, 0 ], [ 2, -4, -4, 3, -3, 0 ], [ 4, -4, -3, 2, -3, 0 ] ], 1.375 ], - [ [ [ 1, -3, -4, 2, -3, 0 ], [ 4, -4, -4, 2, -3, 0 ], [ 2, -4, -4, 3, -3, 0 ], [ 5, -4, -4, 1, -3, 0 ] ], 0.75 ] - ], - [ - [ [ [ 1, -3, -4, 2, -3, 0 ], [ 4, -4, -4, 2, -3, 0 ], [ 3, -4, -4, 2, -3, 0 ], [ 5, -4, -4, 1, -3, 0 ] ], 1.375 ] - ], - [ - [ [ [ 1, -3, -4, 2, -3, 0 ], [ 4, -4, -4, 2, -3, 0 ], [ 3, -4, -4, 2, -3, 0 ], [ 4, -3, -5, 2, -3, 0 ] ], 1.5 ], - [ [ [ 1, -3, -4, 2, -3, 0 ], [ 3, -2, -4, 2, -3, 0 ], [ 3, -4, -4, 2, -3, 0 ], [ 4, -3, -5, 2, -3, 0 ] ], 0.5 ] - ], - [ - [ [ [ 1, -3, -4, 2, -3, 0 ], [ 3, -2, -4, 2, -3, 0 ], [ 3, -4, -4, 2, -3, 0 ], [ 3, -3, -4, 3, -3, 0 ] ], 1.75 ], - [ [ [ 1, -3, -4, 2, -3, 0 ], [ 3, -2, -4, 2, -3, 0 ], [ 2, -2, -4, 2, -3, 0 ], [ 3, -3, -4, 3, -3, 0 ] ], 1.625 ] - ], - [ - [ [ [ 1, -2, -4, 2, -4, 0 ], [ 3, -2, -4, 2, -3, 0 ], [ 2, -2, -4, 2, -3, 0 ], [ 3, -3, -4, 3, -3, 0 ] ], 0.625 ] - ], - [ - [ [ [ 1, -2, -4, 2, -4, 0 ], [ 1, -2, -4, 3, -3, 0 ], [ 2, -2, -4, 2, -3, 0 ], [ 3, -3, -4, 3, -3, 0 ] ], 0.875 ], - [ [ [ 1, -4, -4, 3, -3, 0 ], [ 1, -2, -4, 3, -3, 0 ], [ 2, -2, -4, 2, -3, 0 ], [ 3, -3, -4, 3, -3, 0 ] ], 1.625 ] - ], - [ - [ [ [ 1, -4, -4, 3, -3, 0 ], [ 2, -4, -3, 3, -3, 0 ], [ 2, -2, -4, 2, -3, 0 ], [ 3, -3, -4, 3, -3, 0 ] ], 1.625 ] - ], - [ - [ [ [ 1, -4, -4, 3, -3, 0 ], [ 2, -4, -3, 3, -3, 0 ], [ 2, -3, -4, 3, -3, 0 ], [ 3, -3, -4, 3, -3, 0 ] ], 0.5 ] - ], - [ - [ [ [ 1, -4, -4, 3, -3, 0 ], [ 2, -4, -3, 3, -3, 0 ], [ 2, -4, -4, 3, -3, 0 ], [ 3, -3, -4, 3, -3, 0 ] ], 0.75 ] - ], - [ - [ [ [ 1, -4, -4, 3, -3, 0 ], [ 2, -4, -3, 3, -3, 0 ], [ 1, -4, -3, 4, -3, 0 ], [ 3, -3, -4, 3, -3, 0 ] ], 0.75 ], - [ [ [ 0, -4, -3, 4, -3, 0 ], [ 2, -4, -3, 3, -3, 0 ], [ 1, -4, -3, 4, -3, 0 ], [ 3, -3, -4, 3, -3, 0 ] ], 1.25 ], - [ [ [ 0, -4, -3, 4, -3, 0 ], [ 2, -4, -3, 3, -3, 0 ], [ 1, -4, -3, 4, -3, 0 ], [ 3, -4, -3, 3, -3, 0 ] ], 1.25 ] - ], - [ - [ [ [ 0, -4, -3, 4, -3, 0 ], [ 3, -4, -3, 2, -3, 0 ], [ 1, -4, -3, 4, -3, 0 ], [ 3, -4, -3, 3, -3, 0 ] ], 1 ], - [ [ [ 0, -4, -3, 4, -3, 0 ], [ 3, -4, -3, 2, -3, 0 ], [ 2, -4, -3, 3, -3, 0 ], [ 3, -4, -3, 3, -3, 0 ] ], 0.375 ], - [ [ [ 1, -4, -3, 3, -3, 0 ], [ 3, -4, -3, 2, -3, 0 ], [ 2, -4, -3, 3, -3, 0 ], [ 3, -4, -3, 3, -3, 0 ] ], 1.375 ] - ], - [ - [ [ [ 1, -4, -3, 3, -3, 0 ], [ 3, -4, -3, 2, -3, 0 ], [ 2, -4, -3, 3, -3, 0 ], [ 4, -4, -3, 2, -3, 0 ] ], 1.625 ], - [ [ [ 2, -4, -3, 2, -3, 0 ], [ 3, -4, -3, 2, -3, 0 ], [ 2, -4, -3, 3, -3, 0 ], [ 4, -4, -3, 2, -3, 0 ] ], 1.625 ] - ], - [ - [ [ [ 2, -4, -3, 2, -3, 0 ], [ 3, -4, -3, 2, -3, 0 ], [ 2, -4, -3, 3, -3, 0 ], [ 3, -4, -3, 2, -3, 1 ] ], 1.625 ], - [ [ [ 2, -4, -3, 2, -3, 0 ], [ 3, -4, -3, 2, -3, 0 ], [ 3, -5, -3, 2, -3, 0 ], [ 3, -4, -3, 2, -3, 1 ] ], 1.75 ] - ], - [ - [ [ [ 2, -4, -3, 2, -3, 0 ], [ 3, -4, -3, 2, -3, 0 ], [ 2, -3, -3, 2, -3, 0 ], [ 3, -4, -3, 2, -3, 1 ] ], 1.75 ], - [ [ [ 2, -4, -3, 2, -3, 0 ], [ 3, -4, -3, 2, -3, 0 ], [ 2, -3, -3, 2, -3, 0 ], [ 3, -4, -3, 3, -3, 0 ] ], 1.75 ] - ], - [ - [ [ [ 2, -4, -3, 2, -3, 0 ], [ 2, -2, -3, 2, -3, 0 ], [ 2, -3, -3, 2, -3, 0 ], [ 3, -4, -3, 3, -3, 0 ] ], 1 ] - ], - [ - [ [ [ 2, -5, -3, 3, -3, 0 ], [ 2, -2, -3, 2, -3, 0 ], [ 2, -3, -3, 2, -3, 0 ], [ 3, -4, -3, 3, -3, 0 ] ], 1.625 ], - [ [ [ 2, -5, -3, 3, -3, 0 ], [ 2, -2, -3, 2, -3, 0 ], [ 2, -4, -3, 3, -3, 0 ], [ 3, -4, -3, 3, -3, 0 ] ], 1.75 ], - [ [ [ 2, -5, -3, 3, -3, 0 ], [ 2, -3, -3, 3, -3, 0 ], [ 2, -4, -3, 3, -3, 0 ], [ 3, -4, -3, 3, -3, 0 ] ], 1.625 ] - ], - [ - [ [ [ 1, -3, -3, 3, -3, 0 ], [ 2, -3, -3, 3, -3, 0 ], [ 2, -4, -3, 3, -3, 0 ], [ 3, -4, -3, 3, -3, 0 ] ], 1 ], - [ [ [ 1, -3, -3, 3, -3, 0 ], [ 2, -3, -3, 3, -3, 0 ], [ 2, -4, -3, 3, -3, 0 ], [ 2, -2, -3, 3, -3, 0 ] ], 1 ], - [ [ [ 1, -3, -3, 3, -3, 0 ], [ 2, -3, -3, 3, -3, 0 ], [ 1, -2, -3, 3, -3, 0 ], [ 2, -2, -3, 3, -3, 0 ] ], 1.25 ] - ], - [ - [ [ [ 1, -3, -3, 3, -3, 0 ], [ 2, -3, -3, 3, -3, 0 ], [ 2, -3, -4, 3, -3, 0 ], [ 2, -2, -3, 3, -3, 0 ] ], 0.875 ], - [ [ [ 1, -3, -3, 3, -3, 0 ], [ 2, -3, -3, 3, -3, 0 ], [ 2, -3, -4, 3, -3, 0 ], [ 3, -3, -4, 3, -3, 0 ] ], 1.625 ], - [ [ [ 1, -3, -4, 3, -3, 0 ], [ 2, -3, -3, 3, -3, 0 ], [ 2, -3, -4, 3, -3, 0 ], [ 3, -3, -4, 3, -3, 0 ] ], 0.875 ] - ], - [ - [ [ [ 1, -3, -4, 3, -3, 0 ], [ 2, -3, -3, 3, -3, 0 ], [ 2, -4, -4, 3, -3, 0 ], [ 3, -3, -4, 3, -3, 0 ] ], 0.75 ], - [ [ [ 1, -3, -4, 3, -3, 0 ], [ 3, -4, -4, 3, -3, 0 ], [ 2, -4, -4, 3, -3, 0 ], [ 3, -3, -4, 3, -3, 0 ] ], 0.5 ], - [ [ [ 1, -3, -4, 3, -3, 0 ], [ 3, -4, -4, 3, -3, 0 ], [ 2, -4, -4, 3, -3, 0 ], [ 2, -3, -4, 4, -3, 0 ] ], 1.125 ] - ], - [ - [ [ [ 1, -3, -4, 3, -3, 0 ], [ 3, -4, -4, 3, -3, 0 ], [ 1, -2, -4, 3, -3, 0 ], [ 2, -3, -4, 4, -3, 0 ] ], 1.625 ] - ], - [ - [ [ [ 1, -3, -4, 3, -3, 0 ], [ 2, -2, -4, 3, -3, 0 ], [ 1, -2, -4, 3, -3, 0 ], [ 2, -3, -4, 4, -3, 0 ] ], 1.75 ] - ], - [ - [ [ [ 1, -3, -4, 3, -3, 0 ], [ 2, -2, -4, 3, -3, 0 ], [ 1, -2, -4, 3, -3, 0 ], [ 2, -2, -3, 3, -3, 0 ] ], 1.75 ], - [ [ [ 1, -3, -4, 3, -3, 0 ], [ 2, -2, -4, 3, -3, 0 ], [ 2, -3, -5, 3, -3, 0 ], [ 2, -2, -3, 3, -3, 0 ] ], 0.75 ] - ], - [ - [ [ [ 1, -3, -4, 3, -3, 0 ], [ 2, -2, -4, 3, -3, 0 ], [ 2, -3, -5, 3, -3, 0 ], [ 3, -3, -4, 3, -3, 0 ] ], 0.375 ], - [ [ [ 1, -3, -4, 3, -3, 0 ], [ 2, -3, -4, 3, -3, 0 ], [ 2, -3, -5, 3, -3, 0 ], [ 3, -3, -4, 3, -3, 0 ] ], 1.125 ] - ], - [ - [ [ [ 1, -3, -4, 3, -3, 0 ], [ 2, -3, -4, 3, -4, 0 ], [ 2, -3, -5, 3, -3, 0 ], [ 3, -3, -4, 3, -3, 0 ] ], 0.5 ], - [ [ [ 1, -3, -4, 2, -3, 0 ], [ 2, -3, -4, 3, -4, 0 ], [ 2, -3, -5, 3, -3, 0 ], [ 3, -3, -4, 3, -3, 0 ] ], 1.75 ], - [ [ [ 1, -3, -4, 2, -3, 0 ], [ 2, -3, -4, 3, -4, 0 ], [ 1, -3, -4, 4, -3, 0 ], [ 3, -3, -4, 3, -3, 0 ] ], 1.25 ] - ], - [ - [ [ [ 1, -3, -4, 2, -3, 0 ], [ 0, -2, -4, 4, -3, 0 ], [ 1, -3, -4, 4, -3, 0 ], [ 3, -3, -4, 3, -3, 0 ] ], 1 ], - [ [ [ -1, -2, -4, 4, -3, 0 ], [ 0, -2, -4, 4, -3, 0 ], [ 1, -3, -4, 4, -3, 0 ], [ 3, -3, -4, 3, -3, 0 ] ], 1.75 ], - [ [ [ -1, -2, -4, 4, -3, 0 ], [ 0, -2, -4, 4, -3, 0 ], [ 1, -3, -4, 4, -3, 0 ], [ 2, -3, -4, 4, -3, 0 ] ], 0.875 ] - ], - [ - [ [ [ -1, -2, -4, 4, -3, 0 ], [ 0, -2, -4, 4, -3, 0 ], [ 0, -1, -4, 4, -3, 0 ], [ 2, -3, -4, 4, -3, 0 ] ], 1.375 ], - [ [ [ -1, -2, -4, 4, -3, 0 ], [ 0, -2, -4, 4, -3, 0 ], [ 0, -1, -4, 4, -3, 0 ], [ 1, -1, -4, 4, -3, 0 ] ], 1.25 ] - ], - [ - [ [ [ -1, -2, -4, 4, -3, 0 ], [ 1, -2, -4, 3, -3, 0 ], [ 0, -1, -4, 4, -3, 0 ], [ 1, -1, -4, 4, -3, 0 ] ], 0.625 ], - [ [ [ -1, -2, -4, 4, -3, 0 ], [ 1, -2, -4, 3, -3, 0 ], [ 0, -1, -4, 4, -3, 0 ], [ 1, -2, -3, 4, -3, 0 ] ], 0.625 ], - [ [ [ -1, -2, -4, 4, -3, 0 ], [ 1, -2, -4, 3, -3, 0 ], [ 0, -2, -4, 4, -3, 0 ], [ 1, -2, -3, 4, -3, 0 ] ], 0.5 ] - ], - [ - [ [ [ -1, -2, -4, 4, -3, 0 ], [ 0, -2, -3, 4, -3, 0 ], [ 0, -2, -4, 4, -3, 0 ], [ 1, -2, -3, 4, -3, 0 ] ], 0.75 ], - [ [ [ -1, -2, -4, 4, -3, 0 ], [ 0, -2, -3, 4, -3, 0 ], [ -1, -2, -3, 5, -3, 0 ], [ 1, -2, -3, 4, -3, 0 ] ], 1.125 ] - ], - [ - [ [ [ -1, -2, -4, 4, -3, 0 ], [ 1, -3, -4, 4, -3, 0 ], [ -1, -2, -3, 5, -3, 0 ], [ 1, -2, -3, 4, -3, 0 ] ], 1.625 ], - [ [ [ -1, -2, -4, 4, -3, 0 ], [ 1, -3, -4, 4, -3, 0 ], [ -1, -2, -3, 5, -3, 0 ], [ 2, -3, -4, 4, -3, 0 ] ], 0.875 ], - [ [ [ -1, -2, -4, 4, -3, 0 ], [ 1, -3, -4, 4, -3, 0 ], [ 0, -2, -3, 4, -3, 0 ], [ 2, -3, -4, 4, -3, 0 ] ], 1.25 ] - ], - [ - [ [ [ -1, -2, -4, 4, -3, 0 ], [ 1, -3, -4, 4, -3, 0 ], [ 1, -3, -4, 4, -4, 0 ], [ 2, -3, -4, 4, -3, 0 ] ], 1 ] - ], - [ - [ [ [ -1, -2, -4, 4, -3, 0 ], [ 1, -3, -4, 4, -3, 0 ], [ 1, -3, -4, 4, -4, 0 ], [ 1, -1, -4, 4, -3, 0 ] ], 1.5 ] - ], - [ - [ [ [ -1, -2, -4, 4, -3, 0 ], [ 1, -2, -4, 4, -4, 0 ], [ 1, -3, -4, 4, -4, 0 ], [ 1, -1, -4, 4, -3, 0 ] ], 1 ], - [ [ [ 1, -3, -4, 3, -4, 0 ], [ 1, -2, -4, 4, -4, 0 ], [ 1, -3, -4, 4, -4, 0 ], [ 1, -1, -4, 4, -3, 0 ] ], 1.25 ], - [ [ [ 1, -3, -4, 3, -4, 0 ], [ 1, -2, -4, 4, -4, 0 ], [ 1, -3, -4, 4, -4, 0 ], [ 2, -2, -4, 4, -4, 0 ] ], 0.5 ] - ], - [ - [ [ [ 1, -3, -4, 3, -4, 0 ], [ 1, -2, -4, 4, -4, 0 ], [ 2, -3, -4, 3, -4, 0 ], [ 2, -2, -4, 4, -4, 0 ] ], 1 ] - ], - [ - [ [ [ 1, -3, -4, 3, -4, 0 ], [ 2, -2, -4, 3, -4, 0 ], [ 2, -3, -4, 3, -4, 0 ], [ 2, -2, -4, 4, -4, 0 ] ], 0.875 ], - [ [ [ 0, -2, -4, 3, -4, 0 ], [ 2, -2, -4, 3, -4, 0 ], [ 2, -3, -4, 3, -4, 0 ], [ 2, -2, -4, 4, -4, 0 ] ], 1.75 ] - ], - [ - [ [ [ 0, -2, -4, 3, -4, 0 ], [ 2, -2, -4, 3, -4, 0 ], [ 2, -3, -4, 3, -4, 0 ], [ 2, -1, -4, 3, -4, 0 ] ], 1.75 ], - [ [ [ 0, -2, -4, 3, -4, 0 ], [ 2, -2, -4, 3, -4, 0 ], [ 1, -1, -4, 3, -4, 0 ], [ 2, -1, -4, 3, -4, 0 ] ], 1.75 ], - [ [ [ 1, -2, -4, 3, -4, 0 ], [ 2, -2, -4, 3, -4, 0 ], [ 1, -1, -4, 3, -4, 0 ], [ 2, -1, -4, 3, -4, 0 ] ], 1.125 ] - ], - [ - [ [ [ 1, -2, -4, 3, -4, 0 ], [ 1, 0, -4, 3, -4, 0 ], [ 1, -1, -4, 3, -4, 0 ], [ 2, -1, -4, 3, -4, 0 ] ], 0.875 ] - ], - [ - [ [ [ 0, 0, -4, 3, -4, 0 ], [ 1, 0, -4, 3, -4, 0 ], [ 1, -1, -4, 3, -4, 0 ], [ 2, -1, -4, 3, -4, 0 ] ], 1.75 ], - [ [ [ 0, 0, -4, 3, -4, 0 ], [ 1, 0, -4, 3, -4, 0 ], [ 0, 1, -4, 3, -4, 0 ], [ 2, -1, -4, 3, -4, 0 ] ], 0.625 ] - ], - [ - [ [ [ -1, 1, -4, 3, -4, 0 ], [ 1, 0, -4, 3, -4, 0 ], [ 0, 1, -4, 3, -4, 0 ], [ 2, -1, -4, 3, -4, 0 ] ], 0.75 ], - [ [ [ -1, 1, -4, 3, -4, 0 ], [ 1, 0, -4, 3, -4, 0 ], [ 1, 0, -5, 3, -4, 0 ], [ 2, -1, -4, 3, -4, 0 ] ], 0.75 ] - ], - [ - [ [ [ -1, 1, -4, 3, -4, 0 ], [ 1, 0, -4, 3, -4, 0 ], [ 1, 0, -5, 3, -4, 0 ], [ 1, 1, -4, 3, -4, 0 ] ], 1.5 ], - [ [ [ -1, 1, -4, 3, -4, 0 ], [ 1, 0, -4, 3, -4, 0 ], [ 0, 0, -4, 4, -4, 0 ], [ 1, 1, -4, 3, -4, 0 ] ], 1.25 ], - [ [ [ -1, 0, -4, 3, -4, 0 ], [ 1, 0, -4, 3, -4, 0 ], [ 0, 0, -4, 4, -4, 0 ], [ 1, 1, -4, 3, -4, 0 ] ], 0.875 ] - ], - [ - [ [ [ -1, 0, -4, 4, -4, -1 ], [ 1, 0, -4, 3, -4, 0 ], [ 0, 0, -4, 4, -4, 0 ], [ 1, 1, -4, 3, -4, 0 ] ], 0.75 ], - [ [ [ -1, 0, -4, 4, -4, -1 ], [ 1, 0, -4, 3, -4, 0 ], [ 0, 0, -4, 4, -4, 0 ], [ 0, 1, -4, 4, -4, 0 ] ], 1 ], - [ [ [ -1, 0, -4, 4, -4, -1 ], [ 0, 0, -3, 4, -4, 0 ], [ 0, 0, -4, 4, -4, 0 ], [ 0, 1, -4, 4, -4, 0 ] ], 1.5 ] - ], - [ - [ [ [ -1, 0, -4, 4, -4, -1 ], [ 1, 0, -5, 4, -4, -1 ], [ 0, 0, -4, 4, -4, 0 ], [ 0, 1, -4, 4, -4, 0 ] ], 1.625 ], - [ [ [ -1, 0, -4, 4, -4, -1 ], [ 1, 0, -5, 4, -4, -1 ], [ 0, 0, -4, 4, -4, 0 ], [ 2, -1, -4, 4, -4, -1 ] ], 0.5 ], - [ [ [ -1, 0, -4, 4, -4, -1 ], [ 1, 0, -5, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 2, -1, -4, 4, -4, -1 ] ], 0.75 ] - ], - [ - [ [ [ -1, 0, -4, 4, -4, -1 ], [ 2, -2, -4, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 2, -1, -4, 4, -4, -1 ] ], 0.5 ], - [ [ [ 0, -1, -5, 4, -4, -1 ], [ 2, -2, -4, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 2, -1, -4, 4, -4, -1 ] ], 1.375 ], - [ [ [ 0, -1, -5, 4, -4, -1 ], [ 2, -2, -4, 4, -4, -1 ], [ 1, -1, -5, 4, -4, -1 ], [ 2, -1, -4, 4, -4, -1 ] ], 0.625 ] - ], - [ - [ [ [ 0, -1, -5, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 1, -1, -5, 4, -4, -1 ], [ 2, -1, -4, 4, -4, -1 ] ], 0.625 ], - [ [ [ 0, -1, -4, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 1, -1, -5, 4, -4, -1 ], [ 2, -1, -4, 4, -4, -1 ] ], 1 ], - [ [ [ 0, -1, -4, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 0, 0, -4, 4, -4, -1 ], [ 2, -1, -4, 4, -4, -1 ] ], 1 ] - ], - [ - [ [ [ 0, -1, -4, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 0, -1, -4, 5, -4, -1 ], [ 2, -1, -4, 4, -4, -1 ] ], 1 ], - [ [ [ 0, -2, -4, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 0, -1, -4, 5, -4, -1 ], [ 2, -1, -4, 4, -4, -1 ] ], 1.375 ] - ], - [ - [ [ [ 0, -2, -4, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 2, -2, -4, 4, -4, -1 ], [ 2, -1, -4, 4, -4, -1 ] ], 1.25 ], - [ [ [ 0, -2, -4, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 2, -2, -4, 4, -4, -1 ], [ 3, -3, -4, 4, -4, -1 ] ], 0.875 ] - ], - [ - [ [ [ 0, -3, -4, 4, -3, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 2, -2, -4, 4, -4, -1 ], [ 3, -3, -4, 4, -4, -1 ] ], 0.875 ] - ], - [ - [ [ [ 0, -2, -4, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 2, -2, -4, 4, -4, -1 ], [ 3, -3, -4, 4, -4, -1 ] ], 0.875 ], - [ [ [ 0, -2, -4, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 2, -2, -4, 4, -4, -1 ], [ 2, -1, -4, 4, -4, -1 ] ], 1.5 ], - [ [ [ 0, -2, -4, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 1, 0, -4, 4, -4, -1 ], [ 2, -1, -4, 4, -4, -1 ] ], 0.875 ] - ], - [ - [ [ [ 0, -2, -4, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 2, -3, -4, 4, -4, -1 ], [ 2, -1, -4, 4, -4, -1 ] ], 1.5 ], - [ [ [ 0, -2, -4, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 2, -3, -4, 4, -4, -1 ], [ 2, -2, -4, 4, -4, 0 ] ], 0.375 ] - ], - [ - [ [ [ 0, -2, -4, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 2, -3, -4, 4, -4, -1 ], [ 1, -1, -4, 5, -4, -1 ] ], 0.5 ], - [ [ [ 0, -2, -4, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 0, 0, -4, 4, -4, -1 ], [ 1, -1, -4, 5, -4, -1 ] ], 0.75 ] - ], - [ - [ [ [ 0, -2, -4, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 1, -1, -5, 4, -4, -1 ], [ 1, -1, -4, 5, -4, -1 ] ], 0.5 ] - ], - [ - [ [ [ 0, -2, -4, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 1, -2, -4, 4, -3, -1 ], [ 1, -1, -4, 5, -4, -1 ] ], 0.5 ], - [ [ [ 0, -2, -4, 4, -4, -1 ], [ 2, -2, -5, 4, -4, -1 ], [ 1, -2, -4, 4, -3, -1 ], [ 1, -1, -4, 5, -4, -1 ] ], 1.125 ], - [ [ [ 0, -2, -4, 4, -4, -1 ], [ 2, -2, -5, 4, -4, -1 ], [ 1, -2, -4, 4, -3, -1 ], [ 2, -1, -4, 4, -4, -1 ] ], 1.625 ] - ], - [ - [ [ [ 0, -2, -4, 4, -4, -1 ], [ 2, -2, -5, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 2, -1, -4, 4, -4, -1 ] ], 0.875 ] - ], - [ - [ [ [ 0, -2, -4, 4, -4, -1 ], [ 0, 0, -4, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 2, -1, -4, 4, -4, -1 ] ], 1.375 ], - [ [ [ -1, 0, -4, 4, -4, -1 ], [ 0, 0, -4, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 2, -1, -4, 4, -4, -1 ] ], 0.875 ] - ], - [ - [ [ [ -1, 0, -4, 4, -4, -1 ], [ 1, -1, -5, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 2, -1, -4, 4, -4, -1 ] ], 1.5 ], - [ [ [ -1, 0, -4, 4, -4, -1 ], [ 1, -1, -5, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 1, -1, -4, 5, -4, -1 ] ], 0.5 ], - [ [ [ 0, -1, -5, 4, -4, -1 ], [ 1, -1, -5, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 1, -1, -4, 5, -4, -1 ] ], 1.375 ] - ], - [ - [ [ [ 0, -1, -5, 4, -4, -1 ], [ 1, -1, -5, 4, -4, -1 ], [ 1, -1, -4, 4, -4, -1 ], [ 3, -1, -5, 4, -4, -2 ] ], 0.625 ], - [ [ [ 0, -1, -5, 4, -4, -1 ], [ 1, -1, -5, 4, -4, -1 ], [ 2, -2, -5, 4, -4, -1 ], [ 3, -1, -5, 4, -4, -2 ] ], 1.5 ] - ], - [ - [ [ [ 0, -1, -5, 4, -4, -1 ], [ 2, -3, -5, 4, -4, -1 ], [ 2, -2, -5, 4, -4, -1 ], [ 3, -1, -5, 4, -4, -2 ] ], 1.5 ], - [ [ [ 1, -2, -5, 4, -4, -2 ], [ 2, -3, -5, 4, -4, -1 ], [ 2, -2, -5, 4, -4, -1 ], [ 3, -1, -5, 4, -4, -2 ] ], 0.5 ], - [ [ [ 1, -2, -5, 4, -4, -2 ], [ 2, -3, -5, 4, -4, -1 ], [ 2, -2, -5, 4, -4, -1 ], [ 3, -2, -5, 4, -4, -1 ] ], 1.25 ] - ], - [ - [ [ [ 1, -2, -5, 4, -4, -2 ], [ 2, -2, -5, 4, -5, -1 ], [ 2, -2, -5, 4, -4, -1 ], [ 3, -2, -5, 4, -4, -1 ] ], 0.625 ], - [ [ [ 1, -3, -5, 4, -4, -1 ], [ 2, -2, -5, 4, -5, -1 ], [ 2, -2, -5, 4, -4, -1 ], [ 3, -2, -5, 4, -4, -1 ] ], 0.75 ], - [ [ [ 1, -3, -5, 4, -4, -1 ], [ 2, -2, -5, 4, -5, -1 ], [ 2, -3, -5, 4, -4, -1 ], [ 3, -2, -5, 4, -4, -1 ] ], 1.625 ] - ], - [ - [ [ [ 1, -2, -5, 4, -5, -1 ], [ 2, -2, -5, 4, -5, -1 ], [ 2, -3, -5, 4, -4, -1 ], [ 3, -2, -5, 4, -4, -1 ] ], 1.5 ], - [ [ [ 1, -2, -5, 4, -5, -1 ], [ 2, -2, -5, 4, -5, -1 ], [ 3, -2, -5, 4, -5, -1 ], [ 3, -2, -5, 4, -4, -1 ] ], 0.5 ], - [ [ [ 1, -2, -5, 4, -5, -1 ], [ 2, -2, -5, 4, -5, -1 ], [ 3, -2, -5, 4, -5, -1 ], [ 3, -2, -4, 4, -5, -1 ] ], 1.5 ] - ], - [ - [ [ [ 1, -2, -5, 4, -5, -1 ], [ 2, -2, -5, 4, -5, -1 ], [ 2, -2, -4, 4, -5, -1 ], [ 3, -2, -4, 4, -5, -1 ] ], 1.375 ], - [ [ [ 1, -2, -5, 4, -5, -1 ], [ 1, -2, -4, 5, -5, -1 ], [ 2, -2, -4, 4, -5, -1 ], [ 3, -2, -4, 4, -5, -1 ] ], 0.625 ], - [ [ [ 0, -2, -4, 5, -5, -1 ], [ 1, -2, -4, 5, -5, -1 ], [ 2, -2, -4, 4, -5, -1 ], [ 3, -2, -4, 4, -5, -1 ] ], 0.75 ] - ], - [ - [ [ [ 0, -2, -4, 5, -5, -1 ], [ 1, -1, -4, 4, -5, -1 ], [ 2, -2, -4, 4, -5, -1 ], [ 3, -2, -4, 4, -5, -1 ] ], 0.875 ], - [ [ [ 0, -2, -4, 5, -5, -1 ], [ 1, -1, -4, 4, -5, -1 ], [ 2, -2, -4, 4, -5, -1 ], [ 4, -2, -4, 3, -5, -1 ] ], 1 ] - ], - [ - [ [ [ 1, -2, -4, 4, -5, -1 ], [ 1, -1, -4, 4, -5, -1 ], [ 2, -2, -4, 4, -5, -1 ], [ 4, -2, -4, 3, -5, -1 ] ], 0.75 ] - ], - [ - [ [ [ 1, -2, -4, 4, -5, -1 ], [ 1, -1, -4, 4, -5, -1 ], [ 2, -2, -4, 4, -5, -1 ], [ 2, -1, -4, 4, -4, -1 ] ], 0.75 ] - ], - [ - [ [ [ 1, -2, -4, 4, -5, -1 ], [ 2, -1, -4, 4, -5, -1 ], [ 2, -2, -4, 4, -5, -1 ], [ 2, -1, -4, 4, -4, -1 ] ], 0.875 ], - [ [ [ 1, -2, -4, 4, -5, -1 ], [ 2, -1, -4, 4, -5, -1 ], [ 1, -1, -4, 4, -5, -1 ], [ 2, -1, -4, 4, -4, -1 ] ], 1.25 ], - [ [ [ 0, -1, -4, 4, -5, -1 ], [ 2, -1, -4, 4, -5, -1 ], [ 1, -1, -4, 4, -5, -1 ], [ 2, -1, -4, 4, -4, -1 ] ], 1.125 ] - ], - [ - [ [ [ 1, -1, -4, 3, -5, -1 ], [ 2, -1, -4, 4, -5, -1 ], [ 1, -1, -4, 4, -5, -1 ], [ 2, -1, -4, 4, -4, -1 ] ], 1 ], - [ [ [ 1, -1, -4, 3, -5, -1 ], [ 2, -1, -4, 4, -5, -1 ], [ 1, -1, -4, 4, -5, -1 ], [ 2, 0, -4, 4, -5, -1 ] ], 1.375 ] - ], - [ - [ [ [ 0, -1, -3, 4, -5, -1 ], [ 2, -1, -4, 4, -5, -1 ], [ 1, -1, -4, 4, -5, -1 ], [ 2, 0, -4, 4, -5, -1 ] ], 0.75 ], - [ [ [ 0, -1, -3, 4, -5, -1 ], [ 2, -1, -4, 4, -5, -1 ], [ 2, -1, -4, 3, -5, -1 ], [ 2, 0, -4, 4, -5, -1 ] ], 1.5 ], - [ [ [ 0, -1, -3, 4, -5, -1 ], [ 2, -1, -4, 4, -5, -1 ], [ 2, -1, -4, 3, -5, -1 ], [ 3, -2, -4, 4, -5, -1 ] ], 0.5 ] - ], - [ - [ [ [ 1, -2, -4, 4, -5, -1 ], [ 2, -1, -4, 4, -5, -1 ], [ 2, -1, -4, 3, -5, -1 ], [ 3, -2, -4, 4, -5, -1 ] ], 1.375 ], - [ [ [ 1, -2, -4, 4, -5, -1 ], [ 2, -1, -4, 4, -5, -1 ], [ 2, -2, -4, 4, -5, -1 ], [ 3, -2, -4, 4, -5, -1 ] ], 0.875 ], - [ [ [ 1, -2, -4, 4, -5, -1 ], [ 3, -2, -5, 4, -5, -1 ], [ 2, -2, -4, 4, -5, -1 ], [ 3, -2, -4, 4, -5, -1 ] ], 0.5 ] - ], - [ - [ [ [ 1, -2, -4, 4, -5, -1 ], [ 3, -2, -5, 4, -5, -1 ], [ 2, -2, -4, 4, -5, -1 ], [ 4, -3, -5, 4, -5, -1 ] ], 0.875 ] - ], - [ - [ [ [ 1, -2, -4, 4, -5, -1 ], [ 2, -2, -4, 5, -5, -1 ], [ 2, -2, -4, 4, -5, -1 ], [ 4, -3, -5, 4, -5, -1 ] ], 1 ], - [ [ [ 2, -3, -5, 4, -5, -1 ], [ 2, -2, -4, 5, -5, -1 ], [ 2, -2, -4, 4, -5, -1 ], [ 4, -3, -5, 4, -5, -1 ] ], 1.5 ] - ], - [ - [ [ [ 2, -3, -5, 4, -5, -1 ], [ 2, -2, -4, 5, -5, -1 ], [ 2, -2, -4, 4, -5, -1 ], [ 3, -3, -4, 5, -5, -1 ] ], 1.375 ], - [ [ [ 1, -3, -4, 5, -5, -1 ], [ 2, -2, -4, 5, -5, -1 ], [ 2, -2, -4, 4, -5, -1 ], [ 3, -3, -4, 5, -5, -1 ] ], 1.25 ], - [ [ [ 1, -3, -4, 5, -5, -1 ], [ 2, -2, -4, 5, -5, -1 ], [ 2, -3, -4, 5, -5, -1 ], [ 3, -3, -4, 5, -5, -1 ] ], 0.5 ] - ], - [ - [ [ [ 1, -3, -4, 5, -5, -1 ], [ 2, -2, -4, 5, -5, -1 ], [ 1, -2, -4, 5, -5, -1 ], [ 3, -3, -4, 5, -5, -1 ] ], 0.75 ], - [ [ [ 1, -3, -4, 5, -5, -1 ], [ 2, -3, -4, 5, -5, -1 ], [ 1, -2, -4, 5, -5, -1 ], [ 3, -3, -4, 5, -5, -1 ] ], 1.5 ] - ], - [ - [ [ [ 1, -3, -4, 5, -5, -1 ], [ 2, -4, -4, 5, -5, -1 ], [ 1, -2, -4, 5, -5, -1 ], [ 3, -3, -4, 5, -5, -1 ] ], 1.75 ], - [ [ [ 1, -3, -4, 5, -5, -1 ], [ 2, -4, -4, 5, -5, -1 ], [ 2, -3, -5, 5, -5, -1 ], [ 3, -3, -4, 5, -5, -1 ] ], 1.125 ], - [ [ [ 1, -4, -4, 5, -5, -1 ], [ 2, -4, -4, 5, -5, -1 ], [ 2, -3, -5, 5, -5, -1 ], [ 3, -3, -4, 5, -5, -1 ] ], 1.75 ] - ], - [ - [ [ [ 2, -4, -4, 4, -5, -1 ], [ 2, -4, -4, 5, -5, -1 ], [ 2, -3, -5, 5, -5, -1 ], [ 3, -3, -4, 5, -5, -1 ] ], 1.25 ], - [ [ [ 2, -4, -4, 4, -5, -1 ], [ 2, -4, -4, 5, -5, -1 ], [ 2, -3, -5, 5, -5, -1 ], [ 3, -3, -5, 5, -5, -1 ] ], 1.5 ] - ], - [ - [ [ [ 1, -3, -5, 5, -5, -1 ], [ 2, -4, -4, 5, -5, -1 ], [ 2, -3, -5, 5, -5, -1 ], [ 3, -3, -5, 5, -5, -1 ] ], 1.375 ], - [ [ [ 1, -3, -5, 5, -5, -1 ], [ 3, -4, -5, 5, -5, -1 ], [ 2, -3, -5, 5, -5, -1 ], [ 3, -3, -5, 5, -5, -1 ] ], 1.625 ] - ], - [ - [ [ [ 1, -4, -5, 5, -5, -1 ], [ 3, -4, -5, 5, -5, -1 ], [ 2, -3, -5, 5, -5, -1 ], [ 3, -3, -5, 5, -5, -1 ] ], 1 ] - ], - [ - [ [ [ 1, -4, -5, 5, -5, -1 ], [ 3, -4, -5, 5, -5, -1 ], [ 3, -4, -6, 5, -5, -1 ], [ 3, -3, -5, 5, -5, -1 ] ], 1 ] - ], - [ - [ [ [ 1, -4, -5, 5, -5, -1 ], [ 3, -4, -5, 5, -5, -1 ], [ 3, -3, -6, 5, -5, -1 ], [ 3, -3, -5, 5, -5, -1 ] ], 1.75 ] - ], - [ - [ [ [ 1, -4, -5, 5, -5, -1 ], [ 3, -4, -5, 5, -5, -1 ], [ 4, -5, -5, 5, -5, -1 ], [ 3, -3, -5, 5, -5, -1 ] ], 1.375 ], - [ [ [ 1, -4, -5, 5, -5, -1 ], [ 3, -4, -5, 5, -5, -1 ], [ 4, -5, -5, 5, -5, -1 ], [ 4, -4, -6, 5, -5, -1 ] ], 0.75 ] - ], - [ - [ [ [ 1, -4, -5, 5, -5, -1 ], [ 3, -4, -5, 5, -5, -1 ], [ 3, -3, -5, 5, -5, -1 ], [ 4, -4, -6, 5, -5, -1 ] ], 1.5 ] - ], - [ - [ [ [ 1, -4, -5, 5, -5, -1 ], [ 3, -4, -5, 5, -5, -1 ], [ 3, -4, -5, 6, -5, -1 ], [ 4, -4, -6, 5, -5, -1 ] ], 1.375 ], - [ [ [ 1, -4, -5, 5, -5, -1 ], [ 3, -5, -5, 5, -5, -1 ], [ 3, -4, -5, 6, -5, -1 ], [ 4, -4, -6, 5, -5, -1 ] ], 1.375 ], - [ [ [ 1, -4, -5, 5, -5, -1 ], [ 3, -5, -5, 5, -5, -1 ], [ 3, -4, -5, 6, -5, -1 ], [ 2, -4, -5, 5, -5, 0 ] ], 1.25 ] - ], - [ - [ [ [ 1, -5, -5, 5, -5, 0 ], [ 3, -5, -5, 5, -5, -1 ], [ 3, -4, -5, 6, -5, -1 ], [ 2, -4, -5, 5, -5, 0 ] ], 0.5 ], - [ [ [ 1, -5, -5, 5, -5, 0 ], [ 3, -5, -5, 5, -5, -1 ], [ 4, -4, -5, 4, -5, 0 ], [ 2, -4, -5, 5, -5, 0 ] ], 1 ] - ], - [ - [ [ [ 2, -5, -5, 4, -5, 0 ], [ 3, -5, -5, 5, -5, -1 ], [ 4, -4, -5, 4, -5, 0 ], [ 2, -4, -5, 5, -5, 0 ] ], 1.375 ], - [ [ [ 2, -5, -5, 4, -5, 0 ], [ 2, -3, -5, 4, -5, 0 ], [ 4, -4, -5, 4, -5, 0 ], [ 2, -4, -5, 5, -5, 0 ] ], 1 ] - ], - [ - [ [ [ 2, -5, -5, 4, -5, 0 ], [ 2, -3, -5, 4, -5, 0 ], [ 4, -4, -5, 4, -5, 0 ], [ 3, -4, -5, 4, -5, 0 ] ], 1.625 ] - ], - [ - [ [ [ 1, -4, -5, 4, -5, 0 ], [ 2, -3, -5, 4, -5, 0 ], [ 4, -4, -5, 4, -5, 0 ], [ 3, -4, -5, 4, -5, 0 ] ], 1.375 ], - [ [ [ 1, -4, -5, 4, -5, 0 ], [ 2, -3, -5, 4, -5, 0 ], [ 4, -4, -5, 4, -5, 0 ], [ 2, -2, -5, 4, -5, 0 ] ], 1.75 ] - ], - [ - [ [ [ 2, -4, -5, 3, -5, 0 ], [ 2, -3, -5, 4, -5, 0 ], [ 4, -4, -5, 4, -5, 0 ], [ 2, -2, -5, 4, -5, 0 ] ], 1.375 ], - [ [ [ 2, -4, -5, 3, -5, 0 ], [ 3, -4, -6, 4, -5, 0 ], [ 4, -4, -5, 4, -5, 0 ], [ 2, -2, -5, 4, -5, 0 ] ], 1.25 ], - [ [ [ 2, -4, -5, 3, -5, 0 ], [ 3, -4, -6, 4, -5, 0 ], [ 4, -4, -5, 4, -5, 0 ], [ 3, -4, -4, 4, -5, 0 ] ], 0.75 ] - ], - [ - [ [ [ 2, -4, -5, 3, -5, 0 ], [ 3, -4, -6, 4, -5, 0 ], [ 4, -4, -6, 4, -5, 0 ], [ 3, -4, -4, 4, -5, 0 ] ], 1.125 ], - [ [ [ 2, -4, -5, 3, -5, 0 ], [ 3, -4, -6, 4, -5, 0 ], [ 4, -4, -6, 4, -5, 0 ], [ 4, -4, -6, 3, -5, 0 ] ], 0.875 ] - ], - [ - [ [ [ 2, -4, -5, 3, -5, 0 ], [ 3, -4, -7, 4, -5, 0 ], [ 4, -4, -6, 4, -5, 0 ], [ 4, -4, -6, 3, -5, 0 ] ], 1.375 ], - [ [ [ 3, -5, -6, 3, -5, 0 ], [ 3, -4, -7, 4, -5, 0 ], [ 4, -4, -6, 4, -5, 0 ], [ 4, -4, -6, 3, -5, 0 ] ], 1.75 ] - ], - [ - [ [ [ 3, -5, -6, 3, -5, 0 ], [ 3, -4, -7, 4, -5, 0 ], [ 5, -5, -7, 4, -5, 0 ], [ 4, -4, -6, 3, -5, 0 ] ], 1.125 ], - [ [ [ 3, -5, -6, 3, -5, 0 ], [ 3, -4, -7, 4, -5, 0 ], [ 5, -5, -7, 4, -5, 0 ], [ 5, -5, -7, 3, -5, 0 ] ], 1.5 ] - ], - [ - [ [ [ 3, -5, -6, 3, -5, 0 ], [ 3, -4, -7, 4, -5, 0 ], [ 5, -5, -7, 4, -5, 0 ], [ 4, -5, -6, 4, -5, 0 ] ], 0.625 ], - [ [ [ 3, -5, -6, 3, -5, 0 ], [ 5, -5, -6, 2, -5, 0 ], [ 5, -5, -7, 4, -5, 0 ], [ 4, -5, -6, 4, -5, 0 ] ], 1.375 ], - [ [ [ 3, -5, -6, 3, -5, 0 ], [ 5, -5, -6, 2, -5, 0 ], [ 5, -4, -6, 3, -5, 0 ], [ 4, -5, -6, 4, -5, 0 ] ], 1.375 ] - ], - [ - [ [ [ 3, -5, -6, 3, -5, 0 ], [ 5, -5, -6, 2, -5, 0 ], [ 5, -4, -6, 3, -5, 0 ], [ 5, -5, -6, 3, -5, 0 ] ], 0.75 ] - ], - [ - [ [ [ 3, -5, -6, 3, -5, 0 ], [ 5, -5, -6, 2, -5, 0 ], [ 5, -4, -6, 3, -5, 0 ], [ 6, -5, -6, 2, -5, 0 ] ], 0.5 ], - [ [ [ 4, -5, -6, 2, -5, 0 ], [ 5, -5, -6, 2, -5, 0 ], [ 5, -4, -6, 3, -5, 0 ], [ 6, -5, -6, 2, -5, 0 ] ], 1.125 ] - ], - [ - [ [ [ 4, -5, -6, 2, -5, 0 ], [ 5, -5, -6, 2, -5, 0 ], [ 5, -4, -6, 3, -5, 0 ], [ 4, -4, -6, 3, -5, 0 ] ], 1.25 ], - [ [ [ 4, -5, -6, 2, -5, 0 ], [ 4, -4, -7, 3, -5, 0 ], [ 5, -4, -6, 3, -5, 0 ], [ 4, -4, -6, 3, -5, 0 ] ], 1.25 ], - [ [ [ 4, -5, -6, 2, -5, 0 ], [ "Rest" ], [ 5, -4, -6, 3, -5, 0 ], [ 4, -4, -6, 3, -5, 0 ] ], 0.5 ], - [ [ [ "Rest" ], [ "Rest" ], [ 5, -4, -6, 3, -5, 0 ], [ 4, -4, -6, 3, -5, 0 ] ], 1.75 ], - [ [ [ "Rest" ], [ "Rest" ], [ "Rest" ], [ 4, -4, -6, 3, -5, 0 ] ], 1.125 ], - [ [ [ "Rest" ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 7.25 ] - ] - ] -], -"last_changes": -[ - [ [ 3, -5, -6, 3, -5, 0 ], [ 5, -5, -6, 2, -5, 0 ], [ 5, -4, -6, 3, -5, 0 ], [ 5, -5, -6, 3, -5, 0 ] ], - [ [ 3, -5, -6, 3, -5, 0 ], [ 5, -5, -6, 2, -5, 0 ], [ 5, -4, -6, 3, -5, 0 ], [ 6, -5, -6, 2, -5, 0 ] ], - [ [ 4, -5, -6, 2, -5, 0 ], [ 5, -5, -6, 2, -5, 0 ], [ 5, -4, -6, 3, -5, 0 ], [ 6, -5, -6, 2, -5, 0 ] ], - [ [ 4, -5, -6, 2, -5, 0 ], [ 5, -5, -6, 2, -5, 0 ], [ 5, -4, -6, 3, -5, 0 ], [ 4, -4, -6, 3, -5, 0 ] ], - [ [ 4, -5, -6, 2, -5, 0 ], [ 4, -4, -7, 3, -5, 0 ], [ 5, -4, -6, 3, -5, 0 ], [ 4, -4, -6, 3, -5, 0 ] ] -], -"cur_uid": "75316bf0", -"ref_uid": "55bd25a1", -"order_seed": 144453, -"dur_seed": 681001, -"motifs_seed": 933698, -"entrances_probs_vals": [ 0, 0, 0, 0.41, 1.84, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"passages_probs_vals": [ 0, 0, 0, 0.41, 1.84, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"exits_probs_vals": [ 0, 0, 0, 0.41, 1.84, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"ranges": [ [ -2430, -293 ], [ -869, 1211 ], [ -832, 1285 ], [ -702, 1211 ] ], -"step_probs_vals": [ -1200, 1200, 0.0020576131687243, 0.068181818181818, 0.074074074074074, 0.0625, 0.20576131687243, 0.0625, 0.45679012345679, 0.011363636363636, 0.53086419753086, 0, 0.54320987654321, 0.92045454545455, 0.58641975308642, 0.92613636363636, 0.61316872427983, 0, 0.98971193415638, 0 ], -"passages_weights": [ 0.48, 0.46, 0.48, 1, 1 ], -"hd_exp": 9, -"hd_invert": 0, -"order": -[ - [ [ 1 ], [ 2, 3, 0 ], [ ] ], - [ [ 0, 2 ], [ 3, 1 ], [ ] ], - [ [ 1, 0 ], [ 2, 3 ], [ ] ], - [ [ 1, 3 ], [ 0, 2 ], [ ] ], - [ [ 0, 2 ], [ 3, 1 ], [ ] ], - [ [ 3, 0 ], [ 1, 2 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 3 ], [ 1, 2, 0 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 1 ], [ 0, 2, 3 ], [ ] ], - [ [ 3, 0, 1 ], [ 2 ], [ ] ], - [ [ 0, 2 ], [ 3, 1 ], [ ] ], - [ [ 0, 1 ], [ 3, 2 ], [ ] ], - [ [ 2, 1, 3 ], [ 0 ], [ ] ], - [ [ 2, 3 ], [ 1, 0 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 1, 3, 0 ], [ 2 ], [ ] ], - [ [ 3, 0, 1 ], [ 2 ], [ ] ], - [ [ 1 ], [ 2, 0, 3 ], [ ] ], - [ [ 3 ], [ 1, 2, 0 ], [ ] ], - [ [ 2, 1 ], [ 3, 0 ], [ ] ], - [ [ 0, 1 ], [ 3, 2 ], [ ] ], - [ [ 1, 0 ], [ 2, 3 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 3 ], [ 0, 2, 1 ], [ ] ], - [ [ 1 ], [ 0, 3, 2 ], [ ] ], - [ [ 1 ], [ 2, 3, 0 ], [ ] ], - [ [ 0 ], [ 2, 1, 3 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 0, 1 ], [ 3, 2 ], [ ] ], - [ [ 2, 0 ], [ 3, 1 ], [ ] ], - [ [ 3 ], [ 1, 0, 2 ], [ ] ], - [ [ 2 ], [ 1, 0, 3 ], [ ] ], - [ [ 1, 0 ], [ 2, 3 ], [ ] ], - [ [ 0 ], [ 1, 3, 2 ], [ ] ], - [ [ 0, 3 ], [ 1, 2 ], [ ] ], - [ [ 0 ], [ 1, 3, 2 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 2 ], [ 1, 0, 3 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 2, 3 ], [ 1, 0 ], [ ] ], - [ [ 1 ], [ 3, 2, 0 ], [ ] ], - [ [ 2, 0, 3 ], [ 1 ], [ ] ], - [ [ 3, 1 ], [ 0, 2 ], [ ] ], - [ [ 3, 1 ], [ 0, 2 ], [ ] ], - [ [ 1 ], [ 3, 2, 0 ], [ ] ], - [ [ 2 ], [ 0, 3, 1 ], [ ] ], - [ [ 0 ], [ 1, 3, 2 ], [ ] ], - [ [ 3 ], [ 1, 0, 2 ], [ ] ], - [ [ 3 ], [ 1, 0, 2 ], [ ] ], - [ [ 1, 3 ], [ 2, 0 ], [ ] ], - [ [ 1, 0 ], [ 2, 3 ], [ ] ], - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 1 ], [ 0, 3, 2 ], [ ] ], - [ [ 0, 1 ], [ 2, 3 ], [ ] ], - [ [ 1, 0 ], [ 3, 2 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 0 ], [ 2, 1, 3 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 3, 2 ], [ 1, 0 ], [ ] ], - [ [ 2 ], [ 1, 3, 0 ], [ ] ], - [ [ 0, 1 ], [ 3, 2 ], [ ] ], - [ [ 2 ], [ 1, 0, 3 ], [ ] ], - [ [ 3 ], [ 1, 0, 2 ], [ ] ], - [ [ 1 ], [ 0, 2, 3 ], [ ] ], - [ [ 3 ], [ 2, 1, 0 ], [ ] ], - [ [ 2, 0 ], [ 1, 3 ], [ ] ], - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 2, 0, 1 ], [ 3 ], [ ] ], - [ [ 3 ], [ 1, 2, 0 ], [ ] ], - [ [ 2, 1 ], [ 0, 3 ], [ ] ], - [ [ 1 ], [ 0, 2, 3 ], [ ] ], - [ [ 3 ], [ 0, 2, 1 ], [ ] ], - [ [ 0, 1, 2 ], [ 3 ], [ ] ], - [ [ 3, 2 ], [ 1, 0 ], [ ] ], - [ [ 1 ], [ 3, 0, 2 ], [ ] ], - [ [ 0, 3 ], [ 2, 1 ], [ ] ], - [ [ 3 ], [ 1, 2, 0 ], [ ] ], - [ [ 2, 1 ], [ 0, 3 ], [ ] ], - [ [ 3, 2 ], [ 0, 1 ], [ ] ], - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 0, 1 ], [ 2, 3 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 0 ], [ 2, 1, 3 ], [ ] ], - [ [ 3, 1 ], [ 0, 2 ], [ ] ], - [ [ 3, 2 ], [ 0, 1 ], [ ] ], - [ [ 0, 1, 2 ], [ 3 ], [ ] ], - [ [ 2, 1 ], [ 0, 3 ], [ ] ], - [ [ 2 ], [ 0, 1, 3 ], [ ] ], - [ [ 0, 1 ], [ 2, 3 ], [ ] ], - [ [ 3, 2 ], [ 1, 0 ], [ ] ], - [ [ 1, 0 ], [ 2, 3 ], [ ] ], - [ [ 0 ], [ 3, 1, 2 ], [ ] ], - [ [ 2, 1, 0 ], [ 3 ], [ ] ], - [ [ 1, 2 ], [ 3, 0 ], [ ] ], - [ [ 0, 2 ], [ 3, 1 ], [ ] ] -], -"sus_weights": [ 0.35, 0.37, 0.38 ], -"order_size": [ 100, 100 ], -"passages_size": [ 0, 0 ], -"motif_edited": "false", -"order_edited": "false" -} \ No newline at end of file diff --git a/resources/string_quartet_3/781442dc/781442dc_code.scd b/resources/string_quartet_3/781442dc/781442dc_code.scd deleted file mode 100644 index c194eef..0000000 --- a/resources/string_quartet_3/781442dc/781442dc_code.scd +++ /dev/null @@ -1,945 +0,0 @@ -( -// helper funcs -var hsArrayToCents, pDist, hdSum, hsChordalDistance, hsArrayToFreq; - -// score funcs -var isInRange, spacingScore, rangeScore, intervalScore, inclusionScore; - -// subroutines -var genTuples, initVoices, genOrders, genSubMotif, updateVoices, genDurFunc, genStepFunc; - -// primary routines -var genMotif, genSecondarySeq; - -// audition funcs -var genPatterns, genMidiPatterns; - -// resource management funcs -var seedFunc, genUID, writeResources, stringifyToDepth, setSeeds, sanityCheck, -msgInterpret, loadLedgerFile, loadLedgerJSON, loadModelFile, loadModelJSON, -setGlobalVars, globalVarsToDict, saveLedger; - -// model vars -//(model and global vars mostly set by OSC funcs -var seq, lastXChanges, -curUID, refUID, orderSeed, durSeed, motifSeed, -entrancesProbVals, passagesProbVals, exitsProbVals, -ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, -orders, susWeights, orderSize, passagesSize, -motifEdited, orderEdited; - -// model aux vars -var entrancesDurFunc, passagesDurFunc, exitsDurFunc, stepFunc; - -// other global vars -var popSize, exPath, dir, primes, dims, tuples, -group, player, resourceDir, ledgerPath, ledger, currentlyPlayingUID, -nameSpaces; - -// install JSON quark (not used) -/* -if(Quarks.isInstalled("JSONlib").not, { - Quarks.install("https://github.com/musikinformatik/JSONlib.git"); - thisProcess.recompile; - //HelpBrowser.openHelpFor("Classes/JSONlib"); -}); -*/ - - -//------helper funcs - -hsArrayToCents = { - arg hsArray; - hsArray.collect({arg dist, p; dist * 1200 * log2(primes[p][0]/primes[p][1])}).sum -}; - -pDist = { - arg array1, array2, signed = false; - var pDistance; - pDistance = hsArrayToCents.value(array1) - hsArrayToCents.value(array2); - if(signed, {pDistance}, {abs(pDistance)}) -}; - -hdSum = { - arg hsArrays; - var size, distances, mean; - size = hsArrays.size; - distances = (size - 1).collect({arg i; - ((i + 1)..(size - 1)).collect({arg j; - abs(hsArrays[i] - hsArrays[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsChordalDistance = { - arg hsArrays1, hsArrays2; - var size, distances, mean; - size = hsArrays1.size; - distances = hsArrays1.size.collect({arg i; - hsArrays2.size.collect({arg j; - abs(hsArrays1[i] - hsArrays2[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsArrayToFreq = { - arg array; - array.collect({arg dim, d; pow(primes[d][0]/primes[d][1], dim)}).product -}; - -//------score funcs - -/* -isInRange = { - arg hsArray, min, max; - var cents; - cents = hsArrayToCents.value(hsArray); - (cents >= min) && (cents <= max) -}; -*/ - -spacingScore = { - arg hsArrays, min; - var centsArray; - centsArray = hsArrays.collect({arg hsArray; hsArrayToCents.value(hsArray)}).sort({arg a, b; a < b}); - centsArray.differentiate.drop(1).collect({arg pDistance; if(pDistance >= min, {1}, {0.01})}).sum; -}; - -rangeScore = { - arg hsArray1, hsArray2, min, max, low, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - if((pDistance >= min) && (pDistance <= max), {1}, {low}); -}; - -intervalScore = { - arg hsArray1, hsArray2, mean, sd, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - //pDistance.gaussCurve(1, mean, sd) - stepFunc.value(pDistance); -}; - -inclusionScore = { - arg array, test, min = 0.01; - if(array.collect({arg v; v.hash}).includes(test.hash), {min}, {1}); -}; - - -//------subroutines - -genTuples = { - var tuples; - tuples = dims.collect({[-1, 0, 1]}).allTuples.select({arg tuple; (abs(tuple.drop(1)).sum <= 1) && (tuple[0] == 0)}); - tuples = tuples ++ tuples.collect({arg tuple; [-3, -2, -1, 1, 2, 3].collect({arg octTrans; tuple.deepCopy.put(0, octTrans)})}).flatten; -}; - -initVoices = { - var init, voicesInit; - voicesInit = popSize.collect({dims.collect({0})}); - /* - voicesInit = [dims.collect({0})]; - (popSize - 1).do({ - arg rep, new; - rep = dims.rand; - new = voicesInit.last.deepCopy; - new[rep] = new[rep] + [-1, 1].choose(); - voicesInit = voicesInit.add(new); - }); - */ - voicesInit.deepCopy; -}; - -genDurFunc = {arg chordProb, minPad, maxPad, minDur, maxDur, envData, seed; - var env, pTable, durFunc; - env = Env.pairs([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).asSignal(256).asList.asArray; - pTable = env.asRandomTable; - [chordProb, minPad, maxPad, minDur, maxDur, envData].postln; - durFunc = {arg allowChord, pad = false; - var res; - res = if(allowChord.not, { - pTable.tableRand * (maxDur - minDur) + minDur - }, { - if(1.0.rand < chordProb, {0}, {pTable.tableRand * (maxDur - minDur) + minDur}); - }).round(0.125); - if(pad, {res = res + rrand(minPad.asFloat, maxPad.asFloat).round(0.125)}); - if(res.asInteger == res, {res = res.asInteger}); - res - }; - seedFunc.value(durFunc, seed); -}; - -genStepFunc = {arg minStep, maxStep, envData, seed; - var envDataNorm, env, pTable, stepFunc; - [minStep, maxStep, envData].postln; - envDataNorm = ([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).flop; - envDataNorm = [envDataNorm[0].normalize(minStep, maxStep), envDataNorm[1]].flop; - env = Env.pairs(envDataNorm); - stepFunc = {arg pDist; - env.at(pDist).clip(0.001, 1); - }; - seedFunc.value(stepFunc, seed); -}; - -genOrders = {arg minMotifLength = 1, maxMotifLength = 5, minProgLength = 0, maxProgLength = 5; - ((maxMotifLength - minMotifLength).rand + minMotifLength).collect({ - var noProgIns, noSusIns, noSilentIns, prog, sus, silent, order; - noSusIns = [1, 2, 3].wchoose(susWeights.normalizeSum); - noProgIns = (popSize - noSusIns).rand + 1; - noSilentIns = popSize - noSusIns - noProgIns; - - # prog, sus, silent = (0..(popSize-1)).scramble.clumps([noProgIns, noSusIns, noSilentIns]); - - prog = (prog.scramble ++ ((maxProgLength - minProgLength).rand + minProgLength).collect({prog.choose}).scramble); - if(silent == nil, {silent = []}); - [sus.scramble, prog, silent.scramble] - }); -}; - -updateVoices = {arg ins, sus; - var voices, candidates, nWeights, nProbs, sel; - - voices = lastXChanges.deepCopy.last; - - candidates = sus.collect({arg v; tuples.collect({arg t; voices[v] + t})}).flatten; - candidates = difference(candidates.asSet, voices.asSet).asList; - nProbs = candidates.collect({arg candidate; - var stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore; - - //stepScore = intervalScore.value(voices[ins], candidate, 30, 400, 0.1); - stepScore = intervalScore.value(voices[ins], candidate, 100, 100); - recentlySoundedScore = inclusionScore.value(lastXChanges.flop[ins], candidate, 0); - isInRangeScore = rangeScore.value(candidate, candidate.collect({0}), ranges[ins][0], ranges[ins][1], 0, true); - regScore = spacingScore.value(voices.deepCopy.put(ins, candidate), 300); - hdScore = pow(hdSum.value(voices.deepCopy.put(ins, candidate)), hdExp); - if(hdInvert == 0, {hdScore = 1/hdScore}); - //maybe what you want here is a vector to another root and then favoring movement towards it. - //distScore = pow(hsChordalDistance.value(voices, voices.put(ins, candidate)), 2); - - [stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore] - }); - - nWeights = passagesWeights; - - //this handles nWeights of 0; mainly for testing - nProbs = nProbs.flop.select({arg scores, s; nWeights[s] != 0}).flop; - nWeights = nWeights.select({arg weight; weight != 0}); - nProbs = nProbs.flop.collect({arg scores, s; - if(scores.sum == 0, {scores}, {scores.normalizeSum * nWeights[s]}) - }); - nProbs = nProbs.flop.collect({arg scores, s; scores.product}).normalizeSum; - - sel = candidates.wchoose(nProbs); - - voices[ins] = sel; - lastXChanges = lastXChanges.add(voices).keep(-5); -}; - -genSubMotif = {arg order, orderIndex, lastState, repeatLast = false, startFromLast = false, isLastOrder = false; - var sus, prog, silent, flatOrder, res, isInChord, allowChord, pad, lastXChangesHold, voices, adder; - # sus, prog, silent = order; - flatOrder = silent ++ sus ++ prog; - lastXChangesHold = lastXChanges.deepCopy; - voices = lastState.deepCopy; - isInChord = popSize.collect({false}); - allowChord = false; - pad = false; - res = []; - "------generating motif".postln; - //need to figure out here if voices move between motifs - flatOrder.do({arg ins, i; - - if(prog.includes(ins) && repeatLast.not, {updateVoices.value(ins, sus)}); - adder = if(silent.includes(ins), {["Rest"]}, {lastXChanges.last.deepCopy[ins]}); - - if(voices[ins] != adder, { - var dur; - - if((sus ++ silent).includes(ins), { - allowChord = (ins != sus.last); - pad = (ins == sus.last); - }, { - if(i < (flatOrder.size - 1), { - allowChord = (isInChord[flatOrder[i + 1]] || (ins == flatOrder[i + 1])).not; - pad = false; - }, { - allowChord = false; - pad = true - }); - }); - if((orderIndex == 0) && sus.includes(ins), { - dur = entrancesDurFunc.value(allowChord, pad); - }, { - dur = passagesDurFunc.value(allowChord, pad); - }); - if(dur == 0, {isInChord[ins] = true}, {isInChord = popSize.collect({false})}); - - voices[ins] = adder; - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - - // pad ending - if(orderIndex == (orders.size - 1), { - (0..(popSize-1)).scramble.do({arg ins; - if(res.last.first[ins] != ["Rest"], { - var dur; - voices[ins] = ["Rest"]; - allowChord = (voices != popSize.collect({["Rest"]})); - pad = allowChord.not; - dur = exitsDurFunc.value(allowChord, pad); - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - }); - - //format and return - if(startFromLast, {lastXChanges = lastXChangesHold.deepCopy}); - res; -}; - - -//------primary routines - -genMotif = { - var repeats, fSeq, fDur, durAdd; - - repeats = 1; - fSeq = []; - - repeats.do({arg index; - var motif; - - motif = []; - - orders.do({arg order, o; - var lastState, subMotif; - lastState = if(o == 0, {popSize.collect({["Rest"]})}, {motif.last.last.first}); - subMotif = genSubMotif.value(order, o, lastState, isLastOrder: o == (orders.size - 1)); - motif = motif.add(subMotif); - - }); - - sanityCheck.value(motif, index); - - fSeq = fSeq.add(motif); - }); - - //round last duration to measure - fDur = fSeq.flatten.flatten.slice(nil, 1).sum; - durAdd = fDur.round(4) - fDur; - if(durAdd < 0, {durAdd = 4 - durAdd}); - fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] = fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] + durAdd; - - fSeq -}; - -genSecondarySeq = {arg seq; - var curdles, fSeq; - curdles = []; - while({curdles.sum < seq.size}, {curdles = curdles ++ [3.rand + 1]}); - - fSeq = seq.clumps(curdles).collect({arg clump, m; - var repeats, paddedSeq; - - //add rest - paddedSeq = clump.add([[[popSize.collect({["Rest"]}), 0.5.rand]]]); - - //implement repeats - repeats = [0.rand + 1, 1].wchoose([1, 0].normalizeSum); - repeats.collect({paddedSeq}); - }); - fSeq -}; - - -//------audition funcs - -/* -Event.addEventType(\osc, { - if (~addr.postln.notNil) { - ~addr.sendMsg(~indexPath, ~indexMsg); - ~addr.sendMsg(~seqPath, stringifyToDepth.value(~seqMsg, 3)); - //~addr.sendMsg("/STATE/OPEN", (dir.replace("supercollider", "resources") +/+ ~idMsg +/+ ~idMsg ++ "_gui_state" ++ ".state").standardizePath.postln); - }; -}); -*/ - -Event.addEventType(\osc, { - if (~addr.notNil) { - ~msg; - ~addr.sendMsg(~path, *~msg); - }; -}); - -genPatterns = {arg inSeq, addr, oneShot = false; - var voices, durs, pbinds, res, indices, sectionDurs, msg, ids, seq; - seq = inSeq.collect({arg mSeq; mSeq[0]}); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - pbinds = voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs, attacks, rels, amps; - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - //attacks = 2.collect({rrand(1, 3)}) ++ freqs.drop(2).collect({rrand(0.3, 0.5)}); - attacks = fDurs.collect({arg dur; dur * rrand(0.2, 0.4)}); - //rels = freqs.drop(2).collect({rrand(0.3, 0.5)}) ++ 2.collect({rrand(1, 3)}); - rels = (clumps.size - 1).collect({arg c; - if(clumps[c + 1][0] == ["Rest"], {rrand(1.0, 3.0)}, {rrand(0.3, 0.5)}); - }); - rels = rels.add(rrand(1.0, 3.0)); - amps = freqs.collect({rrand(0.6, 0.99)}); - - [ - Pbind( - \instrument, \string_model, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \attack, Pseq(attacks, 1), - \sustain, Pseq(fDurs, 1), - \release, Pseq(rels, 1), - //\amp, Pseq(amps, 1), - \amp, Pbrown(0.5, 1, 0.5), - \busIndex, v - ), - Pbind( - \instrument, \sine, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \sustain, Pseq(fDurs, 1), - \busIndex, v - ) - ] - }).flatten; - if(oneShot.not, { - msg = inSeq.collect({arg mSeq, m; mSeq[1..]}); - //ids = inSeq.collect({arg mSeq, m; mSeq[2]}); - sectionDurs = seq.collect({arg mSeq; mSeq.flatten2(mSeq.maxDepth - 5).flop[1].sum}); - pbinds = pbinds ++ - [ - Pbind( - \type, \osc, - \addr, addr, - \path, "/playing", - \msg, Pseq(msg, 1), - \dur, Pseq(sectionDurs, 1) - ); - ] - }); - res = Ppar(pbinds); - res -}; - -/* -genMidiPatterns = {arg seq; - var voices, durs, patterns, res, mOut, pbRange; - pbRange = 1; //semitones - change this as needed for your situation - mOut = MIDIOut.newByName("TiMidity", "TiMidity port 0").latency_(Server.default.latency); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - res = Ppar( - voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs; - - mOut.program(v, 70); - - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - - Pbind( - \type, \midi, - \chan, v, - \noteval, Pseq(freqs.cpsmidi - 24, 1), - \note, Pfunc({ | event | event[\noteval].floor }), - \dur, Pseq(fDurs, 1), - \midiout, mOut, - \amp, 1, - \bend, Pfunc({ - | event | - if (event[\note].isRest.not) { - var pitchbendvalue = event[\noteval].frac.linlin(0, pbRange, 8192, 8192*2).asInteger; - m.bend(v, pitchbendvalue); - }; - 0; // return something other than nil to avoid stopping the pattern - }), - ); - }); - ); - res -}; -*/ - - -//------resource management funcs - -genUID = {Date.seed.asHexString.toLower}; - -seedFunc = {arg func, seed; - var funcArgs, next; - next = Routine({loop{func.valueArray(funcArgs).yield }}); - next.randSeed_(seed); - {arg ...args; funcArgs = args; next.value} -}; - -stringifyToDepth = {arg data, maxDepth = 1; - var prettyString = "", rCount = 0, writeArray, indent; - - if(maxDepth == 0, { - data.asCompileString - }, { - indent = {arg size; size.collect({" "}).join("")}; - writeArray = {arg array; - prettyString = prettyString ++ indent.value(rCount) ++ "[\n"; - rCount = rCount + 1; - if(rCount < maxDepth, { - array.do({arg subArray; writeArray.value(subArray)}); - }, { - prettyString = prettyString ++ array.collect({arg subArray; - indent.value(rCount + 1) ++ subArray.asCompileString - }).join(",\n"); - }); - rCount = rCount - 1; - prettyString = prettyString ++ "\n" ++ indent.value(rCount) ++ "],\n"; - }; - - writeArray.value(data); - prettyString.replace(",\n\n", "\n").drop(-2); - }) -}; - -sanityCheck = {arg motif, index; - //print functions = very helpful - ("----------" + index + "------------").postln; - - motif.flatten.do({arg val, v; - if(v > 0, { - if(motif.flatten[v-1][0].hammingDistance(val[0]) > 1, {"problem 1".postln}); - if(motif.flatten[v-1][0].hammingDistance(val[0]) == 0, {"problem 2".postln}); - }); - val.postln - }); - "***********".postln; -}; - -msgInterpret = {arg in, escapeDoubleQuotes = true, escapeSingleQuotes = true; - var res; - - res = in; - if(res.isNil.not, { - if((res.isArray && res.isString.not), { - res = res.asCompileString; - res = res.replace(" ", "").replace("\n", "").replace("\t", ""); - if(escapeSingleQuotes, {res = res.replace("\'", "")}); - if(escapeDoubleQuotes, {res = res.replace("\"", "")}); - res = res.replace("Rest", "\"Rest\""); - res = res.interpret; - }, { - var tmpRes; - if(res.every({arg char; char.isDecDigit}), {tmpRes = res.asInteger}); - if(res.contains("."), {tmpRes = res.asFloat}); - if(tmpRes != nil, {res = tmpRes}); - }); - }); - res -}; - -writeResources = {arg path, dict; - var file, modelItems, resString; - file = File(path,"w"); - - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - - resString = nameSpaces.collect({arg nameSpace; - var depth = 0, insert = " "; - if(nameSpace == "music_data", {depth = 3; insert = "\n"}); - if(nameSpace == "last_changes", {depth = 1; insert = "\n"}); - if(nameSpace == "order", {depth = 1; insert = "\n"}); - if((nameSpace == "ref_uid") && (dict[nameSpace] == nil), {dict[nameSpace] = "nil"}); - "\"" ++ nameSpace ++ "\":" ++ insert ++ stringifyToDepth.value(dict[nameSpace], depth) - }).join(",\n"); - - resString = "{\n" ++ resString ++ "\n}"; - - file.write(resString); - file.close; - resString -}; - -loadModelFile = {arg path; loadModelJSON.value(File(path, "r").readAllString.parseJSON)}; - -loadModelJSON = {arg jsonObject; - var dict; - dict = Dictionary.with(*nameSpaces.collect({arg nS; nS->msgInterpret.value(jsonObject[nS])})); - dict -}; - -setGlobalVars = {arg dict, skipLastXChanges = false; - var tmpLastXChanges; - tmpLastXChanges = lastXChanges.deepCopy; - // order really matters!!!! - # seq, lastXChanges, curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited = nameSpaces.collect({arg nS; dict[nS]}); - if(skipLastXChanges, {lastXChanges = tmpLastXChanges}); - dict -}; - -globalVarsToDict = { - var modelItems, dict; - // order really matters!!!! - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - dict = Dictionary.with(*nameSpaces.collect({arg nS, n; nS->modelItems[n]})); -}; - -loadLedgerFile = {arg path; - ledgerPath = path; - resourceDir = path.splitext(".").drop(-1).join; - loadLedgerJSON.value(File(ledgerPath, "r").readAllString.parseJSON) -}; - -loadLedgerJSON = {arg jsonObject; ledger = jsonObject["ledger"]}; - -saveLedger = {arg ledger, path; - var file, curResourceDir; - file = File(path, "w"); - curResourceDir = resourceDir; - resourceDir = path.splitext(".").drop(-1).join; - if(curResourceDir != resourceDir, { - File.mkdir(resourceDir); - ledger.do({arg id; - File.copy(curResourceDir +/+ id, resourceDir +/+ id); - }); - }); - file.write("{\n\"ledger\":\n" ++ stringifyToDepth.value(ledger, 1) ++ "\n}"); - file.close; -}; - -//------global vars - -primes = [[2, 1], [3, 2], [5, 4], [7, 4], [11, 8], [13, 8]]; -//ranges = [[-2400, 0], [-1200, 1200], [0, 2400], [0, 2400]]; -exPath = thisProcess.nowExecutingPath; -dir = exPath.dirname; -//popSize = 4; -dims = primes.size; -tuples = genTuples.value(); -//refUID = nil; -group = Group.new; -~group = group; -loadLedgerFile.value(dir +/+ ".." +/+ "resources" +/+ "piece_ledger.json"); -resourceDir = (dir +/+ ".." +/+ "resources" +/+ "piece_ledger"); -//passagesWeights = [1, 1, 1, 1, 1]; -//susWeights = [1, 1, 1]; -// order really matters!!!! -nameSpaces = [ - "music_data", "last_changes", "cur_uid", "ref_uid", "order_seed", "dur_seed", "motifs_seed", - "entrances_probs_vals","passages_probs_vals", "exits_probs_vals", - "ranges", "step_probs_vals", "passages_weights", "hd_exp", "hd_invert", - "order", "sus_weights", "order_size", "passages_size", - "motif_edited", "order_edited" -]; - - -//------OSC funcs - -OSCdef(\load_ledger, {arg msg, time, addr, port; - loadLedgerFile.value(msg[1].asString); -}, \load_ledger); - -OSCdef(\load_model, {arg msg, time, addr, port; - var dict; - dict = loadModelFile.value(msg[1].asString); - setGlobalVars.value(dict); -}, \load_model); - -OSCdef(\save_ledger, {arg msg, time, addr, port; - msg.postln; - ledger = msgInterpret.value(msg[1].asString.parseJSON["ledger"], false).postln; - //loadLedgerJSON.value(msg[0]) - saveLedger.value(ledger, msg[2].asString); - //loadLedgerFile.value(msg[1].asString); -}, \save_ledger); - -OSCdef(\generate, {arg msg, time, addr, port; - var path, dict, durSeeds, musPath, modelString; - msg.postln; - - path = msg[1].asString; - - dict = loadModelFile.value(path); - setGlobalVars.value(dict, true); - - popSize = ranges.size; - - //refUID.postln; - - loadLedgerFile.value(ledgerPath); - if(ledger == nil, {ledger = ["tmp"]}); - if(ledger.last != "tmp", {ledger = ledger.add("tmp")}); - - if(refUID == nil, {lastXChanges = [initVoices.value().deepCopy]}); - if((refUID != nil) && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - lastXChanges = msgInterpret.value(file.readAllString.parseJSON["last_changes"]); - }); - - refUID.postln; - lastXChanges.collect({arg item; item.postln}); - - durSeeds = seedFunc.value({3.collect({rrand(100000, 999999)})}, durSeed).value.postln; - entrancesDurFunc = genDurFunc.valueArray(entrancesProbVals[..4] ++ [entrancesProbVals[5..]] ++ [durSeeds[0]]); - passagesDurFunc = genDurFunc.valueArray(passagesProbVals[..4] ++ [passagesProbVals[5..]] ++ [durSeeds[1]]); - exitsDurFunc = genDurFunc.valueArray(exitsProbVals[..4] ++ [exitsProbVals[5..]] ++ [durSeeds[2]]); - - if(orders == nil, { - orders = seedFunc.value(genOrders, orderSeed).valueArray(orderSize ++ passagesSize); - //addr.sendMsg("/order", stringifyToDepth.value(orders, 1)); - }); - - stepFunc = genStepFunc.valueArray(stepProbsVals[..1] ++ [stepProbsVals[2..]] ++ [motifSeed]); - seq = seedFunc.value(genMotif, motifSeed).value; - - lastXChanges.collect({arg item; item.postln}); - - dict = globalVarsToDict.value; - modelString = writeResources.value(path, dict); - - //addr.sendMsg("/generated", musPath, stringifyToDepth.value(seq, 3)); - //~seq = seq; - - addr.sendMsg("/generated", path, modelString, ledgerPath); -}, \generate); - - -OSCdef(\commit, {arg msg, time, addr, port; - var musicData, musicChanged, dict, newLedger, modelPath, musString, musFile, test1, test2, lastCurUID, commitType, commitPos, equalityLedger; - //msg.postln; - - /* - test1 = msg[1].asString.parseJSON; - test2 = (dir +/+ ".." +/+ "resources/tmp/tmp_music" ++ ".json").standardizePath.parseJSONFile; - msgInterpret.value(test1["music"])[0][0][0][1].class.postln; - msgInterpret.value(test2["music_data"])[0][0][0][1].class.postln; - (test1["music"] == test2["music_data"]).postln; - */ - - musicData = loadModelJSON.value(msg[1].asString.parseJSON)["music_data"].postln; - musicChanged = (musicData != seq).postln; - commitType = msg[2].asString; - commitPos = msg[3].postln.asInteger; - - lastCurUID = curUID.deepCopy; - curUID = genUID.value; - - File.mkdir((resourceDir +/+ curUID).standardizePath); - File.copy(exPath, (resourceDir +/+ curUID +/+ curUID ++ "_code" ++ ".scd").standardizePath); - - modelPath = (resourceDir +/+ curUID +/+ curUID ++ "_mus_model" ++ ".json").standardizePath; - dict = globalVarsToDict.value; - if(musicChanged, { - seq = musicData; - dict["music_data"] = seq; - dict["motif_edited"] = "true" - }); - dict["cur_uid"] = curUID; - - writeResources.value(modelPath, dict); - - File.delete(ledgerPath ++ "_bak"); - File.copy(ledgerPath, ledgerPath ++ "_bak"); - File.delete(ledgerPath); - - /* - if(commitType == "add", { - if(lastCurUID == "tmp", { - ledger = ledger.drop(-1).add(curUID); - }, { - ledger = ledger.add(curUID); - }) - }); - */ - - ledger.postln; - - if(commitType == "add", {ledger = ledger.add(curUID)}); - - if(commitType == "insert", {ledger = ledger.insert(commitPos + 1, curUID)}); - - if(commitType == "replace", {ledger = ledger.put(commitPos, curUID)}); - - equalityLedger = ledger.collect({arg item; item.asSymbol}); - if(equalityLedger.includes(\tmp).postln, {ledger.removeAt(equalityLedger.indexOf(\tmp).postln)}); - - ledger.postln; - - saveLedger.value(ledger, ledgerPath); - - addr.sendMsg("/committed", curUID, ledgerPath); - //refUID = curUID; - -}, \commit); - -OSCdef(\transport, {arg msg, time, addr, port; - msg.postln; - if(msg[1] == 0, { - group.set(\release, 2); - group.set(\gate, 0); - player.stop; - }, { - // the cued sequence can now be read from file, so this can be cleaned up - var cSize, patterns, pSeq, cuedSeek, indexStart, indexEnd, tmpLedger; - if(msg[1] == 1, { - pSeq = []; - cuedSeek = (seq != nil); - indexStart = msg[2].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.postln.parseJSON["music_data"]), path, indexStart + index, uid]); - file.close; - }); - }); - if(cuedSeek, { - var path, file; - path = (resourceDir +/+ "tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - patterns = genPatterns.value(pSeq, addr); - }, { - pSeq = [loadModelJSON.value(msg[2].asString.parseJSON)["music_data"].postln]; - patterns = genPatterns.value(pSeq, addr, true); - }); - player = Pfset(pattern: patterns, cleanupFunc: { - addr.sendMsg("/transport", 0); - addr.sendMsg("/one_shot", 0); - }); - player = player.play - }); -}, \transport); - - -OSCdef(\transcribe_motif, {arg msg, time, addr, port; - var tSeq, refChord, refUID; - - msg.postln; - - tSeq = [loadModelJSON.value(msg[1].asString.parseJSON)["music_data"]]; - refUID = msg[2].asString.postln; - - if((refUID != "nil") && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }, { - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - }); - - ~transcribe.value(tSeq, refChord, (dir +/+ ".." +/+ "lilypond" +/+ "includes").standardizePath, addr, "/transcribe_motif"); -}, \transcribe_motif); - - -OSCdef(\transcribe_all, {arg msg, time, addr, port; - var cSize, patterns, cuedSeek, indexStart, indexEnd, tmpLedger; - if(true, { - cuedSeek = (seq != nil); - indexStart = msg[1].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - - //tmp for testing transcription - //indexEnd = (indexStart+5); - - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - var lilyPartLedgerFiles; - - lilyPartLedgerFiles = 4.collect({arg p; - File((dir +/+ ".." +/+ "lilypond" +/+ "includes" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly").standardizePath, "w"); - }); - - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file, fileString, tSeq, refUID, refChord; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - fileString = file.readAllString; - tSeq = msgInterpret.value(fileString.parseJSON["music_data"]); - refUID = msgInterpret.value(fileString.parseJSON["ref_uid"]); - file.close; - - //uid.postln; - //(refUID == "nil").postln; - - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - - if(refUID != "nil", { - path = (resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }); - - if(index != indexEnd, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath); - }, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath, addr, "/transcribe_all"); - }); - - lilyPartLedgerFiles.do({arg f, p; - f.write("\\include \"" ++ resourceDir +/+ uid +/+ "lilypond" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly\"\n"); - }); - - }); - - lilyPartLedgerFiles.do({arg f; - f.close - }); - }); - /* - if(cuedSeek, { - var path, file; - path = (dir +/+ ".." +/+ "resources/tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - */ - }, { - - }); - -}, \transcribe_all); - -) - - diff --git a/resources/string_quartet_3/781442dc/781442dc_mus_model.json b/resources/string_quartet_3/781442dc/781442dc_mus_model.json deleted file mode 100644 index d2de366..0000000 --- a/resources/string_quartet_3/781442dc/781442dc_mus_model.json +++ /dev/null @@ -1,117 +0,0 @@ -{ -"music_data": -[ - [ - [ - [ [ [ "Rest" ], [ "Rest" ], [ "Rest" ], [ 0, 0, 0, 0, 0, 0 ] ], 0.25 ], - [ [ [ "Rest" ], [ 0, 0, 0, 0, 0, 0 ], [ "Rest" ], [ 0, 0, 0, 0, 0, 0 ] ], 0.5 ], - [ [ [ "Rest" ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 0 ], - [ [ [ 1, 0, -1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 0.125 ], - [ [ [ 0, 0, 0, 0, 0, 1 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 0 ], - [ [ [ 0, 0, 0, 0, 0, 1 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 1, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1.375 ] - ], - [ - [ [ [ 0, 0, 0, 0, 0, 1 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 1, 0 ], [ 0, -1, 0, 0, 0, 1 ] ], 0 ], - [ [ [ 0, 0, 0, 0, 0, 1 ], [ -1, 0, 0, 0, 1, 1 ], [ 0, 0, 0, 0, 1, 0 ], [ 0, -1, 0, 0, 0, 1 ] ], 0 ], - [ [ [ 0, 0, 0, 0, 0, 1 ], [ -1, 0, 0, 0, 1, 1 ], [ -1, 0, 0, 1, 0, 1 ], [ 0, -1, 0, 0, 0, 1 ] ], 0.25 ], - [ [ [ 0, 0, 0, 0, 0, 1 ], [ -1, 0, 0, 0, 1, 1 ], [ -1, 0, 0, 1, 0, 1 ], [ 0, 0, 0, 0, -1, 1 ] ], 0 ], - [ [ [ 0, 0, 0, 0, 0, 1 ], [ -1, 0, 0, 0, 1, 1 ], [ -1, 0, 0, 0, 0, 2 ], [ 0, 0, 0, 0, -1, 1 ] ], 0.875 ] - ], - [ - [ [ [ 0, 0, 0, 0, 0, 1 ], [ -1, 0, 0, 0, 1, 1 ], [ -1, 0, 0, 0, 0, 2 ], [ "Rest" ] ], 0 ], - [ [ [ 0, -1, 0, 0, 0, 2 ], [ -1, 0, 0, 0, 1, 1 ], [ -1, 0, 0, 0, 0, 2 ], [ "Rest" ] ], 0 ], - [ [ [ 0, -1, 0, 0, 0, 2 ], [ -1, 0, -1, 0, 0, 2 ], [ -1, 0, 0, 0, 0, 2 ], [ "Rest" ] ], 0.25 ], - [ [ [ -1, 0, 0, 0, 1, 2 ], [ -1, 0, -1, 0, 0, 2 ], [ -1, 0, 0, 0, 0, 2 ], [ "Rest" ] ], 0.25 ], - [ [ [ -1, 0, 1, 0, 0, 2 ], [ -1, 0, -1, 0, 0, 2 ], [ -1, 0, 0, 0, 0, 2 ], [ "Rest" ] ], 0.25 ], - [ [ [ -2, 0, 1, 0, 0, 2 ], [ -1, 0, -1, 0, 0, 2 ], [ -1, 0, 0, 0, 0, 2 ], [ "Rest" ] ], 1.375 ] - ], - [ - [ [ [ -2, 0, 1, 0, 0, 2 ], [ -1, 0, -1, 0, 0, 2 ], [ -1, 0, 0, 0, 0, 2 ], [ 0, 0, 0, 0, -1, 1 ] ], 0.5 ], - [ [ [ -2, 0, 1, 0, 0, 2 ], [ -1, 0, 1, 0, 0, 1 ], [ -1, 0, 0, 0, 0, 2 ], [ 0, 0, 0, 0, -1, 1 ] ], 0 ], - [ [ [ -2, 0, 1, 0, 0, 2 ], [ -1, 0, 1, 0, 0, 1 ], [ 1, 0, 0, 0, -1, 0 ], [ 0, 0, 0, 0, -1, 1 ] ], 0.625 ], - [ [ [ -2, 0, 1, 0, 0, 2 ], [ 0, 0, -1, 0, -1, 1 ], [ 1, 0, 0, 0, -1, 0 ], [ 0, 0, 0, 0, -1, 1 ] ], 0 ], - [ [ [ -2, 0, 1, 0, 0, 2 ], [ 0, 0, -1, 0, -1, 1 ], [ 1, -1, 0, 0, -1, 1 ], [ 0, 0, 0, 0, -1, 1 ] ], 1 ] - ], - [ - [ [ [ -1, 1, 0, 0, -1, 1 ], [ 0, 0, -1, 0, -1, 1 ], [ 1, -1, 0, 0, -1, 1 ], [ 0, 0, 0, 0, -1, 1 ] ], 0 ], - [ [ [ -1, 1, 0, 0, -1, 1 ], [ 1, -1, 0, 0, -1, 0 ], [ 1, -1, 0, 0, -1, 1 ], [ 0, 0, 0, 0, -1, 1 ] ], 0.625 ], - [ [ [ 0, -1, 1, 0, -1, 1 ], [ 1, -1, 0, 0, -1, 0 ], [ 1, -1, 0, 0, -1, 1 ], [ 0, 0, 0, 0, -1, 1 ] ], 0.625 ], - [ [ [ 0, 0, -1, 0, -1, 1 ], [ 1, -1, 0, 0, -1, 0 ], [ 1, -1, 0, 0, -1, 1 ], [ 0, 0, 0, 0, -1, 1 ] ], 0 ], - [ [ [ 0, 0, -1, 0, -1, 1 ], [ 1, -1, 0, -1, -1, 1 ], [ 1, -1, 0, 0, -1, 1 ], [ 0, 0, 0, 0, -1, 1 ] ], 1.125 ] - ], - [ - [ [ [ 0, 0, -1, 0, -1, 1 ], [ 1, -1, 0, -1, -1, 1 ], [ 1, -1, 0, 0, -1, 1 ], [ "Rest" ] ], 0 ], - [ [ [ 0, 0, -1, 0, -1, 1 ], [ 1, -1, 0, -1, -1, 1 ], [ 1, -1, 0, -1, -1, 2 ], [ "Rest" ] ], 0.625 ], - [ [ [ 0, 0, -1, 0, -1, 1 ], [ 1, -1, 0, -1, -1, 1 ], [ 2, -1, -1, -1, -1, 1 ], [ "Rest" ] ], 0.5 ], - [ [ [ 0, 0, -1, 0, -1, 1 ], [ 1, -1, 0, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 1 ], [ "Rest" ] ], 1.375 ] - ], - [ - [ [ [ 0, 0, 0, -1, 0, 1 ], [ 1, -1, 0, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 1 ], [ "Rest" ] ], 0 ], - [ [ [ 0, 0, 0, -1, 0, 1 ], [ 1, -1, 0, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 1 ], [ 1, -1, 1, -1, -1, 1 ] ], 0.375 ], - [ [ [ 2, -1, 0, -2, -1, 1 ], [ 1, -1, 0, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 1 ], [ 1, -1, 1, -1, -1, 1 ] ], 0 ], - [ [ [ 2, -1, 0, -2, -1, 1 ], [ 1, -1, 0, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 1 ], [ 1, 0, -1, -1, -1, 1 ] ], 1 ] - ], - [ - [ [ [ 1, 0, 0, -1, -2, 1 ], [ 1, -1, 0, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 1 ], [ 1, 0, -1, -1, -1, 1 ] ], 0 ], - [ [ [ 1, 0, 0, -1, -2, 1 ], [ 0, 0, 1, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 1 ], [ 1, 0, -1, -1, -1, 1 ] ], 0.625 ], - [ [ [ 1, 0, 0, -1, -2, 1 ], [ 1, 0, -2, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 1 ], [ 1, 0, -1, -1, -1, 1 ] ], 0.25 ], - [ [ [ 1, 0, 0, -1, -2, 1 ], [ 0, 1, -1, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 1 ], [ 1, 0, -1, -1, -1, 1 ] ], 1.375 ] - ], - [ - [ [ [ 1, 1, -1, -1, -1, 0 ], [ 0, 1, -1, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 1 ], [ 1, 0, -1, -1, -1, 1 ] ], 0.375 ], - [ [ [ 0, 0, 0, -2, -1, 1 ], [ 0, 1, -1, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 1 ], [ 1, 0, -1, -1, -1, 1 ] ], 0.375 ], - [ [ [ -1, 1, -1, -1, -1, 1 ], [ 0, 1, -1, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 1 ], [ 1, 0, -1, -1, -1, 1 ] ], 1.25 ] - ], - [ - [ [ [ -1, 1, -1, -1, -1, 1 ], [ 0, 1, -1, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 1 ], [ 0, 0, 0, -1, -1, 2 ] ], 0 ], - [ [ [ -1, 1, -1, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 0 ], [ 1, 0, 0, -1, -1, 1 ], [ 0, 0, 0, -1, -1, 2 ] ], 0 ], - [ [ [ 0, 0, 0, -1, -1, 0 ], [ 1, 0, 0, -1, -1, 0 ], [ 1, 0, 0, -1, -1, 1 ], [ 0, 0, 0, -1, -1, 2 ] ], 0.25 ], - [ [ [ 0, 0, 0, -1, -1, 0 ], [ 1, 0, 0, -1, -1, 0 ], [ 1, 0, 0, -1, -1, 1 ], [ 0, 0, 0, 0, -1, 1 ] ], 0.625 ], - [ [ [ 0, 0, 0, -1, -1, 0 ], [ 1, 0, 0, -1, -1, 0 ], [ 1, 0, 0, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 2 ] ], 1.375 ], - [ [ [ 0, 0, 0, -1, -1, 0 ], [ "Rest" ], [ 1, 0, 0, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 2 ] ], 0 ], - [ [ [ 0, 0, 0, -1, -1, 0 ], [ "Rest" ], [ 1, 0, 0, -1, -1, 1 ], [ "Rest" ] ], 0 ], - [ [ [ 0, 0, 0, -1, -1, 0 ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 0 ], - [ [ [ "Rest" ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 5.625 ] - ] - ] -], -"last_changes": -[ - [ [ -1, 1, -1, -1, -1, 1 ], [ 0, 1, -1, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 1 ], [ 0, 0, 0, -1, -1, 2 ] ], - [ [ -1, 1, -1, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 0 ], [ 1, 0, 0, -1, -1, 1 ], [ 0, 0, 0, -1, -1, 2 ] ], - [ [ 0, 0, 0, -1, -1, 0 ], [ 1, 0, 0, -1, -1, 0 ], [ 1, 0, 0, -1, -1, 1 ], [ 0, 0, 0, -1, -1, 2 ] ], - [ [ 0, 0, 0, -1, -1, 0 ], [ 1, 0, 0, -1, -1, 0 ], [ 1, 0, 0, -1, -1, 1 ], [ 0, 0, 0, 0, -1, 1 ] ], - [ [ 0, 0, 0, -1, -1, 0 ], [ 1, 0, 0, -1, -1, 0 ], [ 1, 0, 0, -1, -1, 1 ], [ 1, 0, 0, -1, -1, 2 ] ] -], -"cur_uid": "781442dc", -"ref_uid": "nil", -"order_seed": 479669, -"dur_seed": 398026, -"motifs_seed": 801394, -"entrances_probs_vals": [ 0.43, 0, 0, 0, 0.85164835164835, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"passages_probs_vals": [ 1, 0, 0.99206349206349, 0.16483516483516, 0.66, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"exits_probs_vals": [ 1, 0, 0.95238095238095, 0, 1.043956043956, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"ranges": [ [ -1983.9009287926, 1100 ], [ -999, 1322.600619195 ], [ -14.860681114551, 1676 ], [ 78.018575851393, 1694 ] ], -"step_probs_vals": [ 0, 1200, 0, 0.5, 0.076131687242798, 0.91477272727273, 0.17489711934156, 0, 0.57818930041152, 0, 1, 0 ], -"passages_weights": [ 0.54, 0.47, 0.52, 0.57, 0.58 ], -"hd_exp": -0.22, -"hd_invert": 0, -"order": -[ - [ [ 3, 1 ], [ 2, 0, 0, 2 ], [ ] ], - [ [ 0 ], [ 3, 1, 2, 3, 2 ], [ ] ], - [ [ 2 ], [ 0, 1, 0, 0, 0 ], [ 3 ] ], - [ [ 0, 3 ], [ 1, 2, 1, 2 ], [ ] ], - [ [ 2, 3 ], [ 0, 1, 0, 0, 1 ], [ ] ], - [ [ 1, 0 ], [ 2, 2, 2 ], [ 3 ] ], - [ [ 1, 2 ], [ 0, 3, 0, 3 ], [ ] ], - [ [ 3, 2 ], [ 0, 1, 1, 1 ], [ ] ], - [ [ 1, 2, 3 ], [ 0, 0, 0 ], [ ] ], - [ [ 2 ], [ 3, 1, 0, 3, 3 ], [ ] ] -], -"sus_weights": [ 0.44, 0.41, 0.28 ], -"order_size": [ 10, 10 ], -"passages_size": [ 2, 4 ], -"motif_edited": "false", -"order_edited": "false" -} \ No newline at end of file diff --git a/resources/string_quartet_3/7c2de94c/7c2de94c_code.scd b/resources/string_quartet_3/7c2de94c/7c2de94c_code.scd deleted file mode 100644 index dc13462..0000000 --- a/resources/string_quartet_3/7c2de94c/7c2de94c_code.scd +++ /dev/null @@ -1,945 +0,0 @@ -( -// helper funcs -var hsArrayToCents, pDist, hdSum, hsChordalDistance, hsArrayToFreq; - -// score funcs -var isInRange, spacingScore, rangeScore, intervalScore, inclusionScore; - -// subroutines -var genTuples, initVoices, genOrders, genSubMotif, updateVoices, genDurFunc, genStepFunc; - -// primary routines -var genMotif, genSecondarySeq; - -// audition funcs -var genPatterns, genMidiPatterns; - -// resource management funcs -var seedFunc, genUID, writeResources, stringifyToDepth, setSeeds, sanityCheck, -msgInterpret, loadLedgerFile, loadLedgerJSON, loadModelFile, loadModelJSON, -setGlobalVars, globalVarsToDict, saveLedger; - -// model vars -//(model and global vars mostly set by OSC funcs -var seq, lastXChanges, -curUID, refUID, orderSeed, durSeed, motifSeed, -entrancesProbVals, passagesProbVals, exitsProbVals, -ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, -orders, susWeights, orderSize, passagesSize, -motifEdited, orderEdited; - -// model aux vars -var entrancesDurFunc, passagesDurFunc, exitsDurFunc, stepFunc; - -// other global vars -var popSize, exPath, dir, primes, dims, tuples, -group, player, resourceDir, ledgerPath, ledger, currentlyPlayingUID, -nameSpaces; - -// install JSON quark (not used) -/* -if(Quarks.isInstalled("JSONlib").not, { - Quarks.install("https://github.com/musikinformatik/JSONlib.git"); - thisProcess.recompile; - //HelpBrowser.openHelpFor("Classes/JSONlib"); -}); -*/ - - -//------helper funcs - -hsArrayToCents = { - arg hsArray; - hsArray.collect({arg dist, p; dist * 1200 * log2(primes[p][0]/primes[p][1])}).sum -}; - -pDist = { - arg array1, array2, signed = false; - var pDistance; - pDistance = hsArrayToCents.value(array1) - hsArrayToCents.value(array2); - if(signed, {pDistance}, {abs(pDistance)}) -}; - -hdSum = { - arg hsArrays; - var size, distances, mean; - size = hsArrays.size; - distances = (size - 1).collect({arg i; - ((i + 1)..(size - 1)).collect({arg j; - abs(hsArrays[i] - hsArrays[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsChordalDistance = { - arg hsArrays1, hsArrays2; - var size, distances, mean; - size = hsArrays1.size; - distances = hsArrays1.size.collect({arg i; - hsArrays2.size.collect({arg j; - abs(hsArrays1[i] - hsArrays2[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsArrayToFreq = { - arg array; - array.collect({arg dim, d; pow(primes[d][0]/primes[d][1], dim)}).product -}; - -//------score funcs - -/* -isInRange = { - arg hsArray, min, max; - var cents; - cents = hsArrayToCents.value(hsArray); - (cents >= min) && (cents <= max) -}; -*/ - -spacingScore = { - arg hsArrays, min; - var centsArray; - centsArray = hsArrays.collect({arg hsArray; hsArrayToCents.value(hsArray)}).sort({arg a, b; a < b}); - centsArray.differentiate.drop(1).collect({arg pDistance; if(pDistance >= min, {1}, {0.01})}).sum; -}; - -rangeScore = { - arg hsArray1, hsArray2, min, max, low, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - if((pDistance >= min) && (pDistance <= max), {1}, {low}); -}; - -intervalScore = { - arg hsArray1, hsArray2, mean, sd, signed = true; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - //pDistance.gaussCurve(1, mean, sd) - if(pDistance < 0, {stepFunc.value(pDistance)}, {0}); -}; - -inclusionScore = { - arg array, test, min = 0.01; - if(array.collect({arg v; v.hash}).includes(test.hash), {min}, {1}); -}; - - -//------subroutines - -genTuples = { - var tuples; - tuples = dims.collect({[-1, 0, 1]}).allTuples.select({arg tuple; (abs(tuple.drop(1)).sum <= 1) && (tuple[0] == 0)}); - tuples = tuples ++ tuples.collect({arg tuple; [-3, -2, -1, 1, 2, 3].collect({arg octTrans; tuple.deepCopy.put(0, octTrans)})}).flatten; -}; - -initVoices = { - var init, voicesInit; - voicesInit = popSize.collect({dims.collect({0})}); - /* - voicesInit = [dims.collect({0})]; - (popSize - 1).do({ - arg rep, new; - rep = dims.rand; - new = voicesInit.last.deepCopy; - new[rep] = new[rep] + [-1, 1].choose(); - voicesInit = voicesInit.add(new); - }); - */ - voicesInit.deepCopy; -}; - -genDurFunc = {arg chordProb, minPad, maxPad, minDur, maxDur, envData, seed; - var env, pTable, durFunc; - env = Env.pairs([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).asSignal(256).asList.asArray; - pTable = env.asRandomTable; - [chordProb, minPad, maxPad, minDur, maxDur, envData].postln; - durFunc = {arg allowChord, pad = false; - var res; - res = if(allowChord.not, { - pTable.tableRand * (maxDur - minDur) + minDur - }, { - if(1.0.rand < chordProb, {0}, {pTable.tableRand * (maxDur - minDur) + minDur}); - }).round(0.125); - if(pad, {res = res + rrand(minPad.asFloat, maxPad.asFloat).round(0.125)}); - if(res.asInteger == res, {res = res.asInteger}); - res - }; - seedFunc.value(durFunc, seed); -}; - -genStepFunc = {arg minStep, maxStep, envData, seed; - var envDataNorm, env, pTable, stepFunc; - [minStep, maxStep, envData].postln; - envDataNorm = ([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).flop; - envDataNorm = [envDataNorm[0].normalize(minStep, maxStep), envDataNorm[1]].flop; - env = Env.pairs(envDataNorm); - stepFunc = {arg pDist; - env.at(pDist).clip(0.001, 1); - }; - seedFunc.value(stepFunc, seed); -}; - -genOrders = {arg minMotifLength = 1, maxMotifLength = 5, minProgLength = 0, maxProgLength = 5; - ((maxMotifLength - minMotifLength).rand + minMotifLength).collect({ - var noProgIns, noSusIns, noSilentIns, prog, sus, silent, order; - noSusIns = [1, 2, 3].wchoose(susWeights.normalizeSum); - noProgIns = (popSize - noSusIns).rand + 1; - noSilentIns = popSize - noSusIns - noProgIns; - - # prog, sus, silent = (0..(popSize-1)).scramble.clumps([noProgIns, noSusIns, noSilentIns]); - - prog = (prog.scramble ++ ((maxProgLength - minProgLength).rand + minProgLength).collect({prog.choose}).scramble); - if(silent == nil, {silent = []}); - [sus.scramble, prog, silent.scramble] - }); -}; - -updateVoices = {arg ins, sus; - var voices, candidates, nWeights, nProbs, sel; - - voices = lastXChanges.deepCopy.last; - - candidates = sus.collect({arg v; tuples.collect({arg t; voices[v] + t})}).flatten; - candidates = difference(candidates.asSet, voices.asSet).asList; - nProbs = candidates.collect({arg candidate; - var stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore; - - //stepScore = intervalScore.value(voices[ins], candidate, 30, 400, 0.1); - stepScore = intervalScore.value(voices[ins], candidate, 100, 100); - recentlySoundedScore = inclusionScore.value(lastXChanges.flop[ins], candidate, 0); - isInRangeScore = rangeScore.value(candidate, candidate.collect({0}), ranges[ins][0], ranges[ins][1], 0, true); - regScore = spacingScore.value(voices.deepCopy.put(ins, candidate), 300); - hdScore = pow(hdSum.value(voices.deepCopy.put(ins, candidate)), hdExp); - if(hdInvert == 0, {hdScore = 1/hdScore}); - //maybe what you want here is a vector to another root and then favoring movement towards it. - //distScore = pow(hsChordalDistance.value(voices, voices.put(ins, candidate)), 2); - - [stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore] - }); - - nWeights = passagesWeights; - - //this handles nWeights of 0; mainly for testing - nProbs = nProbs.flop.select({arg scores, s; nWeights[s] != 0}).flop; - nWeights = nWeights.select({arg weight; weight != 0}); - nProbs = nProbs.flop.collect({arg scores, s; - if(scores.sum == 0, {scores}, {scores.normalizeSum * nWeights[s]}) - }); - nProbs = nProbs.flop.collect({arg scores, s; scores.product}).normalizeSum; - - sel = candidates.wchoose(nProbs); - - voices[ins] = sel; - lastXChanges = lastXChanges.add(voices).keep(-5); -}; - -genSubMotif = {arg order, orderIndex, lastState, repeatLast = false, startFromLast = false, isLastOrder = false; - var sus, prog, silent, flatOrder, res, isInChord, allowChord, pad, lastXChangesHold, voices, adder; - # sus, prog, silent = order; - flatOrder = silent ++ sus ++ prog; - lastXChangesHold = lastXChanges.deepCopy; - voices = lastState.deepCopy; - isInChord = popSize.collect({false}); - allowChord = false; - pad = false; - res = []; - "------generating motif".postln; - //need to figure out here if voices move between motifs - flatOrder.do({arg ins, i; - - if(prog.includes(ins) && repeatLast.not, {updateVoices.value(ins, sus)}); - adder = if(silent.includes(ins), {["Rest"]}, {lastXChanges.last.deepCopy[ins]}); - - if(voices[ins] != adder, { - var dur; - - if((sus ++ silent).includes(ins), { - allowChord = (ins != sus.last); - pad = (ins == sus.last); - }, { - if(i < (flatOrder.size - 1), { - allowChord = (isInChord[flatOrder[i + 1]] || (ins == flatOrder[i + 1])).not; - pad = false; - }, { - allowChord = false; - pad = true - }); - }); - if((orderIndex == 0) && sus.includes(ins), { - dur = entrancesDurFunc.value(allowChord, pad); - }, { - dur = passagesDurFunc.value(allowChord, pad); - }); - if(dur == 0, {isInChord[ins] = true}, {isInChord = popSize.collect({false})}); - - voices[ins] = adder; - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - - // pad ending - if(orderIndex == (orders.size - 1), { - (0..(popSize-1)).scramble.do({arg ins; - if(res.last.first[ins] != ["Rest"], { - var dur; - voices[ins] = ["Rest"]; - allowChord = (voices != popSize.collect({["Rest"]})); - pad = allowChord.not; - dur = exitsDurFunc.value(allowChord, pad); - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - }); - - //format and return - if(startFromLast, {lastXChanges = lastXChangesHold.deepCopy}); - res; -}; - - -//------primary routines - -genMotif = { - var repeats, fSeq, fDur, durAdd; - - repeats = 1; - fSeq = []; - - repeats.do({arg index; - var motif; - - motif = []; - - orders.do({arg order, o; - var lastState, subMotif; - lastState = if(o == 0, {popSize.collect({["Rest"]})}, {motif.last.last.first}); - subMotif = genSubMotif.value(order, o, lastState, isLastOrder: o == (orders.size - 1)); - motif = motif.add(subMotif); - - }); - - sanityCheck.value(motif, index); - - fSeq = fSeq.add(motif); - }); - - //round last duration to measure - fDur = fSeq.flatten.flatten.slice(nil, 1).sum; - durAdd = fDur.round(4) - fDur; - if(durAdd < 0, {durAdd = 4 - durAdd}); - fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] = fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] + durAdd; - - fSeq -}; - -genSecondarySeq = {arg seq; - var curdles, fSeq; - curdles = []; - while({curdles.sum < seq.size}, {curdles = curdles ++ [3.rand + 1]}); - - fSeq = seq.clumps(curdles).collect({arg clump, m; - var repeats, paddedSeq; - - //add rest - paddedSeq = clump.add([[[popSize.collect({["Rest"]}), 0.5.rand]]]); - - //implement repeats - repeats = [0.rand + 1, 1].wchoose([1, 0].normalizeSum); - repeats.collect({paddedSeq}); - }); - fSeq -}; - - -//------audition funcs - -/* -Event.addEventType(\osc, { - if (~addr.postln.notNil) { - ~addr.sendMsg(~indexPath, ~indexMsg); - ~addr.sendMsg(~seqPath, stringifyToDepth.value(~seqMsg, 3)); - //~addr.sendMsg("/STATE/OPEN", (dir.replace("supercollider", "resources") +/+ ~idMsg +/+ ~idMsg ++ "_gui_state" ++ ".state").standardizePath.postln); - }; -}); -*/ - -Event.addEventType(\osc, { - if (~addr.notNil) { - ~msg; - ~addr.sendMsg(~path, *~msg); - }; -}); - -genPatterns = {arg inSeq, addr, oneShot = false; - var voices, durs, pbinds, res, indices, sectionDurs, msg, ids, seq; - seq = inSeq.collect({arg mSeq; mSeq[0]}); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - pbinds = voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs, attacks, rels, amps; - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - //attacks = 2.collect({rrand(1, 3)}) ++ freqs.drop(2).collect({rrand(0.3, 0.5)}); - attacks = fDurs.collect({arg dur; dur * rrand(0.2, 0.4)}); - //rels = freqs.drop(2).collect({rrand(0.3, 0.5)}) ++ 2.collect({rrand(1, 3)}); - rels = (clumps.size - 1).collect({arg c; - if(clumps[c + 1][0] == ["Rest"], {rrand(1.0, 3.0)}, {rrand(0.3, 0.5)}); - }); - rels = rels.add(rrand(1.0, 3.0)); - amps = freqs.collect({rrand(0.6, 0.99)}); - - [ - Pbind( - \instrument, \string_model, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \attack, Pseq(attacks, 1), - \sustain, Pseq(fDurs, 1), - \release, Pseq(rels, 1), - //\amp, Pseq(amps, 1), - \amp, Pbrown(0.5, 1, 0.5), - \busIndex, v - ), - Pbind( - \instrument, \sine, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \sustain, Pseq(fDurs, 1), - \busIndex, v - ) - ] - }).flatten; - if(oneShot.not, { - msg = inSeq.collect({arg mSeq, m; mSeq[1..]}); - //ids = inSeq.collect({arg mSeq, m; mSeq[2]}); - sectionDurs = seq.collect({arg mSeq; mSeq.flatten2(mSeq.maxDepth - 5).flop[1].sum}); - pbinds = pbinds ++ - [ - Pbind( - \type, \osc, - \addr, addr, - \path, "/playing", - \msg, Pseq(msg, 1), - \dur, Pseq(sectionDurs, 1) - ); - ] - }); - res = Ppar(pbinds); - res -}; - -/* -genMidiPatterns = {arg seq; - var voices, durs, patterns, res, mOut, pbRange; - pbRange = 1; //semitones - change this as needed for your situation - mOut = MIDIOut.newByName("TiMidity", "TiMidity port 0").latency_(Server.default.latency); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - res = Ppar( - voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs; - - mOut.program(v, 70); - - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - - Pbind( - \type, \midi, - \chan, v, - \noteval, Pseq(freqs.cpsmidi - 24, 1), - \note, Pfunc({ | event | event[\noteval].floor }), - \dur, Pseq(fDurs, 1), - \midiout, mOut, - \amp, 1, - \bend, Pfunc({ - | event | - if (event[\note].isRest.not) { - var pitchbendvalue = event[\noteval].frac.linlin(0, pbRange, 8192, 8192*2).asInteger; - m.bend(v, pitchbendvalue); - }; - 0; // return something other than nil to avoid stopping the pattern - }), - ); - }); - ); - res -}; -*/ - - -//------resource management funcs - -genUID = {Date.seed.asHexString.toLower}; - -seedFunc = {arg func, seed; - var funcArgs, next; - next = Routine({loop{func.valueArray(funcArgs).yield }}); - next.randSeed_(seed); - {arg ...args; funcArgs = args; next.value} -}; - -stringifyToDepth = {arg data, maxDepth = 1; - var prettyString = "", rCount = 0, writeArray, indent; - - if(maxDepth == 0, { - data.asCompileString - }, { - indent = {arg size; size.collect({" "}).join("")}; - writeArray = {arg array; - prettyString = prettyString ++ indent.value(rCount) ++ "[\n"; - rCount = rCount + 1; - if(rCount < maxDepth, { - array.do({arg subArray; writeArray.value(subArray)}); - }, { - prettyString = prettyString ++ array.collect({arg subArray; - indent.value(rCount + 1) ++ subArray.asCompileString - }).join(",\n"); - }); - rCount = rCount - 1; - prettyString = prettyString ++ "\n" ++ indent.value(rCount) ++ "],\n"; - }; - - writeArray.value(data); - prettyString.replace(",\n\n", "\n").drop(-2); - }) -}; - -sanityCheck = {arg motif, index; - //print functions = very helpful - ("----------" + index + "------------").postln; - - motif.flatten.do({arg val, v; - if(v > 0, { - if(motif.flatten[v-1][0].hammingDistance(val[0]) > 1, {"problem 1".postln}); - if(motif.flatten[v-1][0].hammingDistance(val[0]) == 0, {"problem 2".postln}); - }); - val.postln - }); - "***********".postln; -}; - -msgInterpret = {arg in, escapeDoubleQuotes = true, escapeSingleQuotes = true; - var res; - - res = in; - if(res.isNil.not, { - if((res.isArray && res.isString.not), { - res = res.asCompileString; - res = res.replace(" ", "").replace("\n", "").replace("\t", ""); - if(escapeSingleQuotes, {res = res.replace("\'", "")}); - if(escapeDoubleQuotes, {res = res.replace("\"", "")}); - res = res.replace("Rest", "\"Rest\""); - res = res.interpret; - }, { - var tmpRes; - if(res.every({arg char; char.isDecDigit}), {tmpRes = res.asInteger}); - if(res.contains("."), {tmpRes = res.asFloat}); - if(tmpRes != nil, {res = tmpRes}); - }); - }); - res -}; - -writeResources = {arg path, dict; - var file, modelItems, resString; - file = File(path,"w"); - - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - - resString = nameSpaces.collect({arg nameSpace; - var depth = 0, insert = " "; - if(nameSpace == "music_data", {depth = 3; insert = "\n"}); - if(nameSpace == "last_changes", {depth = 1; insert = "\n"}); - if(nameSpace == "order", {depth = 1; insert = "\n"}); - if((nameSpace == "ref_uid") && (dict[nameSpace] == nil), {dict[nameSpace] = "nil"}); - "\"" ++ nameSpace ++ "\":" ++ insert ++ stringifyToDepth.value(dict[nameSpace], depth) - }).join(",\n"); - - resString = "{\n" ++ resString ++ "\n}"; - - file.write(resString); - file.close; - resString -}; - -loadModelFile = {arg path; loadModelJSON.value(File(path, "r").readAllString.parseJSON)}; - -loadModelJSON = {arg jsonObject; - var dict; - dict = Dictionary.with(*nameSpaces.collect({arg nS; nS->msgInterpret.value(jsonObject[nS])})); - dict -}; - -setGlobalVars = {arg dict, skipLastXChanges = false; - var tmpLastXChanges; - tmpLastXChanges = lastXChanges.deepCopy; - // order really matters!!!! - # seq, lastXChanges, curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited = nameSpaces.collect({arg nS; dict[nS]}); - if(skipLastXChanges, {lastXChanges = tmpLastXChanges}); - dict -}; - -globalVarsToDict = { - var modelItems, dict; - // order really matters!!!! - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - dict = Dictionary.with(*nameSpaces.collect({arg nS, n; nS->modelItems[n]})); -}; - -loadLedgerFile = {arg path; - ledgerPath = path; - resourceDir = path.splitext(".").drop(-1).join; - loadLedgerJSON.value(File(ledgerPath, "r").readAllString.parseJSON) -}; - -loadLedgerJSON = {arg jsonObject; ledger = jsonObject["ledger"]}; - -saveLedger = {arg ledger, path; - var file, curResourceDir; - file = File(path, "w"); - curResourceDir = resourceDir; - resourceDir = path.splitext(".").drop(-1).join; - if(curResourceDir != resourceDir, { - File.mkdir(resourceDir); - ledger.do({arg id; - File.copy(curResourceDir +/+ id, resourceDir +/+ id); - }); - }); - file.write("{\n\"ledger\":\n" ++ stringifyToDepth.value(ledger, 1) ++ "\n}"); - file.close; -}; - -//------global vars - -primes = [[2, 1], [3, 2], [5, 4], [7, 4], [11, 8], [13, 8]]; -//ranges = [[-2400, 0], [-1200, 1200], [0, 2400], [0, 2400]]; -exPath = thisProcess.nowExecutingPath; -dir = exPath.dirname; -//popSize = 4; -dims = primes.size; -tuples = genTuples.value(); -//refUID = nil; -group = Group.new; -~group = group; -loadLedgerFile.value(dir +/+ ".." +/+ "resources" +/+ "piece_ledger.json"); -resourceDir = (dir +/+ ".." +/+ "resources" +/+ "piece_ledger"); -//passagesWeights = [1, 1, 1, 1, 1]; -//susWeights = [1, 1, 1]; -// order really matters!!!! -nameSpaces = [ - "music_data", "last_changes", "cur_uid", "ref_uid", "order_seed", "dur_seed", "motifs_seed", - "entrances_probs_vals","passages_probs_vals", "exits_probs_vals", - "ranges", "step_probs_vals", "passages_weights", "hd_exp", "hd_invert", - "order", "sus_weights", "order_size", "passages_size", - "motif_edited", "order_edited" -]; - - -//------OSC funcs - -OSCdef(\load_ledger, {arg msg, time, addr, port; - loadLedgerFile.value(msg[1].asString); -}, \load_ledger); - -OSCdef(\load_model, {arg msg, time, addr, port; - var dict; - dict = loadModelFile.value(msg[1].asString); - setGlobalVars.value(dict); -}, \load_model); - -OSCdef(\save_ledger, {arg msg, time, addr, port; - msg.postln; - ledger = msgInterpret.value(msg[1].asString.parseJSON["ledger"], false).postln; - //loadLedgerJSON.value(msg[0]) - saveLedger.value(ledger, msg[2].asString); - //loadLedgerFile.value(msg[1].asString); -}, \save_ledger); - -OSCdef(\generate, {arg msg, time, addr, port; - var path, dict, durSeeds, musPath, modelString; - msg.postln; - - path = msg[1].asString; - - dict = loadModelFile.value(path); - setGlobalVars.value(dict, true); - - popSize = ranges.size; - - //refUID.postln; - - loadLedgerFile.value(ledgerPath); - if(ledger == nil, {ledger = ["tmp"]}); - if(ledger.last != "tmp", {ledger = ledger.add("tmp")}); - - if(refUID == nil, {lastXChanges = [initVoices.value().deepCopy]}); - if((refUID != nil) && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - lastXChanges = msgInterpret.value(file.readAllString.parseJSON["last_changes"]); - }); - - refUID.postln; - lastXChanges.collect({arg item; item.postln}); - - durSeeds = seedFunc.value({3.collect({rrand(100000, 999999)})}, durSeed).value.postln; - entrancesDurFunc = genDurFunc.valueArray(entrancesProbVals[..4] ++ [entrancesProbVals[5..]] ++ [durSeeds[0]]); - passagesDurFunc = genDurFunc.valueArray(passagesProbVals[..4] ++ [passagesProbVals[5..]] ++ [durSeeds[1]]); - exitsDurFunc = genDurFunc.valueArray(exitsProbVals[..4] ++ [exitsProbVals[5..]] ++ [durSeeds[2]]); - - if(orders == nil, { - orders = seedFunc.value(genOrders, orderSeed).valueArray(orderSize ++ passagesSize); - //addr.sendMsg("/order", stringifyToDepth.value(orders, 1)); - }); - - stepFunc = genStepFunc.valueArray(stepProbsVals[..1] ++ [stepProbsVals[2..]] ++ [motifSeed]); - seq = seedFunc.value(genMotif, motifSeed).value; - - lastXChanges.collect({arg item; item.postln}); - - dict = globalVarsToDict.value; - modelString = writeResources.value(path, dict); - - //addr.sendMsg("/generated", musPath, stringifyToDepth.value(seq, 3)); - //~seq = seq; - - addr.sendMsg("/generated", path, modelString, ledgerPath); -}, \generate); - - -OSCdef(\commit, {arg msg, time, addr, port; - var musicData, musicChanged, dict, newLedger, modelPath, musString, musFile, test1, test2, lastCurUID, commitType, commitPos, equalityLedger; - //msg.postln; - - /* - test1 = msg[1].asString.parseJSON; - test2 = (dir +/+ ".." +/+ "resources/tmp/tmp_music" ++ ".json").standardizePath.parseJSONFile; - msgInterpret.value(test1["music"])[0][0][0][1].class.postln; - msgInterpret.value(test2["music_data"])[0][0][0][1].class.postln; - (test1["music"] == test2["music_data"]).postln; - */ - - musicData = loadModelJSON.value(msg[1].asString.parseJSON)["music_data"].postln; - musicChanged = (musicData != seq).postln; - commitType = msg[2].asString; - commitPos = msg[3].postln.asInteger; - - lastCurUID = curUID.deepCopy; - curUID = genUID.value; - - File.mkdir((resourceDir +/+ curUID).standardizePath); - File.copy(exPath, (resourceDir +/+ curUID +/+ curUID ++ "_code" ++ ".scd").standardizePath); - - modelPath = (resourceDir +/+ curUID +/+ curUID ++ "_mus_model" ++ ".json").standardizePath; - dict = globalVarsToDict.value; - if(musicChanged, { - seq = musicData; - dict["music_data"] = seq; - dict["motif_edited"] = "true" - }); - dict["cur_uid"] = curUID; - - writeResources.value(modelPath, dict); - - File.delete(ledgerPath ++ "_bak"); - File.copy(ledgerPath, ledgerPath ++ "_bak"); - File.delete(ledgerPath); - - /* - if(commitType == "add", { - if(lastCurUID == "tmp", { - ledger = ledger.drop(-1).add(curUID); - }, { - ledger = ledger.add(curUID); - }) - }); - */ - - ledger.postln; - - if(commitType == "add", {ledger = ledger.add(curUID)}); - - if(commitType == "insert", {ledger = ledger.insert(commitPos + 1, curUID)}); - - if(commitType == "replace", {ledger = ledger.put(commitPos, curUID)}); - - equalityLedger = ledger.collect({arg item; item.asSymbol}); - if(equalityLedger.includes(\tmp).postln, {ledger.removeAt(equalityLedger.indexOf(\tmp).postln)}); - - ledger.postln; - - saveLedger.value(ledger, ledgerPath); - - addr.sendMsg("/committed", curUID, ledgerPath); - //refUID = curUID; - -}, \commit); - -OSCdef(\transport, {arg msg, time, addr, port; - msg.postln; - if(msg[1] == 0, { - group.set(\release, 2); - group.set(\gate, 0); - player.stop; - }, { - // the cued sequence can now be read from file, so this can be cleaned up - var cSize, patterns, pSeq, cuedSeek, indexStart, indexEnd, tmpLedger; - if(msg[1] == 1, { - pSeq = []; - cuedSeek = (seq != nil); - indexStart = msg[2].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.postln.parseJSON["music_data"]), path, indexStart + index, uid]); - file.close; - }); - }); - if(cuedSeek, { - var path, file; - path = (resourceDir +/+ "tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - patterns = genPatterns.value(pSeq, addr); - }, { - pSeq = [loadModelJSON.value(msg[2].asString.parseJSON)["music_data"].postln]; - patterns = genPatterns.value(pSeq, addr, true); - }); - player = Pfset(pattern: patterns, cleanupFunc: { - addr.sendMsg("/transport", 0); - addr.sendMsg("/one_shot", 0); - }); - player = player.play - }); -}, \transport); - - -OSCdef(\transcribe_motif, {arg msg, time, addr, port; - var tSeq, refChord, refUID; - - msg.postln; - - tSeq = [loadModelJSON.value(msg[1].asString.parseJSON)["music_data"]]; - refUID = msg[2].asString.postln; - - if((refUID != "nil") && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }, { - refChord = [[-3, 0, 0, 0, 0, 0], [-3, 0, 0, 0, 0, 0], [-3, 0, 0, 0, 0, 0], [-3, 0, 0, 0, 0, 0]]; - }); - - ~transcribe.value(tSeq, refChord, (dir +/+ ".." +/+ "lilypond" +/+ "includes").standardizePath, addr, "/transcribe_motif"); -}, \transcribe_motif); - - -OSCdef(\transcribe_all, {arg msg, time, addr, port; - var cSize, patterns, cuedSeek, indexStart, indexEnd, tmpLedger; - if(true, { - cuedSeek = (seq != nil); - indexStart = msg[1].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - - //tmp for testing transcription - //indexEnd = (indexStart+5); - - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - var lilyPartLedgerFiles; - - lilyPartLedgerFiles = 4.collect({arg p; - File((dir +/+ ".." +/+ "lilypond" +/+ "includes" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly").standardizePath, "w"); - }); - - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file, fileString, tSeq, refUID, refChord; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - fileString = file.readAllString; - tSeq = msgInterpret.value(fileString.parseJSON["music_data"]); - refUID = msgInterpret.value(fileString.parseJSON["ref_uid"]); - file.close; - - //uid.postln; - //(refUID == "nil").postln; - - refChord = [[-3, 0, 0, 0, 0, 0], [-3, 0, 0, 0, 0, 0], [-3, 0, 0, 0, 0, 0], [-3, 0, 0, 0, 0, 0]]; - - if(refUID != "nil", { - path = (resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }); - - if(index != indexEnd, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath); - }, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath, addr, "/transcribe_all"); - }); - - lilyPartLedgerFiles.do({arg f, p; - f.write("\\include \"" ++ resourceDir +/+ uid +/+ "lilypond" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly\"\n"); - }); - - }); - - lilyPartLedgerFiles.do({arg f; - f.close - }); - }); - /* - if(cuedSeek, { - var path, file; - path = (dir +/+ ".." +/+ "resources/tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - */ - }, { - - }); - -}, \transcribe_all); - -) - - diff --git a/resources/string_quartet_3/7c2de94c/7c2de94c_mus_model.json b/resources/string_quartet_3/7c2de94c/7c2de94c_mus_model.json deleted file mode 100644 index 37e7285..0000000 --- a/resources/string_quartet_3/7c2de94c/7c2de94c_mus_model.json +++ /dev/null @@ -1,163 +0,0 @@ -{ -"music_data": -[ - [ - [ - [ [ [ "Rest" ], [ "Rest" ], [ 1, -1, 0, 0, 0, 0 ], [ "Rest" ] ], 0.125 ], - [ [ [ "Rest" ], [ "Rest" ], [ 1, -1, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ] ], 1.125 ], - [ [ [ "Rest" ], [ 1, 0, 0, 0, 0, 0 ], [ 1, -1, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ] ], 1.125 ], - [ [ [ -1, 0, 1, 0, 0, 1 ], [ 1, 0, 0, 0, 0, 0 ], [ 1, -1, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ] ], 0.875 ] - ], - [ - [ [ [ 1, 0, 0, -1, 0, 0 ], [ 1, 0, 0, 0, 0, 0 ], [ 1, -1, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ] ], 0.375 ] - ], - [ - [ [ [ 1, 0, 0, -1, 0, 0 ], [ 1, 0, 0, 0, 0, 0 ], [ 1, -1, 0, 0, 0, 0 ], [ 2, -1, 0, -1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ 1, 0, 0, -1, 0, 0 ], [ 3, -1, 0, -1, -1, 0 ], [ 1, -1, 0, 0, 0, 0 ], [ 2, -1, 0, -1, 0, 0 ] ], 0.75 ] - ], - [ - [ [ [ 0, -1, 0, 1, 0, 0 ], [ 3, -1, 0, -1, -1, 0 ], [ 1, -1, 0, 0, 0, 0 ], [ 2, -1, 0, -1, 0, 0 ] ], 0.375 ] - ], - [ - [ [ [ 0, -1, 0, 1, 0, 0 ], [ 2, 0, 0, -1, 0, 0 ], [ 1, -1, 0, 0, 0, 0 ], [ 2, -1, 0, -1, 0, 0 ] ], 0.125 ] - ], - [ - [ [ [ 0, -1, 0, 1, 0, 0 ], [ 2, 0, 0, -1, 0, 0 ], [ 1, -1, 0, 0, 0, 0 ], [ 1, -1, 1, 0, 0, 0 ] ], 0.75 ] - ], - [ - [ [ [ 0, -1, 0, 1, 0, 0 ], [ 2, 0, 0, -1, 0, 0 ], [ 1, -1, 0, 0, 0, 0 ], [ 1, -1, -1, 1, 0, 0 ] ], 0.375 ] - ], - [ - [ [ [ 0, -1, 0, 0, 0, -1 ], [ 2, 0, 0, -1, 0, 0 ], [ 1, -1, 0, 0, 0, 0 ], [ 1, -1, -1, 1, 0, 0 ] ], 0.5 ] - ], - [ - [ [ [ 0, -1, 0, 0, 0, -1 ], [ 2, -1, -1, 1, 0, -1 ], [ 1, -1, 0, 0, 0, 0 ], [ 1, -1, -1, 1, 0, 0 ] ], 0 ] - ], - [ - [ [ [ 0, -1, 0, 0, 0, -1 ], [ 2, -1, -1, 1, 0, -1 ], [ 2, 0, 0, 0, 0, -1 ], [ 1, -1, -1, 1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ 0, -1, 0, 0, 0, -1 ], [ 3, -1, 0, 0, 0, -2 ], [ 2, 0, 0, 0, 0, -1 ], [ 1, -1, -1, 1, 0, 0 ] ], 0.5 ] - ], - [ - [ [ [ 0, -1, 0, 0, 0, -1 ], [ 2, -1, 1, 0, 0, -1 ], [ 2, 0, 0, 0, 0, -1 ], [ 1, -1, -1, 1, 0, 0 ] ], 0.875 ] - ], - [ - [ [ [ 0, -1, 0, 0, 0, -1 ], [ 2, -1, 1, 0, 0, -1 ], [ 2, 0, 0, 0, 0, -1 ], [ 3, -1, 0, 0, 0, -2 ] ], 1.125 ] - ], - [ - [ [ [ 0, -1, 0, 0, 0, -1 ], [ 2, -1, 1, 0, 0, -1 ], [ 3, -1, 1, 0, 0, -2 ], [ 3, -1, 0, 0, 0, -2 ] ], 0.625 ] - ], - [ - [ [ [ 1, -1, 1, 0, 0, -2 ], [ 2, -1, 1, 0, 0, -1 ], [ 3, -1, 1, 0, 0, -2 ], [ 3, -1, 0, 0, 0, -2 ] ], 0.125 ] - ], - [ - [ [ [ 1, -1, 1, 0, 0, -2 ], [ 2, -1, 1, 0, 0, -1 ], [ 3, -1, 1, 0, 0, -2 ], [ 3, -1, 1, -1, 0, -1 ] ], 0.5 ] - ], - [ - [ [ [ 1, -1, 1, 0, 0, -2 ], [ 2, -1, 1, 0, 0, -1 ], [ 3, -1, 1, 0, 0, -2 ], [ 2, -1, 2, 0, 0, -1 ] ], 0.25 ] - ], - [ - [ [ [ 1, -1, 1, 0, 0, -2 ], [ 2, -1, 1, 0, 0, -1 ], [ -1, 0, 1, 0, 0, -1 ], [ 2, -1, 2, 0, 0, -1 ] ], 0.75 ] - ], - [ - [ [ [ 1, -1, 1, 0, 0, -2 ], [ 2, -1, 1, 0, 0, -1 ], [ -1, 0, 2, 0, 0, -1 ], [ 2, -1, 2, 0, 0, -1 ] ], 0.125 ] - ], - [ - [ [ [ 1, -1, 1, 0, 0, -2 ], [ 2, -1, 1, 0, 0, -1 ], [ 3, -1, 0, 0, 0, -2 ], [ 2, -1, 2, 0, 0, -1 ] ], 0.625 ] - ], - [ - [ [ [ 1, -1, 1, 0, 0, -2 ], [ 2, -1, 1, 0, 0, -1 ], [ 3, -1, 1, 0, 0, -2 ], [ 2, -1, 2, 0, 0, -1 ] ], 1 ] - ], - [ - [ [ [ 1, -1, 1, 0, 0, -2 ], [ 2, -1, 1, 0, 0, -1 ], [ 3, -1, 1, 0, 0, -2 ], [ 3, -1, 0, 0, 0, -2 ] ], 0.125 ] - ], - [ - [ [ [ 1, -1, 1, 0, 0, -2 ], [ 4, -1, 0, -1, 0, -2 ], [ 3, -1, 1, 0, 0, -2 ], [ 3, -1, 0, 0, 0, -2 ] ], 0.5 ] - ], - [ - [ [ [ 1, -1, 1, 0, 0, -2 ], [ 0, -1, 0, 0, 0, -1 ], [ 3, -1, 1, 0, 0, -2 ], [ 3, -1, 0, 0, 0, -2 ] ], 0.625 ] - ], - [ - [ [ [ 1, -1, 0, 1, 0, -2 ], [ 0, -1, 0, 0, 0, -1 ], [ 3, -1, 1, 0, 0, -2 ], [ 3, -1, 0, 0, 0, -2 ] ], 0.75 ] - ], - [ - [ [ [ 1, -1, 0, 1, 0, -2 ], [ 0, -1, 0, 0, 0, -1 ], [ 3, -1, 0, 1, -1, -2 ], [ 3, -1, 0, 0, 0, -2 ] ], 0.5 ] - ], - [ - [ [ [ 1, -1, 0, 1, 0, -2 ], [ 1, -2, 0, 1, 0, -2 ], [ 3, -1, 0, 1, -1, -2 ], [ 3, -1, 0, 0, 0, -2 ] ], 1 ] - ], - [ - [ [ [ 1, -1, 0, 1, 0, -2 ], [ 1, -2, 0, 1, 0, -2 ], [ 3, -1, -1, 1, 0, -2 ], [ 3, -1, 0, 0, 0, -2 ] ], 0.125 ] - ], - [ - [ [ [ 1, -1, 0, 1, 0, -2 ], [ 1, -2, 0, 1, 0, -2 ], [ 0, -1, 0, 0, 0, -1 ], [ 3, -1, 0, 0, 0, -2 ] ], 0.875 ], - [ [ [ 1, -1, 0, 1, 0, -2 ], [ 1, -2, 0, 1, 0, -2 ], [ 0, -1, 0, 0, 0, -1 ], [ "Rest" ] ], 0.375 ], - [ [ [ 1, -1, 0, 1, 0, -2 ], [ 1, -2, 0, 1, 0, -2 ], [ "Rest" ], [ "Rest" ] ], 0.5 ], - [ [ [ 1, -1, 0, 1, 0, -2 ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 0.625 ], - [ [ [ "Rest" ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 6.5 ] - ] - ] -], -"last_changes": -[ - [ [ 1, -1, 0, 1, 0, -2 ], [ 0, -1, 0, 0, 0, -1 ], [ 3, -1, 1, 0, 0, -2 ], [ 3, -1, 0, 0, 0, -2 ] ], - [ [ 1, -1, 0, 1, 0, -2 ], [ 0, -1, 0, 0, 0, -1 ], [ 3, -1, 0, 1, -1, -2 ], [ 3, -1, 0, 0, 0, -2 ] ], - [ [ 1, -1, 0, 1, 0, -2 ], [ 1, -2, 0, 1, 0, -2 ], [ 3, -1, 0, 1, -1, -2 ], [ 3, -1, 0, 0, 0, -2 ] ], - [ [ 1, -1, 0, 1, 0, -2 ], [ 1, -2, 0, 1, 0, -2 ], [ 3, -1, -1, 1, 0, -2 ], [ 3, -1, 0, 0, 0, -2 ] ], - [ [ -2, -1, 0, 1, 0, -2 ], [ -2, -2, 0, 1, 0, -2 ], [ -2, -1, 0, 0, 0, -1 ], [ -2, -1, 0, 0, 0, -2 ] ] -], -"cur_uid": "7c2de94c", -"ref_uid": "5201b8af", -"order_seed": 869423, -"dur_seed": 680450, -"motifs_seed": 533263, -"entrances_probs_vals": [ 0, 0, 0, 0, 1.2087912087912, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"passages_probs_vals": [ 0, 0, 0, 0, 1.2087912087912, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"exits_probs_vals": [ 0, 0, 0, 0, 1.2087912087912, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"ranges": [ [ -2169.6594427245, 338 ], [ -2522.600619195, 1453 ], [ -1649.5356037152, 1676 ], [ -2894.1176470588, 1694 ] ], -"step_probs_vals": [ 0, 1200, 0, 0, 0.063786008230453, 0.92613636363636, 0.12757201646091, 0, 0.54732510288066, 0, 0.71604938271605, 0, 1, 0 ], -"passages_weights": [ 1, 0, 0.2, 0.74, 0.68 ], -"hd_exp": 2, -"hd_invert": 0, -"order": -[ - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 2, 1, 0 ], [ 3 ], [ ] ], - [ [ 2, 0, 3 ], [ 1 ], [ ] ], - [ [ 2, 1, 3 ], [ 0 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 0, 1, 2 ], [ 3 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 1, 2, 3 ], [ 0 ], [ ] ], - [ [ 2, 3, 0 ], [ 1 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 3, 2, 0 ], [ 1 ], [ ] ], - [ [ 2, 0, 1 ], [ 3 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 3, 2, 1 ], [ 0 ], [ ] ], - [ [ 0, 1, 2 ], [ 3 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 3, 0, 1 ], [ 2 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 0, 2, 1 ], [ 3 ], [ ] ], - [ [ 2, 3, 0 ], [ 1 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 1, 2, 3 ], [ 0 ], [ ] ], - [ [ 3, 0, 1 ], [ 2 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 3, 0, 1 ], [ 2 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ] -], -"sus_weights": [ 0, 0, 0.61 ], -"order_size": [ 30, 30 ], -"passages_size": [ 0, 0 ], -"motif_edited": "false", -"order_edited": "false" -} \ No newline at end of file diff --git a/resources/string_quartet_3/7e230015/7e230015_code.scd b/resources/string_quartet_3/7e230015/7e230015_code.scd deleted file mode 100644 index 7c7b526..0000000 --- a/resources/string_quartet_3/7e230015/7e230015_code.scd +++ /dev/null @@ -1,975 +0,0 @@ -( -// helper funcs -var hsArrayToCents, pDist, hdSum, hsChordalDistance, hsArrayToFreq; - -// score funcs -var isInRange, spacingScore, rangeScore, intervalScore, inclusionScore; - -// subroutines -var genTuples, initVoices, genOrders, genSubMotif, updateVoices, genDurFunc, genStepFunc; - -// primary routines -var genMotif, genSecondarySeq; - -// audition funcs -var genPatterns, genMidiPatterns; - -// resource management funcs -var seedFunc, genUID, writeResources, stringifyToDepth, setSeeds, sanityCheck, -msgInterpret, loadLedgerFile, loadLedgerJSON, loadModelFile, loadModelJSON, -setGlobalVars, globalVarsToDict, saveLedger; - -// model vars -//(model and global vars mostly set by OSC funcs -var seq, lastXChanges, -curUID, refUID, orderSeed, durSeed, motifSeed, -entrancesProbVals, passagesProbVals, exitsProbVals, -ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, -orders, susWeights, orderSize, passagesSize, -motifEdited, orderEdited; - -// model aux vars -var entrancesDurFunc, passagesDurFunc, exitsDurFunc, stepFunc; - -// other global vars -var popSize, exPath, dir, primes, dims, tuples, -group, player, resourceDir, ledgerPath, ledger, currentlyPlayingUID, -nameSpaces; - -// install JSON quark (not used) -/* -if(Quarks.isInstalled("JSONlib").not, { - Quarks.install("https://github.com/musikinformatik/JSONlib.git"); - thisProcess.recompile; - //HelpBrowser.openHelpFor("Classes/JSONlib"); -}); -*/ - - -//------helper funcs - -hsArrayToCents = { - arg hsArray; - hsArray.collect({arg dist, p; dist * 1200 * log2(primes[p][0]/primes[p][1])}).sum -}; - -pDist = { - arg array1, array2, signed = false; - var pDistance; - pDistance = hsArrayToCents.value(array2) - hsArrayToCents.value(array1); - if(signed, {pDistance}, {abs(pDistance)}) -}; - -hdSum = { - arg hsArrays; - var size, distances, mean; - size = hsArrays.size; - distances = (size - 1).collect({arg i; - ((i + 1)..(size - 1)).collect({arg j; - abs(hsArrays[i] - hsArrays[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsChordalDistance = { - arg hsArrays1, hsArrays2; - var size, distances, mean; - size = hsArrays1.size; - distances = hsArrays1.size.collect({arg i; - hsArrays2.size.collect({arg j; - abs(hsArrays1[i] - hsArrays2[j]).collect({arg dist, p; dist * log2(primes[p].product)}).sum - }); - }).flat; - mean = distances.sum / distances.size; - distances.sum - //mean + ((1 / sqrt((pow(distances - mean, 2)).sum / distances.size)) * mean) -}; - -hsArrayToFreq = { - arg array; - array.collect({arg dim, d; pow(primes[d][0]/primes[d][1], dim)}).product -}; - -//------score funcs - -/* -isInRange = { - arg hsArray, min, max; - var cents; - cents = hsArrayToCents.value(hsArray); - (cents >= min) && (cents <= max) -}; -*/ - -spacingScore = { - arg hsArrays, min; - var centsArray; - centsArray = hsArrays.collect({arg hsArray; hsArrayToCents.value(hsArray)}).sort({arg a, b; a < b}); - centsArray.differentiate.drop(1).collect({arg pDistance; if(pDistance >= min, {1}, {0.01})}).sum; -}; - -rangeScore = { - arg hsArray1, hsArray2, min, max, low, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - if((pDistance >= min) && (pDistance <= max), {1}, {low}); -}; - -/* -intervalScore = { - arg hsArray1, hsArray2, mean, sd, signed = false; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - //pDistance.gaussCurve(1, mean, sd) - stepFunc.value(pDistance) -}; -*/ - -intervalScore = { - arg hsArray1, hsArray2, mean, sd, signed = true; - var pDistance; - pDistance = pDist.value(hsArray1, hsArray2, signed); - //pDistance.gaussCurve(1, mean, sd) - //if(pDistance >= 0, {stepFunc.value(abs(pDistance))}, {0.01}); - stepFunc.value(pDistance) -}; - -inclusionScore = { - arg array, test, min = 0.01; - if(array.collect({arg v; v.hash}).includes(test.hash), {min}, {1}); -}; - - -//------subroutines - -genTuples = { - var tuples; - tuples = dims.collect({[-1, 0, 1]}).allTuples.select({arg tuple; (abs(tuple.drop(1)).sum <= 1) && (tuple[0] == 0)}); - //tuples = dims.collect({[0, 1]}).allTuples.select({arg tuple; (abs(tuple.drop(1)).sum == 1) && (tuple[0] == 0)}); - tuples = tuples ++ tuples.collect({arg tuple; [-3, -2, -1, 1, 2, 3].collect({arg octTrans; tuple.deepCopy.put(0, octTrans)})}).flatten; -}; - -initVoices = { - var init, voicesInit; - voicesInit = popSize.collect({dims.collect({0})}); - /* - voicesInit = [dims.collect({0})]; - (popSize - 1).do({ - arg rep, new; - rep = dims.rand; - new = voicesInit.last.deepCopy; - new[rep] = new[rep] + [-1, 1].choose(); - voicesInit = voicesInit.add(new); - }); - */ - voicesInit.deepCopy; -}; - -genDurFunc = {arg chordProb, minPad, maxPad, minDur, maxDur, envData, seed; - var env, pTable, durFunc; - env = Env.pairs([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).asSignal(256).asList.asArray; - pTable = env.asRandomTable; - [chordProb, minPad, maxPad, minDur, maxDur, envData].postln; - durFunc = {arg allowChord, pad = false; - var res; - res = if(allowChord.not, { - pTable.tableRand * (maxDur - minDur) + minDur - }, { - if(1.0.rand < chordProb, {0}, {pTable.tableRand * (maxDur - minDur) + minDur}); - }).round(0.125); - if(pad, {res = res + rrand(minPad.asFloat, maxPad.asFloat).round(0.125)}); - if(res.asInteger == res, {res = res.asInteger}); - res - }; - seedFunc.value(durFunc, seed); -}; - -genStepFunc = {arg minStep, maxStep, envData, seed; - var envDataNorm, env, pTable, stepFunc; - [minStep, maxStep, envData].postln; - envDataNorm = ([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).flop; - envDataNorm = [envDataNorm[0].normalize(minStep, maxStep), envDataNorm[1]].flop; - env = Env.pairs(envDataNorm); - stepFunc = {arg pDist; - env.at(pDist).clip(0.001, 1); - }; - seedFunc.value(stepFunc, seed); -}; - -genOrders = {arg minMotifLength = 1, maxMotifLength = 5, minProgLength = 0, maxProgLength = 5; - ((maxMotifLength.asInteger - minMotifLength.asInteger).rand + minMotifLength.asInteger).collect({ - var noProgIns, noSusIns, noSilentIns, prog, sus, silent, order; - noSusIns = [1, 2, 3].wchoose(susWeights.normalizeSum); - //noProgIns = (popSize - noSusIns).rand + 1; - noProgIns = (popSize - noSusIns); - noSilentIns = popSize - noSusIns - noProgIns; - - # prog, sus, silent = (0..(popSize-1)).scramble.clumps([noProgIns, noSusIns, noSilentIns]); - - prog = (prog.scramble ++ ((maxProgLength.asInteger - minProgLength.asInteger).rand + minProgLength.asInteger).collect({prog.choose}).scramble); - if(silent == nil, {silent = []}); - [sus.scramble, prog, silent.scramble] - }); -}; - -updateVoices = {arg ins, sus; - var voices, candidates, nWeights, nProbs, sel; - - voices = lastXChanges.deepCopy.last; - - candidates = sus.collect({arg v; tuples.collect({arg t; voices[v] + t})}).flatten; - candidates = difference(candidates.asSet, voices.asSet).asList; - nProbs = candidates.collect({arg candidate; - var stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore; - - //stepScore = intervalScore.value(voices[ins], candidate, 30, 400, 0.1); - stepScore = intervalScore.value(voices[ins], candidate, 100, 100); - recentlySoundedScore = inclusionScore.value(lastXChanges.flop[ins], candidate, 0.01); - - - - /* - if(rangeScore.value(candidate.collect({0}), voices[ins], ranges[ins][1] - 500, ranges[ins][1], 0, true) == 1, { - isInRangeScore = 1 - rangeScore.value(candidate.collect({0}), candidate, ranges[ins][0] + 500, ranges[ins][1] - 500, 0, true); - isInRangeScore = isInRangeScore * rangeScore.value(candidate.collect({0}), candidate, ranges[ins][0], ranges[ins][1], 0, true) - }, { - isInRangeScore = rangeScore.value(candidate.collect({0}), candidate, ranges[ins][0], ranges[ins][1], 0, true); - }); - */ - - - isInRangeScore = rangeScore.value(candidate.collect({0}), candidate, ranges[ins][0], ranges[ins][1], 0, true); - //old way - worked but actually by accident (I think) - //isInRangeScore = rangeScore.value(candidate, candidate.collect({0}), ranges[ins][0], ranges[ins][1], 0, true); - - - regScore = spacingScore.value(voices.deepCopy.put(ins, candidate), 300); - hdScore = pow(hdSum.value(voices.deepCopy.put(ins, candidate)), hdExp); - if(hdInvert == 0, {hdScore = 1/hdScore}); - //maybe what you want here is a vector to another root and then favoring movement towards it. - //distScore = pow(hsChordalDistance.value(voices, voices.put(ins, candidate)), 2); - - [stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore] - }); - - nWeights = passagesWeights; - - //this handles nWeights of 0; mainly for testing - nProbs = nProbs.flop.select({arg scores, s; nWeights[s] != 0}).flop; - nWeights = nWeights.select({arg weight; weight != 0}); - nProbs = nProbs.flop.collect({arg scores, s; - if(scores.sum == 0, {scores}, {scores.normalizeSum * nWeights[s]}) - }); - nProbs = nProbs.flop.collect({arg scores, s; scores.product}).normalizeSum; - - sel = candidates.wchoose(nProbs); - - voices[ins] = sel; - lastXChanges = lastXChanges.add(voices).keep(-10); -}; - -genSubMotif = {arg order, orderIndex, lastState, repeatLast = false, startFromLast = false, isLastOrder = false; - var sus, prog, silent, flatOrder, res, isInChord, allowChord, pad, lastXChangesHold, voices, adder; - # sus, prog, silent = order; - flatOrder = silent ++ sus ++ prog; - lastXChangesHold = lastXChanges.deepCopy; - voices = lastState.deepCopy; - isInChord = popSize.collect({false}); - allowChord = false; - pad = false; - res = []; - "------generating motif".postln; - //need to figure out here if voices move between motifs - flatOrder.do({arg ins, i; - - if(prog.includes(ins) && repeatLast.not, {updateVoices.value(ins, sus)}); - adder = if(silent.includes(ins), {["Rest"]}, {lastXChanges.last.deepCopy[ins]}); - - if(voices[ins] != adder, { - var dur; - - if((sus ++ silent).includes(ins), { - allowChord = (ins != sus.last); - pad = (ins == sus.last); - }, { - if(i < (flatOrder.size - 1), { - allowChord = (isInChord[flatOrder[i + 1]] || (ins == flatOrder[i + 1])).not; - pad = false; - }, { - allowChord = false; - pad = true - }); - }); - if((orderIndex == 0) && sus.includes(ins), { - dur = entrancesDurFunc.value(allowChord, pad); - }, { - dur = passagesDurFunc.value(allowChord, pad); - }); - if(dur == 0, {isInChord[ins] = true}, {isInChord = popSize.collect({false})}); - - voices[ins] = adder; - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - - // pad ending - if(orderIndex == (orders.size - 1), { - (0..(popSize-1)).scramble.do({arg ins; - if(res.last.first[ins] != ["Rest"], { - var dur; - voices[ins] = ["Rest"]; - allowChord = (voices != popSize.collect({["Rest"]})); - pad = allowChord.not; - dur = exitsDurFunc.value(allowChord, pad); - res = res.add([voices.deepCopy.postln, dur]); - }); - }); - }); - - //format and return - if(startFromLast, {lastXChanges = lastXChangesHold.deepCopy}); - res; -}; - - -//------primary routines - -genMotif = { - var repeats, fSeq, fDur, durAdd; - - repeats = 1; - fSeq = []; - - repeats.do({arg index; - var motif; - - motif = []; - - orders.do({arg order, o; - var lastState, subMotif; - lastState = if(o == 0, {popSize.collect({["Rest"]})}, {motif.last.last.first}); - subMotif = genSubMotif.value(order, o, lastState, isLastOrder: o == (orders.size - 1)); - motif = motif.add(subMotif); - - }); - - sanityCheck.value(motif, index); - - fSeq = fSeq.add(motif); - }); - - //round last duration to measure - fDur = fSeq.flatten.flatten.slice(nil, 1).sum; - durAdd = fDur.round(4) - fDur; - if(durAdd < 0, {durAdd = 4 - durAdd}); - fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] = fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] + durAdd; - - fSeq -}; - -genSecondarySeq = {arg seq; - var curdles, fSeq; - curdles = []; - while({curdles.sum < seq.size}, {curdles = curdles ++ [3.rand + 1]}); - - fSeq = seq.clumps(curdles).collect({arg clump, m; - var repeats, paddedSeq; - - //add rest - paddedSeq = clump.add([[[popSize.collect({["Rest"]}), 0.5.rand]]]); - - //implement repeats - repeats = [0.rand + 1, 1].wchoose([1, 0].normalizeSum); - repeats.collect({paddedSeq}); - }); - fSeq -}; - - -//------audition funcs - -/* -Event.addEventType(\osc, { - if (~addr.postln.notNil) { - ~addr.sendMsg(~indexPath, ~indexMsg); - ~addr.sendMsg(~seqPath, stringifyToDepth.value(~seqMsg, 3)); - //~addr.sendMsg("/STATE/OPEN", (dir.replace("supercollider", "resources") +/+ ~idMsg +/+ ~idMsg ++ "_gui_state" ++ ".state").standardizePath.postln); - }; -}); -*/ - -Event.addEventType(\osc, { - if (~addr.notNil) { - ~msg; - ~addr.sendMsg(~path, *~msg); - }; -}); - -genPatterns = {arg inSeq, addr, oneShot = false; - var voices, durs, pbinds, res, indices, sectionDurs, msg, ids, seq; - seq = inSeq.collect({arg mSeq; mSeq[0]}); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - pbinds = voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs, attacks, rels, amps; - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - //attacks = 2.collect({rrand(1, 3)}) ++ freqs.drop(2).collect({rrand(0.3, 0.5)}); - attacks = fDurs.collect({arg dur; dur * rrand(0.2, 0.4)}); - //rels = freqs.drop(2).collect({rrand(0.3, 0.5)}) ++ 2.collect({rrand(1, 3)}); - rels = (clumps.size - 1).collect({arg c; - if(clumps[c + 1][0] == ["Rest"], {rrand(1.0, 3.0)}, {rrand(0.3, 0.5)}); - }); - rels = rels.add(rrand(1.0, 3.0)); - amps = freqs.collect({rrand(0.6, 0.99)}); - - [ - Pbind( - \instrument, \string_model, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \attack, Pseq(attacks, 1), - \sustain, Pseq(fDurs, 1), - \release, Pseq(rels, 1), - //\amp, Pseq(amps, 1), - \amp, Pbrown(0.5, 1, 0.5), - \busIndex, v - ), - Pbind( - \instrument, \sine, - \group, group, - \freq, Pseq(freqs, 1), - \dur, Pseq(fDurs, 1), - \sustain, Pseq(fDurs, 1), - \busIndex, v - ) - ] - }).flatten; - if(oneShot.not, { - msg = inSeq.collect({arg mSeq, m; mSeq[1..]}); - //ids = inSeq.collect({arg mSeq, m; mSeq[2]}); - sectionDurs = seq.collect({arg mSeq; mSeq.flatten2(mSeq.maxDepth - 5).flop[1].sum}); - pbinds = pbinds ++ - [ - Pbind( - \type, \osc, - \addr, addr, - \path, "/playing", - \msg, Pseq(msg, 1), - \dur, Pseq(sectionDurs, 1) - ); - ] - }); - res = Ppar(pbinds); - res -}; - -/* -genMidiPatterns = {arg seq; - var voices, durs, patterns, res, mOut, pbRange; - pbRange = 1; //semitones - change this as needed for your situation - mOut = MIDIOut.newByName("TiMidity", "TiMidity port 0").latency_(Server.default.latency); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; - res = Ppar( - voices.flop.collect({arg voice, v; - var clumps, hdScores, freqs, fDurs; - - mOut.program(v, 70); - - clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); - fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); - - Pbind( - \type, \midi, - \chan, v, - \noteval, Pseq(freqs.cpsmidi - 24, 1), - \note, Pfunc({ | event | event[\noteval].floor }), - \dur, Pseq(fDurs, 1), - \midiout, mOut, - \amp, 1, - \bend, Pfunc({ - | event | - if (event[\note].isRest.not) { - var pitchbendvalue = event[\noteval].frac.linlin(0, pbRange, 8192, 8192*2).asInteger; - m.bend(v, pitchbendvalue); - }; - 0; // return something other than nil to avoid stopping the pattern - }), - ); - }); - ); - res -}; -*/ - - -//------resource management funcs - -genUID = {Date.seed.asHexString.toLower}; - -seedFunc = {arg func, seed; - var funcArgs, next; - next = Routine({loop{func.valueArray(funcArgs).yield }}); - next.randSeed_(seed); - {arg ...args; funcArgs = args; next.value} -}; - -stringifyToDepth = {arg data, maxDepth = 1; - var prettyString = "", rCount = 0, writeArray, indent; - - if(maxDepth == 0, { - data.asCompileString - }, { - indent = {arg size; size.collect({" "}).join("")}; - writeArray = {arg array; - prettyString = prettyString ++ indent.value(rCount) ++ "[\n"; - rCount = rCount + 1; - if(rCount < maxDepth, { - array.do({arg subArray; writeArray.value(subArray)}); - }, { - prettyString = prettyString ++ array.collect({arg subArray; - indent.value(rCount + 1) ++ subArray.asCompileString - }).join(",\n"); - }); - rCount = rCount - 1; - prettyString = prettyString ++ "\n" ++ indent.value(rCount) ++ "],\n"; - }; - - writeArray.value(data); - prettyString.replace(",\n\n", "\n").drop(-2); - }) -}; - -sanityCheck = {arg motif, index; - //print functions = very helpful - ("----------" + index + "------------").postln; - - motif.flatten.do({arg val, v; - if(v > 0, { - if(motif.flatten[v-1][0].hammingDistance(val[0]) > 1, {"problem 1".postln}); - if(motif.flatten[v-1][0].hammingDistance(val[0]) == 0, {"problem 2".postln}); - }); - val.postln - }); - "***********".postln; -}; - -msgInterpret = {arg in, escapeDoubleQuotes = true, escapeSingleQuotes = true; - var res; - - res = in; - if(res.isNil.not, { - if((res.isArray && res.isString.not), { - res = res.asCompileString; - res = res.replace(" ", "").replace("\n", "").replace("\t", ""); - if(escapeSingleQuotes, {res = res.replace("\'", "")}); - if(escapeDoubleQuotes, {res = res.replace("\"", "")}); - res = res.replace("Rest", "\"Rest\""); - res = res.interpret; - }, { - var tmpRes; - if(res.every({arg char; char.isDecDigit}), {tmpRes = res.asInteger}); - if(res.contains("."), {tmpRes = res.asFloat}); - if(tmpRes != nil, {res = tmpRes}); - }); - }); - res -}; - -writeResources = {arg path, dict; - var file, modelItems, resString; - file = File(path,"w"); - - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - - resString = nameSpaces.collect({arg nameSpace; - var depth = 0, insert = " "; - if(nameSpace == "music_data", {depth = 3; insert = "\n"}); - if(nameSpace == "last_changes", {depth = 1; insert = "\n"}); - if(nameSpace == "order", {depth = 1; insert = "\n"}); - if((nameSpace == "ref_uid") && (dict[nameSpace] == nil), {dict[nameSpace] = "nil"}); - "\"" ++ nameSpace ++ "\":" ++ insert ++ stringifyToDepth.value(dict[nameSpace], depth) - }).join(",\n"); - - resString = "{\n" ++ resString ++ "\n}"; - - file.write(resString); - file.close; - resString -}; - -loadModelFile = {arg path; loadModelJSON.value(File(path, "r").readAllString.parseJSON)}; - -loadModelJSON = {arg jsonObject; - var dict; - dict = Dictionary.with(*nameSpaces.collect({arg nS; nS->msgInterpret.value(jsonObject[nS])})); - dict -}; - -setGlobalVars = {arg dict, skipLastXChanges = false; - var tmpLastXChanges; - tmpLastXChanges = lastXChanges.deepCopy; - // order really matters!!!! - # seq, lastXChanges, curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited = nameSpaces.collect({arg nS; dict[nS]}); - if(skipLastXChanges, {lastXChanges = tmpLastXChanges}); - dict -}; - -globalVarsToDict = { - var modelItems, dict; - // order really matters!!!! - modelItems = [ - seq, lastXChanges, - curUID, refUID, orderSeed, durSeed, motifSeed, - entrancesProbVals, passagesProbVals, exitsProbVals, - ranges, stepProbsVals, passagesWeights, hdExp, hdInvert, - orders, susWeights, orderSize, passagesSize, - motifEdited, orderEdited - ]; - dict = Dictionary.with(*nameSpaces.collect({arg nS, n; nS->modelItems[n]})); -}; - -loadLedgerFile = {arg path; - ledgerPath = path; - resourceDir = path.splitext(".").drop(-1).join; - loadLedgerJSON.value(File(ledgerPath, "r").readAllString.parseJSON) -}; - -loadLedgerJSON = {arg jsonObject; ledger = jsonObject["ledger"]}; - -saveLedger = {arg ledger, path; - var file, curResourceDir; - file = File(path, "w"); - curResourceDir = resourceDir; - resourceDir = path.splitext(".").drop(-1).join; - if(curResourceDir != resourceDir, { - File.mkdir(resourceDir); - ledger.do({arg id; - File.copy(curResourceDir +/+ id, resourceDir +/+ id); - }); - }); - file.write("{\n\"ledger\":\n" ++ stringifyToDepth.value(ledger, 1) ++ "\n}"); - file.close; -}; - -//------global vars - -primes = [[2, 1], [3, 2], [5, 4], [7, 4], [11, 8], [13, 8]]; -//ranges = [[-2400, 0], [-1200, 1200], [0, 2400], [0, 2400]]; -exPath = thisProcess.nowExecutingPath; -dir = exPath.dirname; -//popSize = 4; -dims = primes.size; -tuples = genTuples.value(); -//refUID = nil; -group = Group.new; -~group = group; -loadLedgerFile.value(dir +/+ ".." +/+ "resources" +/+ "piece_ledger.json"); -resourceDir = (dir +/+ ".." +/+ "resources" +/+ "piece_ledger"); -//passagesWeights = [1, 1, 1, 1, 1]; -//susWeights = [1, 1, 1]; -// order really matters!!!! -nameSpaces = [ - "music_data", "last_changes", "cur_uid", "ref_uid", "order_seed", "dur_seed", "motifs_seed", - "entrances_probs_vals","passages_probs_vals", "exits_probs_vals", - "ranges", "step_probs_vals", "passages_weights", "hd_exp", "hd_invert", - "order", "sus_weights", "order_size", "passages_size", - "motif_edited", "order_edited" -]; - - -//------OSC funcs - -OSCdef(\load_ledger, {arg msg, time, addr, port; - loadLedgerFile.value(msg[1].asString); -}, \load_ledger); - -OSCdef(\load_model, {arg msg, time, addr, port; - var dict; - dict = loadModelFile.value(msg[1].asString); - setGlobalVars.value(dict); -}, \load_model); - -OSCdef(\save_ledger, {arg msg, time, addr, port; - msg.postln; - ledger = msgInterpret.value(msg[1].asString.parseJSON["ledger"], false).postln; - //loadLedgerJSON.value(msg[0]) - saveLedger.value(ledger, msg[2].asString); - //loadLedgerFile.value(msg[1].asString); -}, \save_ledger); - -OSCdef(\generate, {arg msg, time, addr, port; - var path, dict, durSeeds, musPath, modelString; - msg.postln; - - path = msg[1].asString; - - dict = loadModelFile.value(path); - setGlobalVars.value(dict, true); - - popSize = ranges.size; - - //refUID.postln; - - loadLedgerFile.value(ledgerPath); - if(ledger == nil, {ledger = ["tmp"]}); - if(ledger.last != "tmp", {ledger = ledger.add("tmp")}); - - if(refUID == nil, {lastXChanges = [initVoices.value().deepCopy]}); - if((refUID != nil) && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - lastXChanges = msgInterpret.value(file.readAllString.parseJSON["last_changes"]); - }); - - refUID.postln; - lastXChanges.collect({arg item; item.postln}); - - durSeeds = seedFunc.value({3.collect({rrand(100000, 999999)})}, durSeed).value.postln; - entrancesDurFunc = genDurFunc.valueArray(entrancesProbVals[..4] ++ [entrancesProbVals[5..]] ++ [durSeeds[0]]); - passagesDurFunc = genDurFunc.valueArray(passagesProbVals[..4] ++ [passagesProbVals[5..]] ++ [durSeeds[1]]); - exitsDurFunc = genDurFunc.valueArray(exitsProbVals[..4] ++ [exitsProbVals[5..]] ++ [durSeeds[2]]); - - if(orders == nil, { - orders = seedFunc.value(genOrders, orderSeed).valueArray(orderSize ++ passagesSize); - //addr.sendMsg("/order", stringifyToDepth.value(orders, 1)); - }); - - stepFunc = genStepFunc.valueArray(stepProbsVals[..1] ++ [stepProbsVals[2..]] ++ [motifSeed]); - seq = seedFunc.value(genMotif, motifSeed).value; - - lastXChanges.collect({arg item; item.postln}); - - dict = globalVarsToDict.value; - modelString = writeResources.value(path, dict); - - //addr.sendMsg("/generated", musPath, stringifyToDepth.value(seq, 3)); - //~seq = seq; - - addr.sendMsg("/generated", path, modelString, ledgerPath); -}, \generate); - - -OSCdef(\commit, {arg msg, time, addr, port; - var musicData, musicChanged, dict, newLedger, modelPath, musString, musFile, test1, test2, lastCurUID, commitType, commitPos, equalityLedger; - //msg.postln; - - /* - test1 = msg[1].asString.parseJSON; - test2 = (dir +/+ ".." +/+ "resources/tmp/tmp_music" ++ ".json").standardizePath.parseJSONFile; - msgInterpret.value(test1["music"])[0][0][0][1].class.postln; - msgInterpret.value(test2["music_data"])[0][0][0][1].class.postln; - (test1["music"] == test2["music_data"]).postln; - */ - - musicData = loadModelJSON.value(msg[1].asString.parseJSON)["music_data"].postln; - musicChanged = (musicData != seq).postln; - commitType = msg[2].asString; - commitPos = msg[3].postln.asInteger; - - lastCurUID = curUID.deepCopy; - curUID = genUID.value; - - File.mkdir((resourceDir +/+ curUID).standardizePath); - File.copy(exPath, (resourceDir +/+ curUID +/+ curUID ++ "_code" ++ ".scd").standardizePath); - - modelPath = (resourceDir +/+ curUID +/+ curUID ++ "_mus_model" ++ ".json").standardizePath; - dict = globalVarsToDict.value; - if(musicChanged, { - seq = musicData; - dict["music_data"] = seq; - dict["motif_edited"] = "true" - }); - dict["cur_uid"] = curUID; - - writeResources.value(modelPath, dict); - - File.delete(ledgerPath ++ "_bak"); - File.copy(ledgerPath, ledgerPath ++ "_bak"); - File.delete(ledgerPath); - - /* - if(commitType == "add", { - if(lastCurUID == "tmp", { - ledger = ledger.drop(-1).add(curUID); - }, { - ledger = ledger.add(curUID); - }) - }); - */ - - ledger.postln; - - if(commitType == "add", {ledger = ledger.add(curUID)}); - - if(commitType == "insert", {ledger = ledger.insert(commitPos + 1, curUID)}); - - if(commitType == "replace", {ledger = ledger.put(commitPos, curUID)}); - - equalityLedger = ledger.collect({arg item; item.asSymbol}); - if(equalityLedger.includes(\tmp).postln, {ledger.removeAt(equalityLedger.indexOf(\tmp).postln)}); - - ledger.postln; - - saveLedger.value(ledger, ledgerPath); - - addr.sendMsg("/committed", curUID, ledgerPath); - //refUID = curUID; - -}, \commit); - -OSCdef(\transport, {arg msg, time, addr, port; - msg.postln; - if(msg[1] == 0, { - group.set(\release, 2); - group.set(\gate, 0); - player.stop; - }, { - // the cued sequence can now be read from file, so this can be cleaned up - var cSize, patterns, pSeq, cuedSeek, indexStart, indexEnd, tmpLedger; - if(msg[1] == 1, { - pSeq = []; - cuedSeek = (seq != nil); - indexStart = msg[2].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.postln.parseJSON["music_data"]), path, indexStart + index, uid]); - file.close; - }); - }); - if(cuedSeek, { - var path, file; - path = (resourceDir +/+ "tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - patterns = genPatterns.value(pSeq, addr); - }, { - pSeq = [loadModelJSON.value(msg[2].asString.parseJSON)["music_data"].postln]; - patterns = genPatterns.value(pSeq, addr, true); - }); - player = Pfset(pattern: patterns, cleanupFunc: { - addr.sendMsg("/transport", 0); - addr.sendMsg("/one_shot", 0); - }); - player = player.play - }); -}, \transport); - - -OSCdef(\transcribe_motif, {arg msg, time, addr, port; - var tSeq, refChord, refUID; - - msg.postln; - - tSeq = [loadModelJSON.value(msg[1].asString.parseJSON)["music_data"]]; - refUID = msg[2].asString.postln; - - if((refUID != "nil") && (refUID != "tmp"), { - var file; - file = File((resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }, { - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - }); - - ~transcribe.value(tSeq, refChord, (dir +/+ ".." +/+ "lilypond" +/+ "includes").standardizePath, addr, "/transcribe_motif"); -}, \transcribe_motif); - - -OSCdef(\transcribe_all, {arg msg, time, addr, port; - var cSize, patterns, cuedSeek, indexStart, indexEnd, tmpLedger; - if(true, { - cuedSeek = (seq != nil); - indexStart = msg[1].asInteger; - indexEnd = ledger.size - if(cuedSeek, {2}, {1}); - - //tmp for testing transcription - //indexEnd = (indexStart+5); - - //ledger.postln; - if(((indexStart == (ledger.size - 1)) && cuedSeek).not, { - var lilyPartLedgerFiles; - - lilyPartLedgerFiles = 4.collect({arg p; - File((dir +/+ ".." +/+ "lilypond" +/+ "includes" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly").standardizePath, "w"); - }); - - ledger[indexStart..indexEnd].do({arg uid, index; - var path, file, fileString, tSeq, refUID, refChord; - path = (resourceDir +/+ uid +/+ uid ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - fileString = file.readAllString; - tSeq = msgInterpret.value(fileString.parseJSON["music_data"]); - refUID = msgInterpret.value(fileString.parseJSON["ref_uid"]); - file.close; - - //uid.postln; - //(refUID == "nil").postln; - - refChord = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]; - - if(refUID != "nil", { - path = (resourceDir +/+ refUID +/+ refUID ++ "_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - refChord = msgInterpret.value(file.readAllString.parseJSON["last_changes"]).last; - file.close; - }); - - if(index != indexEnd, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath); - }, { - ~transcribe.value(tSeq, refChord, (resourceDir +/+ uid +/+ "lilypond").standardizePath, addr, "/transcribe_all"); - }); - - lilyPartLedgerFiles.do({arg f, p; - f.write("\\include \"" ++ resourceDir +/+ uid +/+ "lilypond" +/+ "part_" ++ ["IV", "III", "II", "I"][p] ++ ".ly\"\n"); - }); - - }); - - lilyPartLedgerFiles.do({arg f; - f.close - }); - }); - /* - if(cuedSeek, { - var path, file; - path = (dir +/+ ".." +/+ "resources/tmp/tmp_mus_model" ++ ".json").standardizePath; - file = File(path, "r"); - pSeq = pSeq.add([msgInterpret.value(file.readAllString.parseJSON["music_data"]), path, ledger.size - 1, "tmp"]); - file.close; - }); - */ - }, { - - }); - -}, \transcribe_all); - -) - - diff --git a/resources/string_quartet_3/7e230015/7e230015_mus_model.json b/resources/string_quartet_3/7e230015/7e230015_mus_model.json deleted file mode 100644 index 7948320..0000000 --- a/resources/string_quartet_3/7e230015/7e230015_mus_model.json +++ /dev/null @@ -1,532 +0,0 @@ -{ -"music_data": -[ - [ - [ - [ [ [ "Rest" ], [ "Rest" ], [ 0, 0, 0, 0, 0, 0 ], [ "Rest" ] ], 1 ], - [ [ [ "Rest" ], [ "Rest" ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1 ], - [ [ [ "Rest" ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1 ], - [ [ [ -1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1 ], - [ [ [ -2, 1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -2, 1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1 ], - [ [ [ -2, 1, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -2, 1, 0, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -2, 1, 0, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ] ], 1 ], - [ [ [ -1, 0, -1, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ] ], 1 ], - [ [ [ -1, 0, -1, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ 1, 0, -1, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, 0, -1, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ] ], 1 ], - [ [ [ -2, 0, 0, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -2, 0, 0, 0, 0, 0 ], [ 0, 0, 0, -1, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ -1, 1, 0, 0, 0, 0 ] ], 1 ], - [ [ [ -2, 0, 0, 0, 0, 0 ], [ 0, 0, 0, -1, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, -1, 0, 0, 0 ] ], 1 ], - [ [ [ -1, 0, 0, -1, 0, 0 ], [ 0, 0, 0, -1, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, -1, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, 0, 0, -1, 0, 0 ], [ 0, 0, 0, -1, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, -1, 0, 0 ] ], 1 ], - [ [ [ -1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, -1, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, -1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, 0, 0, 0, 0, 0 ], [ -1, 0, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, -1, 0, 0 ] ], 1 ], - [ [ [ -1, 0, 0, 0, 0, 0 ], [ -1, 0, 1, 0, 0, 0 ], [ 1, 0, 0, -1, 0, 0 ], [ 0, 1, 0, -1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, 0, 0, 0, 0, 0 ], [ -1, 0, 1, 0, 0, 0 ], [ 1, 0, 0, -1, 0, 0 ], [ 0, 1, 0, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, 0, 0, 0, 0, 0 ], [ -1, 0, 1, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, 1, 1, 0, 0, 0 ], [ -1, 0, 1, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0 ] ], 1 ], - [ [ [ -1, 1, 1, 0, 0, 0 ], [ -1, 0, 1, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ 0, 1, 1, 0, 0, 0 ] ], 1 ], - [ [ [ -1, 1, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ 0, 1, 1, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, 0, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ 0, 1, 1, 0, 0, 0 ] ], 1 ], - [ [ [ -1, 0, 1, 0, 0, 0 ], [ -1, 1, 1, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ 0, 1, 1, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, 0, 1, 0, 0, 0 ], [ -1, 1, 1, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ 1, 0, 1, -1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, 0, 1, 0, 0, 0 ], [ -1, 1, 1, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ -1, 0, 2, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, 0, 1, 0, 0, 0 ], [ -1, 1, 1, 0, 0, 0 ], [ -1, 0, 2, 1, 0, 0 ], [ -1, 0, 2, 0, 0, 0 ] ], 1 ], - [ [ [ -1, 0, 1, 0, 0, 0 ], [ 0, -1, 2, 0, 0, 0 ], [ -1, 0, 2, 1, 0, 0 ], [ -1, 0, 2, 0, 0, 0 ] ], 1 ], - [ [ [ -1, -1, 2, 0, 0, 0 ], [ 0, -1, 2, 0, 0, 0 ], [ -1, 0, 2, 1, 0, 0 ], [ -1, 0, 2, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, -1, 2, 1, 0, 0 ], [ 0, -1, 2, 0, 0, 0 ], [ -1, 0, 2, 1, 0, 0 ], [ -1, 0, 2, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, -1, 2, 1, 0, 0 ], [ -1, 1, 2, 0, 0, 0 ], [ -1, 0, 2, 1, 0, 0 ], [ -1, 0, 2, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, -1, 2, 1, 0, 0 ], [ -1, 1, 2, 0, 0, 0 ], [ -1, 0, 2, 1, 0, 0 ], [ -2, 0, 2, 1, 0, 0 ] ], 1 ], - [ [ [ -2, 1, 2, 1, 0, 0 ], [ -1, 1, 2, 0, 0, 0 ], [ -1, 0, 2, 1, 0, 0 ], [ -2, 0, 2, 1, 0, 0 ] ], 1 ], - [ [ [ -2, 1, 2, 1, 0, 0 ], [ -1, -1, 2, 1, 0, 0 ], [ -1, 0, 2, 1, 0, 0 ], [ -2, 0, 2, 1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -2, 1, 2, 1, 0, 0 ], [ -1, -1, 2, 1, 0, 0 ], [ -1, 0, 2, 1, 0, 0 ], [ -1, -1, 1, 1, 0, 0 ] ], 1 ], - [ [ [ -1, -1, 3, 1, 0, 0 ], [ -1, -1, 2, 1, 0, 0 ], [ -1, 0, 2, 1, 0, 0 ], [ -1, -1, 1, 1, 0, 0 ] ], 1 ], - [ [ [ -1, -1, 3, 1, 0, 0 ], [ -1, -1, 2, 1, 0, 0 ], [ 0, -1, 1, 1, 0, 0 ], [ -1, -1, 1, 1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, -1, 3, 1, 0, 0 ], [ -1, -1, 2, 1, 0, 0 ], [ 0, -1, 1, 1, 0, 0 ], [ -1, -1, 1, 1, 0, 1 ] ], 1 ], - [ [ [ -1, -1, 3, 1, 0, 0 ], [ 0, -2, 1, 1, 0, 0 ], [ 0, -1, 1, 1, 0, 0 ], [ -1, -1, 1, 1, 0, 1 ] ], 1 ] - ], - [ - [ [ [ -1, -1, 3, 1, 0, 0 ], [ 0, -2, 1, 1, 0, 0 ], [ 0, -2, 1, 1, 0, 1 ], [ -1, -1, 1, 1, 0, 1 ] ], 1 ] - ], - [ - [ [ [ -1, -1, 3, 1, 0, 0 ], [ 0, -2, 1, 1, 0, 0 ], [ 0, -2, 1, 1, 0, 1 ], [ 1, -3, 1, 1, 0, 0 ] ], 1 ], - [ [ [ 0, -2, 2, 1, 0, 0 ], [ 0, -2, 1, 1, 0, 0 ], [ 0, -2, 1, 1, 0, 1 ], [ 1, -3, 1, 1, 0, 0 ] ], 1 ], - [ [ [ 0, -2, 2, 1, 0, 0 ], [ 0, -2, 1, 1, 0, 0 ], [ 0, -2, 1, 2, 0, 0 ], [ 1, -3, 1, 1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ 0, -2, 2, 1, 0, 0 ], [ 0, -2, 1, 1, 0, 0 ], [ 0, -2, 1, 2, 0, 0 ], [ 1, -2, 1, 1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ 0, -2, 2, 1, 0, 0 ], [ 0, -2, 1, 1, 0, 0 ], [ 0, -2, 1, 2, 0, 0 ], [ 0, -2, 0, 2, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, -2, 1, 2, 0, 0 ], [ 0, -2, 1, 1, 0, 0 ], [ 0, -2, 1, 2, 0, 0 ], [ 0, -2, 0, 2, 0, 0 ] ], 1 ], - [ [ [ -1, -2, 1, 2, 0, 0 ], [ 0, -2, 1, 1, 0, 0 ], [ 0, -2, 1, 2, 0, 0 ], [ -1, -2, 1, 3, 0, 0 ] ], 1 ], - [ [ [ -1, -2, 1, 2, 0, 0 ], [ -1, -3, 1, 2, 0, 0 ], [ 0, -2, 1, 2, 0, 0 ], [ -1, -2, 1, 3, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, -2, 1, 2, 0, 0 ], [ -1, -3, 1, 2, 0, 0 ], [ 0, -2, 1, 2, 0, 0 ], [ 0, -3, 1, 2, 0, 0 ] ], 1 ], - [ [ [ -1, -2, 1, 2, 0, 0 ], [ -2, -1, 1, 2, 0, 0 ], [ 0, -2, 1, 2, 0, 0 ], [ 0, -3, 1, 2, 0, 0 ] ], 1 ], - [ [ [ -1, -2, 1, 2, 0, 0 ], [ -2, -1, 1, 2, 0, 0 ], [ 1, -2, 1, 1, 0, 0 ], [ 0, -3, 1, 2, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, -2, 1, 2, 0, 0 ], [ -2, -1, 1, 2, 0, 0 ], [ 1, -2, 1, 1, 0, 0 ], [ -1, -1, 1, 2, 0, 0 ] ], 1 ], - [ [ [ 0, -2, 1, 1, 0, 0 ], [ -2, -1, 1, 2, 0, 0 ], [ 1, -2, 1, 1, 0, 0 ], [ -1, -1, 1, 2, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -1, 0, 1, 2, 0, 0 ], [ -2, -1, 1, 2, 0, 0 ], [ 1, -2, 1, 1, 0, 0 ], [ -1, -1, 1, 2, 0, 0 ] ], 1 ], - [ [ [ -1, 0, 1, 2, 0, 0 ], [ -2, -1, 1, 2, 0, 0 ], [ -2, 0, 1, 2, 0, 0 ], [ -1, -1, 1, 2, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, -1, 1, 2, 0, 0 ], [ -2, -1, 1, 2, 0, 0 ], [ -2, 0, 1, 2, 0, 0 ], [ -1, -1, 1, 2, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, -1, 1, 2, 0, 0 ], [ -2, -1, 1, 2, 0, 0 ], [ -1, -1, 0, 2, 0, 0 ], [ -1, -1, 1, 2, 0, 0 ] ], 1 ], - [ [ [ -3, -1, 1, 2, 0, 0 ], [ -2, -1, 1, 2, 0, 0 ], [ -1, -1, 0, 2, 0, 0 ], [ -2, -1, 2, 2, 0, 0 ] ], 1 ], - [ [ [ -3, -1, 1, 2, 0, 0 ], [ -1, -1, 1, 1, 0, 0 ], [ -1, -1, 0, 2, 0, 0 ], [ -2, -1, 2, 2, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, -1, 1, 2, 0, 0 ], [ -1, -1, 1, 1, 0, 0 ], [ -1, -1, 2, 2, 0, 0 ], [ -2, -1, 2, 2, 0, 0 ] ], 1 ], - [ [ [ -3, -1, 1, 2, 0, 0 ], [ -2, -2, 2, 2, 0, 0 ], [ -1, -1, 2, 2, 0, 0 ], [ -2, -1, 2, 2, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, -1, 1, 2, 0, 0 ], [ -2, -2, 2, 2, 0, 0 ], [ -1, -1, 2, 2, 0, 0 ], [ -1, -2, 1, 2, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, -1, 1, 2, 0, 0 ], [ -2, -2, 2, 2, 0, 0 ], [ -1, -1, 2, 2, 0, 0 ], [ -2, 0, 1, 2, 0, 0 ] ], 1 ], - [ [ [ -3, -1, 1, 2, 0, 0 ], [ -2, -2, 2, 2, 0, 0 ], [ 0, -2, 1, 2, 0, 0 ], [ -2, 0, 1, 2, 0, 0 ] ], 1 ], - [ [ [ -3, -1, 1, 2, 0, 0 ], [ -2, -1, 2, 2, 0, 0 ], [ 0, -2, 1, 2, 0, 0 ], [ -2, 0, 1, 2, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, -1, 1, 2, 0, 0 ], [ -1, -2, 1, 2, 0, 0 ], [ 0, -2, 1, 2, 0, 0 ], [ -2, 0, 1, 2, 0, 0 ] ], 1 ], - [ [ [ -2, -2, 1, 2, 0, 0 ], [ -1, -2, 1, 2, 0, 0 ], [ 0, -2, 1, 2, 0, 0 ], [ -2, 0, 1, 2, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -2, -1, 1, 2, 0, 0 ], [ -1, -2, 1, 2, 0, 0 ], [ 0, -2, 1, 2, 0, 0 ], [ -2, 0, 1, 2, 0, 0 ] ], 1 ], - [ [ [ -2, -1, 1, 2, 0, 0 ], [ -1, -2, 1, 2, 0, 0 ], [ -1, 0, 1, 2, 0, 0 ], [ -2, 0, 1, 2, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 0, 1, 2, 0, 0 ], [ -1, -2, 1, 2, 0, 0 ], [ -1, 0, 1, 2, 0, 0 ], [ -2, 0, 1, 2, 0, 0 ] ], 1 ], - [ [ [ -3, 0, 1, 2, 0, 0 ], [ -2, -1, 1, 2, 0, 0 ], [ -1, 0, 1, 2, 0, 0 ], [ -2, 0, 1, 2, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 0, 1, 2, 0, 0 ], [ -3, 1, 1, 2, 0, 0 ], [ -1, 0, 1, 2, 0, 0 ], [ -2, 0, 1, 2, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 0, 1, 2, 0, 0 ], [ -3, 1, 1, 2, 0, 0 ], [ -1, 0, 1, 2, 0, 0 ], [ -3, 2, 1, 2, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 0, 1, 2, 0, 0 ], [ -3, 1, 1, 2, 0, 0 ], [ -2, 1, 1, 2, 0, 0 ], [ -3, 2, 1, 2, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 0, 1, 2, 0, 0 ], [ -3, 1, 1, 2, 0, 0 ], [ -2, 0, 1, 2, 0, 0 ], [ -3, 2, 1, 2, 0, 0 ] ], 1 ], - [ [ [ -3, 0, 1, 2, 0, 0 ], [ -3, 1, 1, 2, 0, 0 ], [ -2, 0, 1, 2, 0, 0 ], [ -2, 1, 1, 2, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -4, 1, 1, 2, 0, 0 ], [ -3, 1, 1, 2, 0, 0 ], [ -2, 0, 1, 2, 0, 0 ], [ -2, 1, 1, 2, 0, 0 ] ], 1 ], - [ [ [ -4, 1, 1, 2, 0, 0 ], [ -2, 0, 0, 2, 0, 0 ], [ -2, 0, 1, 2, 0, 0 ], [ -2, 1, 1, 2, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -4, 1, 1, 2, 0, 0 ], [ -2, 0, 0, 2, 0, 0 ], [ -3, 1, 1, 2, 0, 0 ], [ -2, 1, 1, 2, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -4, 1, 1, 2, 0, 0 ], [ -2, 0, 0, 2, 0, 0 ], [ -2, 1, 1, 1, 0, 0 ], [ -2, 1, 1, 2, 0, 0 ] ], 1 ], - [ [ [ -4, 1, 1, 2, 0, 0 ], [ -4, 2, 1, 2, 0, 0 ], [ -2, 1, 1, 1, 0, 0 ], [ -2, 1, 1, 2, 0, 0 ] ], 1 ], - [ [ [ -3, 1, 1, 1, 0, 0 ], [ -4, 2, 1, 2, 0, 0 ], [ -2, 1, 1, 1, 0, 0 ], [ -2, 1, 1, 2, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 1, 1, 1, 0, 0 ], [ -4, 2, 1, 2, 0, 0 ], [ -2, 1, 1, 1, 0, 0 ], [ -1, 1, 1, 1, 0, 0 ] ], 1 ], - [ [ [ -3, 1, 1, 1, 0, 0 ], [ -3, 2, 1, 1, 0, 0 ], [ -2, 1, 1, 1, 0, 0 ], [ -1, 1, 1, 1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 1, 1, 1, 0, 0 ], [ -3, 2, 1, 1, 0, 0 ], [ -2, 1, 1, 1, 0, 0 ], [ -2, 2, 1, 1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 1, 1, 1, 0, 0 ], [ -3, 2, 1, 1, 0, 0 ], [ -3, 3, 1, 1, 0, 0 ], [ -2, 2, 1, 1, 0, 0 ] ], 1 ], - [ [ [ -3, 1, 1, 1, 0, 0 ], [ -3, 2, 1, 1, 0, 1 ], [ -3, 3, 1, 1, 0, 0 ], [ -2, 2, 1, 1, 0, 0 ] ], 1 ], - [ [ [ -3, 2, 1, 1, 0, 0 ], [ -3, 2, 1, 1, 0, 1 ], [ -3, 3, 1, 1, 0, 0 ], [ -2, 2, 1, 1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 2, 1, 1, 0, 0 ], [ -4, 4, 1, 1, 0, 0 ], [ -3, 3, 1, 1, 0, 0 ], [ -2, 2, 1, 1, 0, 0 ] ], 1 ], - [ [ [ -3, 2, 1, 1, 0, 0 ], [ -4, 4, 1, 1, 0, 0 ], [ -3, 3, 1, 1, 0, 0 ], [ -3, 4, 1, 1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 2, 1, 1, 0, 0 ], [ -4, 4, 1, 1, 0, 0 ], [ -3, 3, 1, 1, 0, 0 ], [ -2, 3, 0, 1, 0, 0 ] ], 1 ], - [ [ [ -3, 2, 1, 1, 0, 0 ], [ -3, 3, 0, 1, 0, 0 ], [ -3, 3, 1, 1, 0, 0 ], [ -2, 3, 0, 1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 2, 1, 1, 0, 0 ], [ -4, 3, 1, 2, 0, 0 ], [ -3, 3, 1, 1, 0, 0 ], [ -2, 3, 0, 1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 2, 1, 1, 0, 0 ], [ -4, 3, 1, 2, 0, 0 ], [ -4, 3, 2, 2, 0, 0 ], [ -2, 3, 0, 1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 2, 1, 1, 0, 0 ], [ -4, 3, 1, 2, 0, 0 ], [ -3, 2, 1, 2, 0, 0 ], [ -2, 3, 0, 1, 0, 0 ] ], 1 ], - [ [ [ -3, 2, 1, 1, 0, 0 ], [ -3, 3, 1, 1, 0, 0 ], [ -3, 2, 1, 2, 0, 0 ], [ -2, 3, 0, 1, 0, 0 ] ], 1 ], - [ [ [ -3, 2, 1, 1, 0, 0 ], [ -3, 3, 1, 1, 0, 0 ], [ -3, 2, 1, 2, 0, 0 ], [ -1, 1, 1, 1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -5, 3, 1, 2, 0, 0 ], [ -3, 3, 1, 1, 0, 0 ], [ -3, 2, 1, 2, 0, 0 ], [ -1, 1, 1, 1, 0, 0 ] ], 1 ], - [ [ [ -5, 3, 1, 2, 0, 0 ], [ -2, 2, 0, 2, 0, 0 ], [ -3, 2, 1, 2, 0, 0 ], [ -1, 1, 1, 1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 1, 1, 2, 0, 0 ], [ -2, 2, 0, 2, 0, 0 ], [ -3, 2, 1, 2, 0, 0 ], [ -1, 1, 1, 1, 0, 0 ] ], 1 ], - [ [ [ -3, 1, 1, 2, 0, 0 ], [ -2, 1, 1, 2, 0, 0 ], [ -3, 2, 1, 2, 0, 0 ], [ -1, 1, 1, 1, 0, 0 ] ], 1 ], - [ [ [ -3, 1, 1, 2, 0, 0 ], [ -2, 1, 1, 2, 0, 0 ], [ -2, 1, 1, 1, 0, 0 ], [ -1, 1, 1, 1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 1, 1, 2, 0, 0 ], [ -3, 2, 1, 2, 0, 0 ], [ -2, 1, 1, 1, 0, 0 ], [ -1, 1, 1, 1, 0, 0 ] ], 1 ], - [ [ [ -3, 1, 1, 2, 0, 0 ], [ -3, 2, 1, 2, 0, 0 ], [ -2, 1, 1, 1, 1, 0 ], [ -1, 1, 1, 1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 1, 1, 2, 0, 0 ], [ -3, 2, 1, 2, 0, 0 ], [ -2, 1, 1, 1, 1, 0 ], [ -2, 1, 1, 2, 1, 0 ] ], 1 ], - [ [ [ -2, 1, 2, 1, 1, 0 ], [ -3, 2, 1, 2, 0, 0 ], [ -2, 1, 1, 1, 1, 0 ], [ -2, 1, 1, 2, 1, 0 ] ], 1 ], - [ [ [ -2, 1, 2, 1, 1, 0 ], [ -3, 1, 1, 1, 1, 0 ], [ -2, 1, 1, 1, 1, 0 ], [ -2, 1, 1, 2, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -2, 1, 2, 1, 1, 0 ], [ -4, 1, 2, 2, 1, 0 ], [ -2, 1, 1, 1, 1, 0 ], [ -2, 1, 1, 2, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -2, 1, 2, 1, 1, 0 ], [ -3, 1, 2, 1, 1, 0 ], [ -2, 1, 1, 1, 1, 0 ], [ -2, 1, 1, 2, 1, 0 ] ], 1 ], - [ [ [ -2, 1, 2, 1, 1, 0 ], [ -3, 1, 2, 1, 1, 0 ], [ -2, 1, 1, 1, 1, 0 ], [ -3, 2, 2, 1, 1, 0 ] ], 1 ], - [ [ [ -2, 1, 2, 1, 1, 0 ], [ -3, 1, 2, 1, 1, 0 ], [ -3, 1, 2, 2, 1, 0 ], [ -3, 2, 2, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -2, 1, 2, 1, 1, 0 ], [ -4, 3, 2, 1, 1, 0 ], [ -3, 1, 2, 2, 1, 0 ], [ -3, 2, 2, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 3, 2, 1, 1, 0 ], [ -4, 3, 2, 1, 1, 0 ], [ -3, 1, 2, 2, 1, 0 ], [ -3, 2, 2, 1, 1, 0 ] ], 1 ], - [ [ [ -3, 3, 2, 1, 1, 0 ], [ -4, 2, 2, 1, 1, 0 ], [ -3, 1, 2, 2, 1, 0 ], [ -3, 2, 2, 1, 1, 0 ] ], 1 ], - [ [ [ -3, 3, 2, 1, 1, 0 ], [ -4, 2, 2, 1, 1, 0 ], [ -4, 3, 2, 1, 1, 0 ], [ -3, 2, 2, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 3, 2, 1, 1, 0 ], [ -5, 4, 2, 1, 1, 0 ], [ -4, 3, 2, 1, 1, 0 ], [ -3, 2, 2, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -4, 4, 2, 1, 1, 0 ], [ -5, 4, 2, 1, 1, 0 ], [ -4, 3, 2, 1, 1, 0 ], [ -3, 2, 2, 1, 1, 0 ] ], 1 ], - [ [ [ -4, 4, 2, 1, 1, 0 ], [ -5, 4, 2, 1, 1, 0 ], [ -4, 3, 2, 1, 1, 0 ], [ -3, 3, 2, 1, 1, 0 ] ], 1 ], - [ [ [ -4, 4, 2, 1, 1, 0 ], [ -4, 3, 1, 1, 1, 0 ], [ -4, 3, 2, 1, 1, 0 ], [ -3, 3, 2, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -4, 4, 2, 1, 1, 0 ], [ -4, 3, 1, 1, 1, 0 ], [ -4, 3, 2, 1, 1, 0 ], [ -3, 3, 1, 1, 2, 0 ] ], 1 ], - [ [ [ -3, 3, 1, 1, 1, 0 ], [ -4, 3, 1, 1, 1, 0 ], [ -4, 3, 2, 1, 1, 0 ], [ -3, 3, 1, 1, 2, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 3, 1, 1, 1, 0 ], [ -4, 3, 1, 1, 1, 0 ], [ -4, 3, 2, 1, 1, 0 ], [ -3, 4, 1, 1, 1, 0 ] ], 1 ], - [ [ [ -4, 4, 1, 1, 1, 0 ], [ -4, 3, 1, 1, 1, 0 ], [ -4, 3, 2, 1, 1, 0 ], [ -3, 4, 1, 1, 1, 0 ] ], 1 ], - [ [ [ -4, 4, 1, 1, 1, 0 ], [ -4, 3, 1, 1, 1, 0 ], [ -3, 3, 1, 1, 1, 0 ], [ -3, 4, 1, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -4, 4, 1, 1, 1, 0 ], [ -4, 4, 1, 1, 0, 0 ], [ -3, 3, 1, 1, 1, 0 ], [ -3, 4, 1, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -4, 4, 1, 1, 1, 0 ], [ -4, 4, 1, 1, 0, 0 ], [ -3, 3, 1, 1, 1, 0 ], [ -4, 5, 1, 1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -4, 4, 1, 1, 1, 0 ], [ -4, 4, 1, 1, 0, 0 ], [ -3, 3, 1, 1, 1, 0 ], [ -3, 4, 1, 1, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -2, 3, 1, 1, 0, 0 ], [ -4, 4, 1, 1, 0, 0 ], [ -3, 3, 1, 1, 1, 0 ], [ -3, 4, 1, 1, 0, 0 ] ], 1 ], - [ [ [ -2, 3, 1, 1, 0, 0 ], [ -3, 3, 1, 1, 0, 0 ], [ -3, 3, 1, 1, 1, 0 ], [ -3, 4, 1, 1, 0, 0 ] ], 1 ], - [ [ [ -2, 3, 1, 1, 0, 0 ], [ -3, 3, 1, 1, 0, 0 ], [ -3, 3, 1, 1, 1, 0 ], [ -2, 3, 1, 1, 1, -1 ] ], 1 ] - ], - [ - [ [ [ -2, 3, 1, 1, 0, 0 ], [ -3, 3, 0, 1, 1, 0 ], [ -3, 3, 1, 1, 1, 0 ], [ -2, 3, 1, 1, 1, -1 ] ], 1 ] - ], - [ - [ [ [ -2, 3, 1, 1, 0, 0 ], [ -2, 3, 1, 1, 0, -1 ], [ -3, 3, 1, 1, 1, 0 ], [ -2, 3, 1, 1, 1, -1 ] ], 1 ], - [ [ [ -2, 3, 1, 1, 0, 0 ], [ -2, 3, 1, 1, 0, -1 ], [ -3, 4, 1, 1, 0, 0 ], [ -2, 3, 1, 1, 1, -1 ] ], 1 ] - ], - [ - [ [ [ -2, 3, 1, 1, 0, 0 ], [ -3, 3, 1, 1, 1, 0 ], [ -3, 4, 1, 1, 0, 0 ], [ -2, 3, 1, 1, 1, -1 ] ], 1 ], - [ [ [ -2, 3, 1, 1, 0, 0 ], [ -3, 3, 1, 1, 1, 0 ], [ -3, 4, 1, 1, 0, 0 ], [ -4, 4, 1, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -2, 3, 1, 1, 0, 0 ], [ -3, 3, 1, 1, 1, 0 ], [ -3, 4, 1, 1, 0, 0 ], [ -3, 3, 0, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -2, 3, 1, 1, 0, 0 ], [ -3, 3, 1, 1, 1, 0 ], [ -3, 4, 0, 1, 1, 0 ], [ -3, 3, 0, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -2, 3, 1, 1, 0, 0 ], [ -3, 4, 1, 1, 1, 0 ], [ -3, 4, 0, 1, 1, 0 ], [ -3, 3, 0, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 3, 1, 1, 1, 0 ], [ -3, 4, 1, 1, 1, 0 ], [ -3, 4, 0, 1, 1, 0 ], [ -3, 3, 0, 1, 1, 0 ] ], 1 ], - [ [ [ -3, 3, 1, 1, 1, 0 ], [ -3, 4, 1, 1, 1, 0 ], [ -4, 4, 1, 1, 1, 0 ], [ -3, 3, 0, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 4, 0, 1, 1, 0 ], [ -3, 4, 1, 1, 1, 0 ], [ -4, 4, 1, 1, 1, 0 ], [ -3, 3, 0, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 4, 0, 1, 1, 0 ], [ -3, 4, 1, 1, 1, 0 ], [ -4, 4, 1, 1, 1, 0 ], [ -4, 4, 0, 1, 1, 0 ] ], 1 ], - [ [ [ -4, 4, 1, 2, 1, 0 ], [ -3, 4, 1, 1, 1, 0 ], [ -4, 4, 1, 1, 1, 0 ], [ -4, 4, 0, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -4, 5, 1, 1, 1, 0 ], [ -3, 4, 1, 1, 1, 0 ], [ -4, 4, 1, 1, 1, 0 ], [ -4, 4, 0, 1, 1, 0 ] ], 1 ], - [ [ [ -4, 5, 1, 1, 1, 0 ], [ -4, 5, 0, 1, 1, 0 ], [ -4, 4, 1, 1, 1, 0 ], [ -4, 4, 0, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 4, 0, 1, 1, 0 ], [ -4, 5, 0, 1, 1, 0 ], [ -4, 4, 1, 1, 1, 0 ], [ -4, 4, 0, 1, 1, 0 ] ], 1 ], - [ [ [ -3, 4, 0, 1, 1, 0 ], [ -4, 5, 0, 1, 1, 0 ], [ -4, 4, 1, 1, 1, 0 ], [ -4, 5, 1, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 4, 0, 1, 1, 0 ], [ -4, 5, 0, 1, 1, 0 ], [ -4, 4, 1, 1, 1, 0 ], [ -3, 4, 1, 1, 1, 0 ] ], 1 ], - [ [ [ -3, 4, 0, 1, 1, 0 ], [ -4, 4, 0, 1, 1, 0 ], [ -4, 4, 1, 1, 1, 0 ], [ -3, 4, 1, 1, 1, 0 ] ], 1 ], - [ [ [ -3, 4, 0, 1, 1, 0 ], [ -4, 4, 0, 1, 1, 0 ], [ -3, 3, 0, 1, 1, 0 ], [ -3, 4, 1, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 4, 0, 1, 1, 0 ], [ -4, 4, 0, 1, 1, 0 ], [ -3, 3, 0, 1, 1, 0 ], [ -4, 5, 0, 1, 1, 0 ] ], 1 ], - [ [ [ -5, 4, 0, 1, 1, 0 ], [ -4, 4, 0, 1, 1, 0 ], [ -3, 3, 0, 1, 1, 0 ], [ -4, 5, 0, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -5, 4, 0, 1, 1, 0 ], [ -4, 4, 0, 1, 1, 0 ], [ -3, 3, 0, 1, 1, 0 ], [ -3, 4, 0, 1, 1, 0 ] ], 1 ], - [ [ [ -4, 3, 0, 1, 1, 0 ], [ -4, 4, 0, 1, 1, 0 ], [ -3, 3, 0, 1, 1, 0 ], [ -3, 4, 0, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -4, 3, 0, 1, 1, 0 ], [ -4, 4, 0, 1, 1, 0 ], [ -4, 5, 0, 1, 1, 0 ], [ -3, 4, 0, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -4, 3, 0, 1, 1, 0 ], [ -3, 3, -1, 1, 1, 0 ], [ -4, 5, 0, 1, 1, 0 ], [ -3, 4, 0, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -6, 5, 0, 1, 1, 0 ], [ -3, 3, -1, 1, 1, 0 ], [ -4, 5, 0, 1, 1, 0 ], [ -3, 4, 0, 1, 1, 0 ] ], 1 ], - [ [ [ -6, 5, 0, 1, 1, 0 ], [ -3, 3, -1, 1, 1, 0 ], [ -4, 5, 0, 1, 1, 0 ], [ -4, 6, 0, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -6, 5, 0, 1, 1, 0 ], [ -3, 3, -1, 1, 1, 0 ], [ -5, 6, -1, 1, 1, 0 ], [ -4, 6, 0, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -6, 6, -1, 1, 1, 0 ], [ -3, 3, -1, 1, 1, 0 ], [ -5, 6, -1, 1, 1, 0 ], [ -4, 6, 0, 1, 1, 0 ] ], 1 ], - [ [ [ -6, 6, -1, 1, 1, 0 ], [ -3, 3, -1, 1, 1, 0 ], [ -5, 6, 0, 1, 1, 0 ], [ -4, 6, 0, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -6, 6, -1, 1, 1, 0 ], [ -5, 6, -1, 1, 1, 0 ], [ -5, 6, 0, 1, 1, 0 ], [ -4, 6, 0, 1, 1, 0 ] ], 1 ], - [ [ [ -6, 6, 0, 1, 1, 0 ], [ -5, 6, -1, 1, 1, 0 ], [ -5, 6, 0, 1, 1, 0 ], [ -4, 6, 0, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -6, 6, 0, 1, 1, 0 ], [ -5, 6, -1, 1, 1, 0 ], [ -5, 6, 0, 1, 1, 0 ], [ -4, 5, 0, 1, 1, 0 ] ], 1 ], - [ [ [ -6, 6, 0, 1, 1, 0 ], [ -5, 6, -1, 1, 1, 0 ], [ -4, 6, -1, 1, 1, 0 ], [ -4, 5, 0, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -5, 5, -1, 1, 1, 0 ], [ -5, 6, -1, 1, 1, 0 ], [ -4, 6, -1, 1, 1, 0 ], [ -4, 5, 0, 1, 1, 0 ] ], 1 ], - [ [ [ -5, 5, -1, 1, 1, 0 ], [ -4, 5, -1, 1, 1, 0 ], [ -4, 6, -1, 1, 1, 0 ], [ -4, 5, 0, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -5, 5, -1, 1, 1, 0 ], [ -4, 5, -1, 1, 1, 0 ], [ -3, 5, -2, 1, 1, 0 ], [ -4, 5, 0, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -5, 5, -1, 1, 1, 0 ], [ -4, 5, -1, 1, 1, 0 ], [ -3, 5, -2, 1, 1, 0 ], [ -3, 5, -1, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -4, 5, -2, 1, 1, 0 ], [ -4, 5, -1, 1, 1, 0 ], [ -3, 5, -2, 1, 1, 0 ], [ -3, 5, -1, 1, 1, 0 ] ], 1 ], - [ [ [ -4, 5, -2, 1, 1, 0 ], [ -4, 5, -1, 1, 1, 0 ], [ -3, 5, -2, 1, 1, 0 ], [ -4, 6, -1, 1, 1, 0 ] ], 1 ], - [ [ [ -4, 5, -2, 1, 1, 0 ], [ -4, 5, -1, 1, 1, 0 ], [ -4, 5, -1, 2, 1, 0 ], [ -4, 6, -1, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -4, 5, -2, 1, 1, 0 ], [ -4, 5, -1, 1, 1, 0 ], [ -4, 5, -1, 2, 1, 0 ], [ -3, 5, -2, 1, 1, 0 ] ], 1 ], - [ [ [ -4, 5, -2, 1, 1, 0 ], [ -4, 5, -1, 1, 1, 0 ], [ -3, 5, -1, 1, 1, 0 ], [ -3, 5, -2, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -4, 5, -2, 1, 1, 0 ], [ -4, 5, -1, 1, 1, 0 ], [ -2, 4, -2, 1, 1, 0 ], [ -3, 5, -2, 1, 1, 0 ] ], 1 ], - [ [ [ -4, 5, -2, 1, 1, 0 ], [ -4, 5, -1, 1, 1, 0 ], [ -2, 4, -2, 1, 1, 0 ], [ -3, 4, -2, 1, 1, 0 ] ], 1 ], - [ [ [ -4, 5, -2, 1, 1, 0 ], [ -3, 5, -2, 1, 1, 0 ], [ -2, 4, -2, 1, 1, 0 ], [ -3, 4, -2, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -4, 5, -2, 1, 1, 0 ], [ -2, 5, -2, 0, 1, 0 ], [ -2, 4, -2, 1, 1, 0 ], [ -3, 4, -2, 1, 1, 0 ] ], 1 ], - [ [ [ -4, 5, -2, 1, 1, 0 ], [ -2, 5, -2, 0, 1, 0 ], [ -2, 4, -2, 1, 1, 0 ], [ -4, 6, -2, 1, 1, 0 ] ], 1 ], - [ [ [ -4, 5, -2, 1, 1, 0 ], [ -2, 5, -2, 0, 1, 0 ], [ -3, 5, -2, 1, 1, 0 ], [ -4, 6, -2, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -5, 5, -2, 1, 1, 0 ], [ -2, 5, -2, 0, 1, 0 ], [ -3, 5, -2, 1, 1, 0 ], [ -4, 6, -2, 1, 1, 0 ] ], 1 ], - [ [ [ -5, 5, -2, 1, 1, 0 ], [ -4, 5, -2, 1, 1, 0 ], [ -3, 5, -2, 1, 1, 0 ], [ -4, 6, -2, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -5, 5, -2, 1, 1, 0 ], [ -4, 5, -2, 1, 1, 0 ], [ -4, 7, -2, 1, 1, 0 ], [ -4, 6, -2, 1, 1, 0 ] ], 1 ], - [ [ [ -5, 5, -2, 1, 1, 0 ], [ -5, 6, -2, 1, 1, 0 ], [ -4, 7, -2, 1, 1, 0 ], [ -4, 6, -2, 1, 1, 0 ] ], 1 ], - [ [ [ -6, 6, -2, 1, 1, 0 ], [ -5, 6, -2, 1, 1, 0 ], [ -4, 7, -2, 1, 1, 0 ], [ -4, 6, -2, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -6, 7, -2, 1, 1, 0 ], [ -5, 6, -2, 1, 1, 0 ], [ -4, 7, -2, 1, 1, 0 ], [ -4, 6, -2, 1, 1, 0 ] ], 1 ], - [ [ [ -6, 7, -2, 1, 1, 0 ], [ -5, 6, -2, 1, 1, 0 ], [ -5, 7, -2, 1, 1, 0 ], [ -4, 6, -2, 1, 1, 0 ] ], 1 ] - ], - [ - [ [ [ -6, 7, -2, 1, 1, 0 ], [ -5, 6, -2, 1, 1, 0 ], [ -5, 7, -2, 1, 1, 0 ], [ -4, 7, -2, 1, 1, 0 ] ], 1 ], - [ [ [ -6, 7, -2, 1, 1, 0 ], [ "Rest" ], [ -5, 7, -2, 1, 1, 0 ], [ -4, 7, -2, 1, 1, 0 ] ], 1 ], - [ [ [ -6, 7, -2, 1, 1, 0 ], [ "Rest" ], [ -5, 7, -2, 1, 1, 0 ], [ "Rest" ] ], 1 ], - [ [ [ -6, 7, -2, 1, 1, 0 ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 1 ], - [ [ [ "Rest" ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 1 ] - ] - ] -], -"last_changes": -[ - [ [ -5, 5, -2, 1, 1, 0 ], [ -5, 6, -2, 1, 1, 0 ], [ -4, 7, -2, 1, 1, 0 ], [ -4, 6, -2, 1, 1, 0 ] ], - [ [ -6, 6, -2, 1, 1, 0 ], [ -5, 6, -2, 1, 1, 0 ], [ -4, 7, -2, 1, 1, 0 ], [ -4, 6, -2, 1, 1, 0 ] ], - [ [ -6, 7, -2, 1, 1, 0 ], [ -5, 6, -2, 1, 1, 0 ], [ -4, 7, -2, 1, 1, 0 ], [ -4, 6, -2, 1, 1, 0 ] ], - [ [ -6, 7, -2, 1, 1, 0 ], [ -5, 6, -2, 1, 1, 0 ], [ -5, 7, -2, 1, 1, 0 ], [ -4, 6, -2, 1, 1, 0 ] ], - [ [ -6, 7, -2, 1, 1, 0 ], [ -5, 6, -2, 1, 1, 0 ], [ -5, 7, -2, 1, 1, 0 ], [ -4, 7, -2, 1, 1, 0 ] ] -], -"cur_uid": "7e230015", -"ref_uid": "nil", -"order_seed": 389930, -"dur_seed": 736878, -"motifs_seed": 479673, -"entrances_probs_vals": [ 0, 0, 0, 1, 1, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"passages_probs_vals": [ 0, 0, 0, 1, 1, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"exits_probs_vals": [ 0, 0, 0, 1, 1, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"ranges": [ [ -2400, 1200 ], [ -1200, 1200 ], [ -702, 1200 ], [ -702, 1200 ] ], -"step_probs_vals": [ -1200, 1200, 0.0020576131687243, 0.068181818181818, 0.074074074074074, 0.0625, 0.20576131687243, 0.0625, 0.45679012345679, 0.011363636363636, 0.53086419753086, 0, 0.54320987654321, 0.92045454545455, 0.58641975308642, 0.92613636363636, 0.61111111111111, 0, 0.78600823045268, 0.068181818181818, 0.98971193415638, 0.0625 ], -"passages_weights": [ 1, 1, 0.48, 1, 1 ], -"hd_exp": 10, -"hd_invert": 0, -"order": -[ - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 1, 3 ], [ 2, 0 ], [ ] ], - [ [ 0, 3 ], [ 2, 1 ], [ ] ], - [ [ 2, 3, 0 ], [ 1 ], [ ] ], - [ [ 1 ], [ 3, 0, 2 ], [ ] ], - [ [ 3, 1 ], [ 2, 0 ], [ ] ], - [ [ 2 ], [ 1, 3, 0 ], [ ] ], - [ [ 2, 1 ], [ 3, 0 ], [ ] ], - [ [ 0, 3 ], [ 1, 2 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 2 ], [ 0, 3, 1 ], [ ] ], - [ [ 3, 2 ], [ 0, 1 ], [ ] ], - [ [ 2, 1, 0 ], [ 3 ], [ ] ], - [ [ 0, 1, 2 ], [ 3 ], [ ] ], - [ [ 3 ], [ 2, 1, 0 ], [ ] ], - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 2 ], [ 3, 0, 1 ], [ ] ], - [ [ 1 ], [ 3, 0, 2 ], [ ] ], - [ [ 2, 0 ], [ 3, 1 ], [ ] ], - [ [ 1, 3, 0 ], [ 2 ], [ ] ], - [ [ 1 ], [ 3, 0, 2 ], [ ] ], - [ [ 2, 1, 0 ], [ 3 ], [ ] ], - [ [ 0, 1, 2 ], [ 3 ], [ ] ], - [ [ 2 ], [ 0, 3, 1 ], [ ] ], - [ [ 0 ], [ 3, 1, 2 ], [ ] ], - [ [ 2, 1 ], [ 3, 0 ], [ ] ], - [ [ 1, 3 ], [ 0, 2 ], [ ] ], - [ [ 2, 1, 3 ], [ 0 ], [ ] ], - [ [ 0 ], [ 2, 3, 1 ], [ ] ], - [ [ 0, 3 ], [ 2, 1 ], [ ] ], - [ [ 0, 1, 2 ], [ 3 ], [ ] ], - [ [ 0 ], [ 3, 2, 1 ], [ ] ], - [ [ 2, 3 ], [ 1, 0 ], [ ] ], - [ [ 3, 1 ], [ 0, 2 ], [ ] ], - [ [ 3, 2 ], [ 0, 1 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 1, 0 ], [ 2, 3 ], [ ] ], - [ [ 2, 3 ], [ 0, 1 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 3 ], [ 2, 1, 0 ], [ ] ], - [ [ 2, 0 ], [ 3, 1 ], [ ] ], - [ [ 2, 1, 0 ], [ 3 ], [ ] ], - [ [ 3 ], [ 2, 1, 0 ], [ ] ], - [ [ 0, 2 ], [ 1, 3 ], [ ] ], - [ [ 0, 2 ], [ 3, 1 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 0 ], [ 2, 1, 3 ], [ ] ], - [ [ 3, 2 ], [ 0, 1 ], [ ] ], - [ [ 3 ], [ 0, 1, 2 ], [ ] ], - [ [ 3, 0 ], [ 1, 2 ], [ ] ], - [ [ 2 ], [ 3, 0, 1 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 0 ], [ 1, 3, 2 ], [ ] ], - [ [ 2, 0, 3 ], [ 1 ], [ ] ], - [ [ 3 ], [ 0, 1, 2 ], [ ] ], - [ [ 3, 2, 0 ], [ 1 ], [ ] ], - [ [ 2 ], [ 0, 3, 1 ], [ ] ], - [ [ 1, 2 ], [ 3, 0 ], [ ] ], - [ [ 1 ], [ 3, 0, 2 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 0, 2, 1 ], [ 3 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 2 ], [ 0, 1, 3 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 0, 3 ], [ 1, 2 ], [ ] ], - [ [ 2, 0 ], [ 1, 3 ], [ ] ], - [ [ 2, 1, 0 ], [ 3 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 1, 3 ], [ 0, 2 ], [ ] ], - [ [ 3, 2, 1 ], [ 0 ], [ ] ], - [ [ 1, 2 ], [ 3, 0 ], [ ] ], - [ [ 2, 3 ], [ 0, 1 ], [ ] ], - [ [ 1, 2 ], [ 0, 3 ], [ ] ], - [ [ 0 ], [ 3, 1, 2 ], [ ] ], - [ [ 1, 2 ], [ 3, 0 ], [ ] ], - [ [ 2, 1 ], [ 3, 0 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 2, 1 ], [ 0, 3 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 3, 1 ], [ 0, 2 ], [ ] ], - [ [ 3, 2 ], [ 1, 0 ], [ ] ], - [ [ 0, 1 ], [ 3, 2 ], [ ] ], - [ [ 2, 3 ], [ 0, 1 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 1 ], [ 0, 3, 2 ], [ ] ], - [ [ 0, 1 ], [ 3, 2 ], [ ] ], - [ [ 0 ], [ 2, 3, 1 ], [ ] ], - [ [ 0 ], [ 1, 3, 2 ], [ ] ], - [ [ 2, 3 ], [ 0, 1 ], [ ] ], - [ [ 3 ], [ 2, 1, 0 ], [ ] ], - [ [ 3, 1 ], [ 0, 2 ], [ ] ], - [ [ 0, 2, 1 ], [ 3 ], [ ] ] -], -"sus_weights": [ 0.35, 0.37, 0.38 ], -"order_size": [ 100, 100 ], -"passages_size": [ 0, 0 ], -"motif_edited": "false", -"order_edited": "false" -} \ No newline at end of file diff --git a/resources/string_quartet_3/tmp/tmp_mus_model.json b/resources/string_quartet_3/tmp/tmp_mus_model.json deleted file mode 100644 index 487fc67..0000000 --- a/resources/string_quartet_3/tmp/tmp_mus_model.json +++ /dev/null @@ -1,532 +0,0 @@ -{ -"music_data": -[ - [ - [ - [ [ [ "Rest" ], [ "Rest" ], [ 0, 0, 0, 0, 0, 0 ], [ "Rest" ] ], 1 ], - [ [ [ "Rest" ], [ "Rest" ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1 ], - [ [ [ "Rest" ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 2.375 ], - [ [ [ -1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1.625 ] - ], - [ - [ [ [ -1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, -1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1 ], - [ [ [ 0, 0, 0, -1, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, -1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 3.5 ] - ], - [ - [ [ [ 0, 0, 0, -1, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1 ], - [ [ [ 0, 0, 0, -1, 0, 0 ], [ 1, 0, 0, -1, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 2.5 ] - ], - [ - [ [ [ 0, 0, 0, -1, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ], 1.375 ] - ], - [ - [ [ [ 0, 0, 0, -1, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ 0, 0, 1, -1, 0, 0 ] ], 1 ], - [ [ [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ -1, 0, 0, 0, 0, 0 ], [ 0, 0, 1, -1, 0, 0 ] ], 1 ], - [ [ [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ 0, -1, 1, 0, 0, 0 ], [ 0, 0, 1, -1, 0, 0 ] ], 1.875 ] - ], - [ - [ [ [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ 1, 0, 1, -1, 0, 0 ], [ 0, 0, 1, -1, 0, 0 ] ], 1 ], - [ [ [ 1, -1, 1, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ 1, 0, 1, -1, 0, 0 ], [ 0, 0, 1, -1, 0, 0 ] ], 3.375 ] - ], - [ - [ [ [ 1, -1, 1, 0, 0, 0 ], [ 2, -1, 1, -1, 0, 0 ], [ 1, 0, 1, -1, 0, 0 ], [ 0, 0, 1, -1, 0, 0 ] ], 1 ], - [ [ [ 1, -1, 1, 0, 0, 0 ], [ 2, -1, 1, -1, 0, 0 ], [ 1, 0, 1, -1, 0, 0 ], [ 1, -1, 1, -1, 0, 0 ] ], 1 ], - [ [ [ 2, 0, 1, -1, 0, 0 ], [ 2, -1, 1, -1, 0, 0 ], [ 1, 0, 1, -1, 0, 0 ], [ 1, -1, 1, -1, 0, 0 ] ], 1.5 ] - ], - [ - [ [ [ 2, 0, 1, -1, 0, 0 ], [ 2, -1, 1, -1, 0, 0 ], [ 1, 0, 1, -1, 0, 0 ], [ 2, -1, 1, -2, 0, 0 ] ], 1 ], - [ [ [ 3, 0, 1, -2, 0, 0 ], [ 2, -1, 1, -1, 0, 0 ], [ 1, 0, 1, -1, 0, 0 ], [ 2, -1, 1, -2, 0, 0 ] ], 1.75 ] - ], - [ - [ [ [ 3, 0, 1, -2, 0, 0 ], [ 1, 1, 1, -2, 0, 0 ], [ 1, 0, 1, -1, 0, 0 ], [ 2, -1, 1, -2, 0, 0 ] ], 1 ], - [ [ [ 3, 0, 1, -2, 0, 0 ], [ 1, 1, 1, -2, 0, 0 ], [ 1, 0, 1, -2, 0, 0 ], [ 2, -1, 1, -2, 0, 0 ] ], 3.625 ] - ], - [ - [ [ [ 3, 0, 1, -2, 0, 0 ], [ 1, 1, 1, -2, 0, 0 ], [ 1, 0, 1, -2, 0, 0 ], [ 0, 1, 1, -2, 0, 0 ] ], 1.5 ] - ], - [ - [ [ [ 3, 0, 1, -2, 0, 0 ], [ 1, 1, 1, -2, 0, 0 ], [ 0, 2, 1, -2, 0, 0 ], [ 0, 1, 1, -2, 0, 0 ] ], 3 ] - ], - [ - [ [ [ 2, 1, 1, -2, 0, 0 ], [ 1, 1, 1, -2, 0, 0 ], [ 0, 2, 1, -2, 0, 0 ], [ 0, 1, 1, -2, 0, 0 ] ], 1 ], - [ [ [ 2, 1, 1, -2, 0, 0 ], [ 1, 1, 1, -2, 0, 0 ], [ 0, 2, 1, -2, 0, 0 ], [ -1, 3, 1, -2, 0, 0 ] ], 1 ], - [ [ [ 2, 1, 1, -2, 0, 0 ], [ 1, 2, 1, -2, 0, 0 ], [ 0, 2, 1, -2, 0, 0 ], [ -1, 3, 1, -2, 0, 0 ] ], 1.75 ] - ], - [ - [ [ [ 1, 3, 1, -2, 0, 0 ], [ 1, 2, 1, -2, 0, 0 ], [ 0, 2, 1, -2, 0, 0 ], [ -1, 3, 1, -2, 0, 0 ] ], 1 ], - [ [ [ 1, 3, 1, -2, 0, 0 ], [ 0, 3, 1, -2, 0, 0 ], [ 0, 2, 1, -2, 0, 0 ], [ -1, 3, 1, -2, 0, 0 ] ], 2.5 ] - ], - [ - [ [ [ 1, 3, 1, -2, 0, 0 ], [ 0, 3, 1, -2, 0, 0 ], [ 0, 2, 1, -2, 0, 0 ], [ 0, 2, 0, -2, 0, 0 ] ], 1.75 ] - ], - [ - [ [ [ 1, 3, 1, -2, 0, 0 ], [ 0, 3, 1, -2, 0, 0 ], [ 0, 2, 1, -2, 0, 0 ], [ 0, 1, 1, -2, 0, 0 ] ], 1.125 ] - ], - [ - [ [ [ 1, 3, 1, -2, 0, 0 ], [ 0, 3, 1, -2, 0, 0 ], [ -1, 1, 1, -1, 0, 0 ], [ 0, 1, 1, -2, 0, 0 ] ], 1 ], - [ [ [ 1, 3, 1, -2, 0, 0 ], [ 0, 2, 1, -2, 0, 0 ], [ -1, 1, 1, -1, 0, 0 ], [ 0, 1, 1, -2, 0, 0 ] ], 1 ], - [ [ [ 1, 2, 1, -2, 0, 0 ], [ 0, 2, 1, -2, 0, 0 ], [ -1, 1, 1, -1, 0, 0 ], [ 0, 1, 1, -2, 0, 0 ] ], 1.125 ] - ], - [ - [ [ [ 1, 1, 1, -2, 0, 1 ], [ 0, 2, 1, -2, 0, 0 ], [ -1, 1, 1, -1, 0, 0 ], [ 0, 1, 1, -2, 0, 0 ] ], 3.25 ] - ], - [ - [ [ [ 1, 1, 1, -2, 0, 1 ], [ 0, 1, 1, -2, 0, 1 ], [ -1, 1, 1, -1, 0, 0 ], [ 0, 1, 1, -2, 0, 0 ] ], 1.875 ] - ], - [ - [ [ [ 1, 1, 1, -2, 0, 1 ], [ 0, 1, 1, -2, 0, 1 ], [ -1, 1, 1, -1, 0, 0 ], [ -1, 1, 1, -1, 0, 1 ] ], 1 ], - [ [ [ 1, 1, 1, -1, 0, 0 ], [ 0, 1, 1, -2, 0, 1 ], [ -1, 1, 1, -1, 0, 0 ], [ -1, 1, 1, -1, 0, 1 ] ], 1 ], - [ [ [ 1, 1, 1, -1, 0, 0 ], [ 0, 1, 1, -1, 0, 0 ], [ -1, 1, 1, -1, 0, 0 ], [ -1, 1, 1, -1, 0, 1 ] ], 2.25 ] - ], - [ - [ [ [ 1, 1, 1, -1, 0, 0 ], [ 0, 1, 1, -1, 0, 0 ], [ -1, 1, 1, -1, 0, 0 ], [ 1, 0, 1, -1, 0, 0 ] ], 1 ], - [ [ [ 0, 2, 1, -1, 0, 0 ], [ 0, 1, 1, -1, 0, 0 ], [ -1, 1, 1, -1, 0, 0 ], [ 1, 0, 1, -1, 0, 0 ] ], 1 ], - [ [ [ 0, 2, 1, -1, 0, 0 ], [ 0, 1, 1, -1, 0, 0 ], [ -1, 2, 1, -1, 0, 0 ], [ 1, 0, 1, -1, 0, 0 ] ], 2.625 ] - ], - [ - [ [ [ 0, 2, 1, -1, 0, 0 ], [ 0, 1, 1, -1, 0, 0 ], [ -1, 2, 1, -1, 0, 0 ], [ -1, 3, 1, -1, 0, 0 ] ], 1 ], - [ [ [ 0, 2, 1, -1, 0, 0 ], [ -2, 3, 1, -1, 0, 0 ], [ -1, 2, 1, -1, 0, 0 ], [ -1, 3, 1, -1, 0, 0 ] ], 2.75 ] - ], - [ - [ [ [ 0, 2, 1, -1, 0, 0 ], [ -2, 3, 1, -1, 0, 0 ], [ -2, 4, 1, -1, 0, 0 ], [ -1, 3, 1, -1, 0, 0 ] ], 3.5 ] - ], - [ - [ [ [ 0, 2, 1, -1, 0, 0 ], [ -2, 3, 1, -1, 0, 0 ], [ -2, 4, 1, -1, 0, 0 ], [ -1, 3, 0, -1, 0, 0 ] ], 1 ], - [ [ [ -1, 3, 1, -1, 0, 0 ], [ -2, 3, 1, -1, 0, 0 ], [ -2, 4, 1, -1, 0, 0 ], [ -1, 3, 0, -1, 0, 0 ] ], 1 ], - [ [ [ -1, 3, 1, -1, 0, 0 ], [ -2, 3, 1, -1, 0, 0 ], [ -3, 3, 1, 0, 0, 0 ], [ -1, 3, 0, -1, 0, 0 ] ], 1.875 ] - ], - [ - [ [ [ -1, 3, 1, -1, 0, 0 ], [ -2, 3, 1, -1, 0, 0 ], [ -3, 3, 1, 0, 0, 0 ], [ -2, 3, 1, 0, 0, 0 ] ], 2.75 ] - ], - [ - [ [ [ -1, 3, 1, -1, 0, 0 ], [ -2, 3, 1, -1, 0, 0 ], [ -3, 3, 1, 0, 0, 0 ], [ -2, 3, 2, -1, 0, 0 ] ], 2.375 ] - ], - [ - [ [ [ -2, 3, 2, 0, 0, 0 ], [ -2, 3, 1, -1, 0, 0 ], [ -3, 3, 1, 0, 0, 0 ], [ -2, 3, 2, -1, 0, 0 ] ], 1 ], - [ [ [ -2, 3, 2, 0, 0, 0 ], [ -2, 3, 1, -1, 0, 0 ], [ -3, 3, 1, 0, 0, 0 ], [ -2, 3, 0, 0, 0, 0 ] ], 1 ], - [ [ [ -2, 3, 2, 0, 0, 0 ], [ -3, 3, 2, 0, 0, 0 ], [ -3, 3, 1, 0, 0, 0 ], [ -2, 3, 0, 0, 0, 0 ] ], 3.25 ] - ], - [ - [ [ [ -2, 3, 2, 0, 0, 0 ], [ -3, 3, 2, 0, 0, 0 ], [ -3, 3, 1, 0, 0, 0 ], [ -2, 3, 2, 0, -1, 0 ] ], 1 ], - [ [ [ -2, 3, 2, 0, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ], [ -3, 3, 1, 0, 0, 0 ], [ -2, 3, 2, 0, -1, 0 ] ], 1 ], - [ [ [ -2, 3, 2, 0, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ], [ -4, 3, 2, 1, 0, 0 ], [ -2, 3, 2, 0, -1, 0 ] ], 1.125 ] - ], - [ - [ [ [ -2, 3, 2, 0, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ], [ -4, 3, 2, 1, 0, 0 ], [ -3, 2, 2, 1, 0, 0 ] ], 1 ], - [ [ [ -3, 4, 1, 0, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ], [ -4, 3, 2, 1, 0, 0 ], [ -3, 2, 2, 1, 0, 0 ] ], 1.25 ] - ], - [ - [ [ [ -3, 3, 2, 1, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ], [ -4, 3, 2, 1, 0, 0 ], [ -3, 2, 2, 1, 0, 0 ] ], 1 ], - [ [ [ -3, 3, 2, 1, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ], [ -3, 3, 2, 0, 0, 0 ], [ -3, 2, 2, 1, 0, 0 ] ], 2.375 ] - ], - [ - [ [ [ -3, 4, 3, 0, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ], [ -3, 3, 2, 0, 0, 0 ], [ -3, 2, 2, 1, 0, 0 ] ], 3 ] - ], - [ - [ [ [ -3, 4, 3, 0, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ], [ -3, 4, 3, -1, 0, 0 ], [ -3, 2, 2, 1, 0, 0 ] ], 1 ], - [ [ [ -3, 4, 3, 0, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ], [ -3, 4, 3, -1, 0, 0 ], [ -3, 3, 3, 0, 0, 0 ] ], 1 ], - [ [ [ -3, 4, 3, 0, 0, 0 ], [ -2, 3, 3, 0, 0, 0 ], [ -3, 4, 3, -1, 0, 0 ], [ -3, 3, 3, 0, 0, 0 ] ], 2.75 ] - ], - [ - [ [ [ -3, 4, 3, 0, 0, 0 ], [ -2, 3, 3, 0, 0, 0 ], [ -4, 4, 3, 0, 0, 0 ], [ -3, 3, 3, 0, 0, 0 ] ], 1 ], - [ [ [ -3, 4, 3, 0, 0, 0 ], [ -3, 5, 3, 0, 0, 0 ], [ -4, 4, 3, 0, 0, 0 ], [ -3, 3, 3, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -3, 4, 3, 0, 0, 0 ], [ -3, 5, 3, 0, 0, 0 ], [ -4, 4, 3, 0, 0, 0 ], [ -4, 5, 3, 0, 0, 0 ] ], 3.5 ] - ], - [ - [ [ [ -3, 4, 3, 0, 0, 0 ], [ -3, 5, 3, 0, 0, 0 ], [ -4, 4, 3, 0, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ] ], 1 ], - [ [ [ -3, 4, 3, 0, 0, 0 ], [ -3, 5, 3, 0, 0, 0 ], [ -3, 3, 3, 0, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ] ], 1 ], - [ [ [ -3, 4, 3, 0, 0, 0 ], [ -2, 4, 2, 0, 0, 0 ], [ -3, 3, 3, 0, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ] ], 1.875 ] - ], - [ - [ [ [ -3, 4, 3, 0, 0, 0 ], [ -2, 3, 3, 0, 0, 0 ], [ -3, 3, 3, 0, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ] ], 1 ], - [ [ [ -2, 3, 2, 0, 0, 0 ], [ -2, 3, 3, 0, 0, 0 ], [ -3, 3, 3, 0, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ] ], 2.5 ] - ], - [ - [ [ [ -2, 4, 3, 0, 0, 0 ], [ -2, 3, 3, 0, 0, 0 ], [ -3, 3, 3, 0, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ] ], 1 ], - [ [ [ -2, 4, 3, 0, 0, 0 ], [ -2, 3, 3, 0, 0, 0 ], [ -3, 4, 3, 0, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ] ], 3.25 ] - ], - [ - [ [ [ -1, 3, 2, 0, 0, 0 ], [ -2, 3, 3, 0, 0, 0 ], [ -3, 4, 3, 0, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ] ], 1 ], - [ [ [ -1, 3, 2, 0, 0, 0 ], [ -3, 5, 3, 0, 0, 0 ], [ -3, 4, 3, 0, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ] ], 2.625 ] - ], - [ - [ [ [ -1, 3, 2, 0, 0, 0 ], [ -2, 4, 2, 0, 0, 0 ], [ -3, 4, 3, 0, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ] ], 1.125 ] - ], - [ - [ [ [ -1, 3, 2, 0, 0, 0 ], [ -2, 4, 2, 0, 0, 0 ], [ -3, 4, 3, 0, 0, 0 ], [ -3, 3, 2, 0, 0, 0 ] ], 1.625 ] - ], - [ - [ [ [ -1, 3, 2, 0, 0, 0 ], [ -2, 4, 2, 0, 0, 0 ], [ -2, 3, 2, 0, 0, 0 ], [ -3, 3, 2, 0, 0, 0 ] ], 2.75 ] - ], - [ - [ [ [ -1, 3, 2, 0, 0, 0 ], [ -2, 4, 2, 0, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ], [ -3, 3, 2, 0, 0, 0 ] ], 1 ], - [ [ [ -1, 3, 2, 0, 0, 0 ], [ -2, 4, 2, 0, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ], [ -4, 5, 2, 0, 0, 0 ] ], 2 ] - ], - [ - [ [ [ -2, 5, 2, 0, 0, 0 ], [ -2, 4, 2, 0, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ], [ -4, 5, 2, 0, 0, 0 ] ], 1 ], - [ [ [ -2, 5, 2, 0, 0, 0 ], [ -3, 5, 2, 0, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ], [ -4, 5, 2, 0, 0, 0 ] ], 3.25 ] - ], - [ - [ [ [ -2, 5, 2, 0, 0, 0 ], [ -3, 5, 2, 0, 0, 0 ], [ -4, 6, 2, 0, 0, 0 ], [ -4, 5, 2, 0, 0, 0 ] ], 1 ] - ], - [ - [ [ [ -2, 5, 2, 0, 0, 0 ], [ -3, 5, 2, 0, 0, 0 ], [ -3, 5, 1, 0, 0, 0 ], [ -4, 5, 2, 0, 0, 0 ] ], 1 ], - [ [ [ -2, 5, 2, 0, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ], [ -3, 5, 1, 0, 0, 0 ], [ -4, 5, 2, 0, 0, 0 ] ], 1 ], - [ [ [ -1, 5, 2, -1, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ], [ -3, 5, 1, 0, 0, 0 ], [ -4, 5, 2, 0, 0, 0 ] ], 1.375 ] - ], - [ - [ [ [ -1, 5, 2, -1, 0, 0 ], [ -3, 4, 2, 0, 0, 0 ], [ -3, 5, 1, 0, 0, 0 ], [ -3, 5, 2, -1, 0, 0 ] ], 1 ], - [ [ [ -1, 5, 2, -1, 0, 0 ], [ -3, 5, 1, -1, 0, 0 ], [ -3, 5, 1, 0, 0, 0 ], [ -3, 5, 2, -1, 0, 0 ] ], 1.875 ] - ], - [ - [ [ [ -1, 5, 2, -1, 0, 0 ], [ -3, 5, 1, -1, 0, 0 ], [ -3, 5, 1, 0, 0, 0 ], [ -2, 4, 1, -1, 0, 0 ] ], 2.875 ] - ], - [ - [ [ [ -1, 5, 2, -1, 0, 0 ], [ -3, 5, 1, -1, 0, 0 ], [ -2, 5, 1, -1, 0, 0 ], [ -2, 4, 1, -1, 0, 0 ] ], 1 ], - [ [ [ -1, 5, 2, -1, 0, 0 ], [ -2, 4, 2, -1, 0, 0 ], [ -2, 5, 1, -1, 0, 0 ], [ -2, 4, 1, -1, 0, 0 ] ], 1 ], - [ [ [ 0, 3, 1, -1, 0, 0 ], [ -2, 4, 2, -1, 0, 0 ], [ -2, 5, 1, -1, 0, 0 ], [ -2, 4, 1, -1, 0, 0 ] ], 3.25 ] - ], - [ - [ [ [ 0, 3, 1, -1, 0, 0 ], [ -1, 3, 1, -1, 0, 0 ], [ -2, 5, 1, -1, 0, 0 ], [ -2, 4, 1, -1, 0, 0 ] ], 1 ], - [ [ [ 0, 3, 1, -1, 0, 0 ], [ -1, 3, 1, -1, 0, 0 ], [ -2, 5, 1, -1, 0, 0 ], [ -2, 3, 1, -1, 0, 0 ] ], 1.625 ] - ], - [ - [ [ [ 0, 3, 1, -1, 0, 0 ], [ -1, 3, 1, -1, 0, 0 ], [ -2, 5, 1, -1, 0, 0 ], [ -3, 5, 1, -1, 0, 0 ] ], 1 ], - [ [ [ 0, 3, 1, -1, 0, 0 ], [ -2, 4, 1, -1, 0, 0 ], [ -2, 5, 1, -1, 0, 0 ], [ -3, 5, 1, -1, 0, 0 ] ], 2.375 ] - ], - [ - [ [ [ 0, 3, 1, -1, 0, 0 ], [ -3, 6, 1, -1, 0, 0 ], [ -2, 5, 1, -1, 0, 0 ], [ -3, 5, 1, -1, 0, 0 ] ], 2.375 ] - ], - [ - [ [ [ 0, 3, 1, -1, 0, 0 ], [ -3, 6, 1, -1, 0, 0 ], [ -2, 4, 1, -1, 0, 0 ], [ -3, 5, 1, -1, 0, 0 ] ], 3.125 ] - ], - [ - [ [ [ 0, 3, 1, -1, 0, 0 ], [ -3, 6, 1, -1, 0, 0 ], [ -1, 3, 0, -1, 0, 0 ], [ -3, 5, 1, -1, 0, 0 ] ], 1 ], - [ [ [ 0, 3, 1, -1, 0, 0 ], [ -1, 4, 1, -1, 0, 0 ], [ -1, 3, 0, -1, 0, 0 ], [ -3, 5, 1, -1, 0, 0 ] ], 1 ], - [ [ [ 0, 3, 1, -1, 0, 0 ], [ -1, 4, 1, -1, 0, 0 ], [ -1, 3, 0, -1, 0, 0 ], [ -1, 3, 1, -1, 0, 0 ] ], 3.25 ] - ], - [ - [ [ [ 1, 2, 1, -1, 0, 0 ], [ -1, 4, 1, -1, 0, 0 ], [ -1, 3, 0, -1, 0, 0 ], [ -1, 3, 1, -1, 0, 0 ] ], 1 ], - [ [ [ 1, 2, 1, -1, 0, 0 ], [ 0, 3, 0, -1, 0, 0 ], [ -1, 3, 0, -1, 0, 0 ], [ -1, 3, 1, -1, 0, 0 ] ], 1.75 ] - ], - [ - [ [ [ 0, 4, 1, -1, 0, 0 ], [ 0, 3, 0, -1, 0, 0 ], [ -1, 3, 0, -1, 0, 0 ], [ -1, 3, 1, -1, 0, 0 ] ], 1 ], - [ [ [ 0, 4, 1, -1, 0, 0 ], [ 0, 2, 1, -1, 0, 0 ], [ -1, 3, 0, -1, 0, 0 ], [ -1, 3, 1, -1, 0, 0 ] ], 1 ], - [ [ [ 0, 4, 1, -1, 0, 0 ], [ 0, 2, 1, -1, 0, 0 ], [ -1, 2, 1, -1, 0, 0 ], [ -1, 3, 1, -1, 0, 0 ] ], 1.75 ] - ], - [ - [ [ [ 0, 4, 1, -1, 0, 0 ], [ -2, 4, 1, -1, 0, 0 ], [ -1, 2, 1, -1, 0, 0 ], [ -1, 3, 1, -1, 0, 0 ] ], 1 ], - [ [ [ 0, 4, 1, -1, 0, 0 ], [ -2, 4, 1, -1, 0, 0 ], [ -2, 3, 1, -1, 0, 0 ], [ -1, 3, 1, -1, 0, 0 ] ], 2.375 ] - ], - [ - [ [ [ 0, 4, 1, -1, 0, 0 ], [ -2, 4, 1, -1, 0, 0 ], [ -2, 3, 1, -1, 0, 0 ], [ 0, 3, 1, -2, 0, 0 ] ], 1 ], - [ [ [ 0, 3, 1, -1, 0, 0 ], [ -2, 4, 1, -1, 0, 0 ], [ -2, 3, 1, -1, 0, 0 ], [ 0, 3, 1, -2, 0, 0 ] ], 1 ], - [ [ [ 0, 3, 1, -1, 0, 0 ], [ -1, 3, 1, -1, 0, 0 ], [ -2, 3, 1, -1, 0, 0 ], [ 0, 3, 1, -2, 0, 0 ] ], 3.25 ] - ], - [ - [ [ [ 0, 3, 1, -1, 0, 0 ], [ -1, 3, 1, -2, 0, 0 ], [ -2, 3, 1, -1, 0, 0 ], [ 0, 3, 1, -2, 0, 0 ] ], 1.375 ] - ], - [ - [ [ [ 0, 3, 1, -1, 0, 0 ], [ -1, 3, 1, -1, 0, -1 ], [ -2, 3, 1, -1, 0, 0 ], [ 0, 3, 1, -2, 0, 0 ] ], 1 ], - [ [ [ 0, 3, 1, -1, 0, 0 ], [ -1, 3, 1, -1, 0, -1 ], [ -2, 3, 1, -1, 0, 0 ], [ 0, 3, 1, -1, 0, -1 ] ], 1 ], - [ [ [ 0, 3, 1, -1, 0, 0 ], [ -1, 3, 1, -1, 0, -1 ], [ -2, 4, 1, -1, 0, 0 ], [ 0, 3, 1, -1, 0, -1 ] ], 1.25 ] - ], - [ - [ [ [ 0, 3, 1, -1, 0, 0 ], [ -1, 2, 1, -1, 0, 0 ], [ -2, 4, 1, -1, 0, 0 ], [ 0, 3, 1, -1, 0, -1 ] ], 2.75 ] - ], - [ - [ [ [ -1, 3, 1, 0, 0, -1 ], [ -1, 2, 1, -1, 0, 0 ], [ -2, 4, 1, -1, 0, 0 ], [ 0, 3, 1, -1, 0, -1 ] ], 1 ], - [ [ [ -1, 3, 1, 0, 0, -1 ], [ -1, 3, 1, -1, 0, 0 ], [ -2, 4, 1, -1, 0, 0 ], [ 0, 3, 1, -1, 0, -1 ] ], 1 ], - [ [ [ -1, 3, 1, 0, 0, -1 ], [ -1, 3, 1, -1, 0, 0 ], [ -1, 3, 1, -1, 0, -1 ], [ 0, 3, 1, -1, 0, -1 ] ], 1.5 ] - ], - [ - [ [ [ -1, 3, 1, 0, 0, -1 ], [ -2, 3, 1, 0, 0, -1 ], [ -1, 3, 1, -1, 0, -1 ], [ 0, 3, 1, -1, 0, -1 ] ], 1.625 ] - ], - [ - [ [ [ 0, 4, 1, -1, 0, -1 ], [ -2, 3, 1, 0, 0, -1 ], [ -1, 3, 1, -1, 0, -1 ], [ 0, 3, 1, -1, 0, -1 ] ], 1 ], - [ [ [ 0, 4, 1, -1, 0, -1 ], [ -2, 3, 1, 0, 0, -1 ], [ -1, 3, 1, -1, 0, -1 ], [ -1, 4, 1, -1, 0, -1 ] ], 1 ], - [ [ [ 0, 4, 1, -1, 0, -1 ], [ -2, 4, 1, -1, 0, -1 ], [ -1, 3, 1, -1, 0, -1 ], [ -1, 4, 1, -1, 0, -1 ] ], 3 ] - ], - [ - [ [ [ 0, 4, 1, -1, 0, -1 ], [ -2, 4, 1, -1, 0, -1 ], [ -1, 3, 1, -1, 0, -1 ], [ -2, 4, 1, 0, 0, -1 ] ], 1 ], - [ [ [ 1, 3, 0, -1, 0, -1 ], [ -2, 4, 1, -1, 0, -1 ], [ -1, 3, 1, -1, 0, -1 ], [ -2, 4, 1, 0, 0, -1 ] ], 2.625 ] - ], - [ - [ [ [ 1, 3, 0, -1, 0, -1 ], [ -2, 4, 1, -1, 0, -1 ], [ -1, 3, 1, -1, 0, -1 ], [ -1, 4, 2, -1, 0, -1 ] ], 1 ], - [ [ [ 0, 3, 1, -1, 0, -1 ], [ -2, 4, 1, -1, 0, -1 ], [ -1, 3, 1, -1, 0, -1 ], [ -1, 4, 2, -1, 0, -1 ] ], 1 ], - [ [ [ 0, 3, 1, -1, 0, -1 ], [ -2, 4, 1, -1, 0, -1 ], [ -1, 4, 1, -1, 0, -1 ], [ -1, 4, 2, -1, 0, -1 ] ], 2.75 ] - ], - [ - [ [ [ 0, 3, 1, -1, 0, -1 ], [ -3, 4, 2, 0, 0, -1 ], [ -1, 4, 1, -1, 0, -1 ], [ -1, 4, 2, -1, 0, -1 ] ], 2.375 ] - ], - [ - [ [ [ 0, 3, 1, -1, 0, -1 ], [ -3, 4, 2, 0, 0, -1 ], [ -1, 4, 1, -1, 0, -1 ], [ -1, 4, 2, 0, 0, -2 ] ], 3.375 ] - ], - [ - [ [ [ 0, 3, 1, -1, 0, -1 ], [ -3, 4, 2, 0, 0, -1 ], [ -1, 4, 1, -1, 0, -1 ], [ -1, 3, 2, -1, 0, -1 ] ], 2.875 ] - ], - [ - [ [ [ -1, 5, 1, -1, 0, -1 ], [ -3, 4, 2, 0, 0, -1 ], [ -1, 4, 1, -1, 0, -1 ], [ -1, 3, 2, -1, 0, -1 ] ], 1 ], - [ [ [ -1, 5, 1, -1, 0, -1 ], [ -2, 4, 2, -1, 0, -1 ], [ -1, 4, 1, -1, 0, -1 ], [ -1, 3, 2, -1, 0, -1 ] ], 1 ], - [ [ [ -1, 5, 1, -1, 0, -1 ], [ -2, 4, 2, -1, 0, -1 ], [ -1, 4, 1, -1, 0, -1 ], [ -1, 3, 1, -1, 0, -1 ] ], 1.875 ] - ], - [ - [ [ [ -1, 5, 1, -1, 0, -1 ], [ -2, 4, 1, -1, 0, -1 ], [ -1, 4, 1, -1, 0, -1 ], [ -1, 3, 1, -1, 0, -1 ] ], 3.25 ] - ], - [ - [ [ [ -1, 5, 1, -1, 0, -1 ], [ -2, 5, 1, -1, -1, -1 ], [ -1, 4, 1, -1, 0, -1 ], [ -1, 3, 1, -1, 0, -1 ] ], 1 ], - [ [ [ -1, 5, 1, -1, 0, -1 ], [ -2, 5, 1, -1, -1, -1 ], [ -2, 5, 1, -1, 0, -1 ], [ -1, 3, 1, -1, 0, -1 ] ], 3.625 ] - ], - [ - [ [ [ -1, 5, 1, -1, 0, -1 ], [ -1, 4, 1, -1, 0, -1 ], [ -2, 5, 1, -1, 0, -1 ], [ -1, 3, 1, -1, 0, -1 ] ], 1 ], - [ [ [ -1, 5, 1, -1, 0, -1 ], [ -1, 4, 1, -1, 0, -1 ], [ -2, 5, 1, -1, 0, -1 ], [ -2, 4, 1, -1, 0, -1 ] ], 3.25 ] - ], - [ - [ [ [ -1, 5, 1, -1, 0, -1 ], [ -1, 4, 1, -1, 0, -1 ], [ -2, 5, 1, -1, 0, -1 ], [ -3, 6, 1, -1, 0, -1 ] ], 1.375 ] - ], - [ - [ [ [ -1, 5, 1, -1, 0, -1 ], [ -1, 4, 1, -1, 0, -1 ], [ -3, 7, 1, -1, 0, -1 ], [ -3, 6, 1, -1, 0, -1 ] ], 1.125 ] - ], - [ - [ [ [ -1, 5, 1, -1, 0, -1 ], [ -2, 6, 1, -1, 0, -1 ], [ -3, 7, 1, -1, 0, -1 ], [ -3, 6, 1, -1, 0, -1 ] ], 1.5 ] - ], - [ - [ [ [ -2, 7, 1, -1, 0, -1 ], [ -2, 6, 1, -1, 0, -1 ], [ -3, 7, 1, -1, 0, -1 ], [ -3, 6, 1, -1, 0, -1 ] ], 1 ], - [ [ [ -2, 7, 1, -1, 0, -1 ], [ -2, 6, 1, -1, 0, -1 ], [ -2, 6, 0, -1, 0, -1 ], [ -3, 6, 1, -1, 0, -1 ] ], 2.375 ] - ], - [ - [ [ [ -1, 6, 0, -1, 0, -1 ], [ -2, 6, 1, -1, 0, -1 ], [ -2, 6, 0, -1, 0, -1 ], [ -3, 6, 1, -1, 0, -1 ] ], 3.625 ] - ], - [ - [ [ [ -1, 6, 0, -1, 0, -1 ], [ -2, 6, 1, -1, 0, -1 ], [ -2, 6, 0, -1, 0, -1 ], [ -2, 5, 0, -1, 0, -1 ] ], 1 ], - [ [ [ -4, 6, 1, 0, 0, -1 ], [ -2, 6, 1, -1, 0, -1 ], [ -2, 6, 0, -1, 0, -1 ], [ -2, 5, 0, -1, 0, -1 ] ], 2.125 ] - ], - [ - [ [ [ -3, 6, 1, -1, 0, -1 ], [ -2, 6, 1, -1, 0, -1 ], [ -2, 6, 0, -1, 0, -1 ], [ -2, 5, 0, -1, 0, -1 ] ], 1 ], - [ [ [ -3, 6, 1, -1, 0, -1 ], [ -1, 5, 0, -1, 0, -1 ], [ -2, 6, 0, -1, 0, -1 ], [ -2, 5, 0, -1, 0, -1 ] ], 3.375 ] - ], - [ - [ [ [ -3, 6, 0, -1, 0, -1 ], [ -1, 5, 0, -1, 0, -1 ], [ -2, 6, 0, -1, 0, -1 ], [ -2, 5, 0, -1, 0, -1 ] ], 1 ], - [ [ [ -3, 6, 0, -1, 0, -1 ], [ -1, 5, 0, -1, 0, -1 ], [ -2, 6, 0, -1, 0, -1 ], [ -3, 7, 0, -1, 0, -1 ] ], 1.625 ] - ], - [ - [ [ [ -3, 6, 0, -1, 0, -1 ], [ -1, 5, 0, -1, 0, -1 ], [ -2, 6, 0, -1, 0, -1 ], [ -2, 6, -1, -1, 0, -1 ] ], 1 ], - [ [ [ -3, 6, 0, -1, 0, -1 ], [ -2, 7, 0, -1, 0, -1 ], [ -2, 6, 0, -1, 0, -1 ], [ -2, 6, -1, -1, 0, -1 ] ], 1 ], - [ [ [ -3, 6, 0, -1, 0, -1 ], [ -2, 7, 0, -1, 0, -1 ], [ -2, 6, 0, -1, 1, -1 ], [ -2, 6, -1, -1, 0, -1 ] ], 1.75 ] - ], - [ - [ [ [ -3, 6, 0, -1, 0, -1 ], [ -2, 7, 0, -1, 0, -1 ], [ -2, 6, 0, -1, 1, -1 ], [ -2, 6, 0, -1, 0, -1 ] ], 1 ], - [ [ [ -3, 7, 0, -1, 0, -1 ], [ -2, 7, 0, -1, 0, -1 ], [ -2, 6, 0, -1, 1, -1 ], [ -2, 6, 0, -1, 0, -1 ] ], 2.625 ] - ], - [ - [ [ [ -3, 7, 0, -1, 0, -1 ], [ -2, 7, 0, -1, 0, -1 ], [ -2, 6, 0, -1, 1, -1 ], [ -3, 6, 0, -1, 1, -1 ] ], 1 ], - [ [ [ -2, 6, 0, -1, 1, -2 ], [ -2, 7, 0, -1, 0, -1 ], [ -2, 6, 0, -1, 1, -1 ], [ -3, 6, 0, -1, 1, -1 ] ], 2.25 ] - ], - [ - [ [ [ -2, 6, 0, -1, 1, -2 ], [ -2, 7, 0, -1, 0, -1 ], [ -3, 7, 0, -1, 1, -1 ], [ -3, 6, 0, -1, 1, -1 ] ], 2.125 ] - ], - [ - [ [ [ -2, 6, 0, -1, 1, -2 ], [ -2, 7, -1, -1, 1, -1 ], [ -3, 7, 0, -1, 1, -1 ], [ -3, 6, 0, -1, 1, -1 ] ], 1.375 ] - ], - [ - [ [ [ -3, 6, -1, -1, 1, -1 ], [ -2, 7, -1, -1, 1, -1 ], [ -3, 7, 0, -1, 1, -1 ], [ -3, 6, 0, -1, 1, -1 ] ], 1 ], - [ [ [ -3, 6, -1, -1, 1, -1 ], [ -2, 7, -1, -1, 1, -1 ], [ -3, 7, 0, -1, 1, -1 ], [ -3, 7, -1, -1, 1, -1 ] ], 1.5 ] - ], - [ - [ [ [ -3, 6, -1, -1, 1, -1 ], [ -2, 7, -1, -1, 1, -1 ], [ -2, 6, -1, -1, 1, -1 ], [ -3, 7, -1, -1, 1, -1 ] ], 3.125 ] - ], - [ - [ [ [ -1, 7, -1, -1, 1, -1 ], [ -2, 7, -1, -1, 1, -1 ], [ -2, 6, -1, -1, 1, -1 ], [ -3, 7, -1, -1, 1, -1 ] ], 1 ], - [ [ [ -1, 7, -1, -1, 1, -1 ], [ -2, 7, -1, -1, 1, -1 ], [ -3, 8, -1, -1, 1, -1 ], [ -3, 7, -1, -1, 1, -1 ] ], 2.625 ] - ], - [ - [ [ [ -1, 7, -1, -1, 1, -1 ], [ -2, 7, -1, -2, 1, -1 ], [ -3, 8, -1, -1, 1, -1 ], [ -3, 7, -1, -1, 1, -1 ] ], 1 ], - [ [ [ -2, 9, -1, -1, 1, -1 ], [ -2, 7, -1, -2, 1, -1 ], [ -3, 8, -1, -1, 1, -1 ], [ -3, 7, -1, -1, 1, -1 ] ], 2.625 ] - ], - [ - [ [ [ -2, 9, -1, -1, 1, -1 ], [ -2, 7, -1, -2, 1, -1 ], [ -3, 8, -1, -1, 1, -1 ], [ -4, 9, -1, -1, 1, -1 ] ], 1 ], - [ [ [ -2, 9, -1, -1, 1, -1 ], [ -2, 7, -1, -2, 1, -1 ], [ -4, 10, -1, -1, 1, -1 ], [ -4, 9, -1, -1, 1, -1 ] ], 3.5 ] - ], - [ - [ [ [ -2, 9, -1, -2, 1, -1 ], [ -2, 7, -1, -2, 1, -1 ], [ -4, 10, -1, -1, 1, -1 ], [ -4, 9, -1, -1, 1, -1 ] ], 1 ], - [ [ [ -2, 9, -1, -2, 1, -1 ], [ -4, 8, -1, -1, 1, -1 ], [ -4, 10, -1, -1, 1, -1 ], [ -4, 9, -1, -1, 1, -1 ] ], 3.125 ] - ], - [ - [ [ [ -2, 9, -1, -2, 1, -1 ], [ -4, 8, -1, -1, 1, -1 ], [ -3, 9, -2, -1, 1, -1 ], [ -4, 9, -1, -1, 1, -1 ] ], 1.25 ] - ], - [ - [ [ [ -2, 9, -1, -2, 1, -1 ], [ -4, 8, -1, -1, 1, -1 ], [ -3, 9, -2, -1, 1, -1 ], [ -3, 9, -1, -2, 1, -1 ] ], 3.125 ] - ], - [ - [ [ [ -2, 8, -1, -2, 1, -1 ], [ -4, 8, -1, -1, 1, -1 ], [ -3, 9, -2, -1, 1, -1 ], [ -3, 9, -1, -2, 1, -1 ] ], 1 ], - [ [ [ -2, 8, -1, -2, 1, -1 ], [ -4, 8, -1, -1, 1, -1 ], [ -3, 9, -2, -1, 1, -1 ], [ -3, 8, -1, -2, 1, -1 ] ], 1 ], - [ [ [ -2, 8, -1, -2, 1, -1 ], [ -4, 8, -1, -1, 1, -1 ], [ -3, 8, -1, -1, 1, -1 ], [ -3, 8, -1, -2, 1, -1 ] ], 2.375 ] - ], - [ - [ [ [ -2, 8, -1, -2, 1, -1 ], [ -4, 8, -1, -1, 1, -1 ], [ -3, 8, -1, -1, 1, -1 ], [ -4, 8, 0, -1, 1, -1 ] ], 1 ], - [ [ [ -2, 8, -1, -2, 1, -1 ], [ -4, 8, -1, -1, 1, -1 ], [ -2, 8, -1, -2, 0, -1 ], [ -4, 8, 0, -1, 1, -1 ] ], 2.875 ] - ], - [ - [ [ [ -2, 8, -1, -2, 1, -1 ], [ -4, 8, -1, -1, 1, -1 ], [ -3, 8, -1, -2, 1, 0 ], [ -4, 8, 0, -1, 1, -1 ] ], 1 ], - [ [ [ -2, 8, -1, -2, 1, -1 ], [ -4, 8, -1, -1, 1, -1 ], [ -3, 8, -1, -2, 1, 0 ], [ -3, 8, 0, -2, 1, -1 ] ], 1 ], - [ [ [ -2, 8, -1, -2, 1, -1 ], [ -3, 8, -1, -2, 1, -1 ], [ -3, 8, -1, -2, 1, 0 ], [ -3, 8, 0, -2, 1, -1 ] ], 1.625 ] - ], - [ - [ [ [ -2, 8, -1, -2, 1, -1 ], [ -4, 8, -1, -2, 1, 0 ], [ -3, 8, -1, -2, 1, 0 ], [ -3, 8, 0, -2, 1, -1 ] ], 1 ], - [ [ [ -2, 8, -1, -2, 1, -1 ], [ -4, 8, -1, -2, 1, 0 ], [ -3, 8, -1, -2, 1, 0 ], [ -3, 8, -1, -2, 0, -1 ] ], 1 ], - [ [ [ -2, 8, -1, -2, 1, -1 ], [ -4, 8, -1, -2, 1, 0 ], [ -3, 8, -1, -2, 1, -1 ], [ -3, 8, -1, -2, 0, -1 ] ], 1.875 ] - ], - [ - [ [ [ -2, 7, -1, -2, 1, -1 ], [ -4, 8, -1, -2, 1, 0 ], [ -3, 8, -1, -2, 1, -1 ], [ -3, 8, -1, -2, 0, -1 ] ], 1 ], - [ [ [ -2, 7, -1, -2, 1, -1 ], [ -4, 8, -1, -1, 1, -1 ], [ -3, 8, -1, -2, 1, -1 ], [ -3, 8, -1, -2, 0, -1 ] ], 2.125 ] - ], - [ - [ [ [ -2, 7, -1, -2, 1, -1 ], [ -4, 8, -1, -1, 1, -1 ], [ -2, 8, 0, -2, 0, -1 ], [ -3, 8, -1, -2, 0, -1 ] ], 1 ], - [ [ [ -2, 7, -1, -2, 1, -1 ], [ -3, 8, -1, -2, 1, -1 ], [ -2, 8, 0, -2, 0, -1 ], [ -3, 8, -1, -2, 0, -1 ] ], 1 ], - [ [ [ -2, 8, -1, -2, 0, -1 ], [ -3, 8, -1, -2, 1, -1 ], [ -2, 8, 0, -2, 0, -1 ], [ -3, 8, -1, -2, 0, -1 ] ], 1.75 ] - ], - [ - [ [ [ -3, 8, -1, -2, 1, 0 ], [ -3, 8, -1, -2, 1, -1 ], [ -2, 8, 0, -2, 0, -1 ], [ -3, 8, -1, -2, 0, -1 ] ], 1 ], - [ [ [ -3, 8, -1, -2, 1, 0 ], [ -3, 8, -1, -2, 1, -1 ], [ -2, 8, -1, -2, 1, -1 ], [ -3, 8, -1, -2, 0, -1 ] ], 3.375 ] - ], - [ - [ [ [ -3, 8, -1, -2, 1, 0 ], [ -3, 8, -1, -2, 1, -1 ], [ -2, 8, -1, -2, 1, -1 ], [ -3, 8, -2, -2, 1, -1 ] ], 2.125 ], - [ [ [ -3, 8, -1, -2, 1, 0 ], [ "Rest" ], [ -2, 8, -1, -2, 1, -1 ], [ -3, 8, -2, -2, 1, -1 ] ], 1 ], - [ [ [ -3, 8, -1, -2, 1, 0 ], [ "Rest" ], [ -2, 8, -1, -2, 1, -1 ], [ "Rest" ] ], 1 ], - [ [ [ -3, 8, -1, -2, 1, 0 ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 1 ], - [ [ [ "Rest" ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 3.25 ] - ] - ] -], -"last_changes": -[ - [ [ -2, 7, -1, -2, 1, -1 ], [ -3, 8, -1, -2, 1, -1 ], [ -2, 8, 0, -2, 0, -1 ], [ -3, 8, -1, -2, 0, -1 ] ], - [ [ -2, 8, -1, -2, 0, -1 ], [ -3, 8, -1, -2, 1, -1 ], [ -2, 8, 0, -2, 0, -1 ], [ -3, 8, -1, -2, 0, -1 ] ], - [ [ -3, 8, -1, -2, 1, 0 ], [ -3, 8, -1, -2, 1, -1 ], [ -2, 8, 0, -2, 0, -1 ], [ -3, 8, -1, -2, 0, -1 ] ], - [ [ -3, 8, -1, -2, 1, 0 ], [ -3, 8, -1, -2, 1, -1 ], [ -2, 8, -1, -2, 1, -1 ], [ -3, 8, -1, -2, 0, -1 ] ], - [ [ -3, 8, -1, -2, 1, 0 ], [ -3, 8, -1, -2, 1, -1 ], [ -2, 8, -1, -2, 1, -1 ], [ -3, 8, -2, -2, 1, -1 ] ] -], -"cur_uid": "tmp", -"ref_uid": "nil", -"order_seed": 389930, -"dur_seed": 362766, -"motifs_seed": 479673, -"entrances_probs_vals": [ 0, 0, 2.9365079365079, 1, 1, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"passages_probs_vals": [ 0, 0, 2.7380952380952, 1, 1, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"exits_probs_vals": [ 0, 0, 2.7380952380952, 1, 1, 0, 0.5, 0.5, 0.5, 1, 0.5 ], -"ranges": [ [ -2400, 1200 ], [ -1200, 1200 ], [ -702, 1200 ], [ -702, 1200 ] ], -"step_probs_vals": [ -1200, 1200, 0.0020576131687243, 0.068181818181818, 0.074074074074074, 0.0625, 0.20576131687243, 0.0625, 0.45679012345679, 0.011363636363636, 0.53086419753086, 0, 0.54320987654321, 0.92045454545455, 0.58641975308642, 0.92613636363636, 0.61111111111111, 0, 0.78600823045268, 0.068181818181818, 0.98971193415638, 0.0625 ], -"passages_weights": [ 1, 1, 0.48, 1, 1 ], -"hd_exp": 10, -"hd_invert": 0, -"order": -[ - [ [ 2, 3, 1 ], [ 0 ], [ ] ], - [ [ 1, 3 ], [ 2, 0 ], [ ] ], - [ [ 0, 3 ], [ 2, 1 ], [ ] ], - [ [ 2, 3, 0 ], [ 1 ], [ ] ], - [ [ 1 ], [ 3, 0, 2 ], [ ] ], - [ [ 3, 1 ], [ 2, 0 ], [ ] ], - [ [ 2 ], [ 1, 3, 0 ], [ ] ], - [ [ 2, 1 ], [ 3, 0 ], [ ] ], - [ [ 0, 3 ], [ 1, 2 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 2 ], [ 0, 3, 1 ], [ ] ], - [ [ 3, 2 ], [ 0, 1 ], [ ] ], - [ [ 2, 1, 0 ], [ 3 ], [ ] ], - [ [ 0, 1, 2 ], [ 3 ], [ ] ], - [ [ 3 ], [ 2, 1, 0 ], [ ] ], - [ [ 3, 1, 2 ], [ 0 ], [ ] ], - [ [ 0, 3, 2 ], [ 1 ], [ ] ], - [ [ 2 ], [ 3, 0, 1 ], [ ] ], - [ [ 1 ], [ 3, 0, 2 ], [ ] ], - [ [ 2, 0 ], [ 3, 1 ], [ ] ], - [ [ 1, 3, 0 ], [ 2 ], [ ] ], - [ [ 1 ], [ 3, 0, 2 ], [ ] ], - [ [ 2, 1, 0 ], [ 3 ], [ ] ], - [ [ 0, 1, 2 ], [ 3 ], [ ] ], - [ [ 2 ], [ 0, 3, 1 ], [ ] ], - [ [ 0 ], [ 3, 1, 2 ], [ ] ], - [ [ 2, 1 ], [ 3, 0 ], [ ] ], - [ [ 1, 3 ], [ 0, 2 ], [ ] ], - [ [ 2, 1, 3 ], [ 0 ], [ ] ], - [ [ 0 ], [ 2, 3, 1 ], [ ] ], - [ [ 0, 3 ], [ 2, 1 ], [ ] ], - [ [ 0, 1, 2 ], [ 3 ], [ ] ], - [ [ 0 ], [ 3, 2, 1 ], [ ] ], - [ [ 2, 3 ], [ 1, 0 ], [ ] ], - [ [ 3, 1 ], [ 0, 2 ], [ ] ], - [ [ 3, 2 ], [ 0, 1 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 1, 0 ], [ 2, 3 ], [ ] ], - [ [ 2, 3 ], [ 0, 1 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 3 ], [ 2, 1, 0 ], [ ] ], - [ [ 2, 0 ], [ 3, 1 ], [ ] ], - [ [ 2, 1, 0 ], [ 3 ], [ ] ], - [ [ 3 ], [ 2, 1, 0 ], [ ] ], - [ [ 0, 2 ], [ 1, 3 ], [ ] ], - [ [ 0, 2 ], [ 3, 1 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 0, 1, 3 ], [ 2 ], [ ] ], - [ [ 0 ], [ 2, 1, 3 ], [ ] ], - [ [ 3, 2 ], [ 0, 1 ], [ ] ], - [ [ 3 ], [ 0, 1, 2 ], [ ] ], - [ [ 3, 0 ], [ 1, 2 ], [ ] ], - [ [ 2 ], [ 3, 0, 1 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 0 ], [ 1, 3, 2 ], [ ] ], - [ [ 2, 0, 3 ], [ 1 ], [ ] ], - [ [ 3 ], [ 0, 1, 2 ], [ ] ], - [ [ 3, 2, 0 ], [ 1 ], [ ] ], - [ [ 2 ], [ 0, 3, 1 ], [ ] ], - [ [ 1, 2 ], [ 3, 0 ], [ ] ], - [ [ 1 ], [ 3, 0, 2 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 0, 2, 1 ], [ 3 ], [ ] ], - [ [ 1, 2, 0 ], [ 3 ], [ ] ], - [ [ 2 ], [ 0, 1, 3 ], [ ] ], - [ [ 0, 2, 3 ], [ 1 ], [ ] ], - [ [ 0, 3 ], [ 1, 2 ], [ ] ], - [ [ 2, 0 ], [ 1, 3 ], [ ] ], - [ [ 2, 1, 0 ], [ 3 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 1, 3 ], [ 0, 2 ], [ ] ], - [ [ 3, 2, 1 ], [ 0 ], [ ] ], - [ [ 1, 2 ], [ 3, 0 ], [ ] ], - [ [ 2, 3 ], [ 0, 1 ], [ ] ], - [ [ 1, 2 ], [ 0, 3 ], [ ] ], - [ [ 0 ], [ 3, 1, 2 ], [ ] ], - [ [ 1, 2 ], [ 3, 0 ], [ ] ], - [ [ 2, 1 ], [ 3, 0 ], [ ] ], - [ [ 0, 3, 1 ], [ 2 ], [ ] ], - [ [ 3, 0, 2 ], [ 1 ], [ ] ], - [ [ 2, 1 ], [ 0, 3 ], [ ] ], - [ [ 1, 0, 3 ], [ 2 ], [ ] ], - [ [ 3, 1 ], [ 0, 2 ], [ ] ], - [ [ 3, 2 ], [ 1, 0 ], [ ] ], - [ [ 0, 1 ], [ 3, 2 ], [ ] ], - [ [ 2, 3 ], [ 0, 1 ], [ ] ], - [ [ 3, 1, 0 ], [ 2 ], [ ] ], - [ [ 1, 0, 2 ], [ 3 ], [ ] ], - [ [ 1 ], [ 0, 3, 2 ], [ ] ], - [ [ 0, 1 ], [ 3, 2 ], [ ] ], - [ [ 0 ], [ 2, 3, 1 ], [ ] ], - [ [ 0 ], [ 1, 3, 2 ], [ ] ], - [ [ 2, 3 ], [ 0, 1 ], [ ] ], - [ [ 3 ], [ 2, 1, 0 ], [ ] ], - [ [ 3, 1 ], [ 0, 2 ], [ ] ], - [ [ 0, 2, 1 ], [ 3 ], [ ] ] -], -"sus_weights": [ 0.35, 0.37, 0.38 ], -"order_size": [ 100, 100 ], -"passages_size": [ 0, 0 ], -"motif_edited": "false", -"order_edited": "false" -} \ No newline at end of file diff --git a/resources/string_quartet_3_rise.json b/resources/string_quartet_3_rise.json index 6adddb6..a51a77e 100644 --- a/resources/string_quartet_3_rise.json +++ b/resources/string_quartet_3_rise.json @@ -28,6 +28,6 @@ "4dd2a130", "767e70f0", "536cac90", - "67633b5a" + "5ededd80" ] } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/4dd2a130/4dd2a130_mus_model.json b/resources/string_quartet_3_rise/4dd2a130/4dd2a130_mus_model.json index bf4b64e..65401bc 100644 --- a/resources/string_quartet_3_rise/4dd2a130/4dd2a130_mus_model.json +++ b/resources/string_quartet_3_rise/4dd2a130/4dd2a130_mus_model.json @@ -3,29 +3,29 @@ [ [ [ - [ [ [ -5, 5, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -4, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -5, 5, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -4, 4, 0, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -4, 4, 0, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -4, 4, 0, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -4, 4, 0, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -4, 4, 0, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] + [ [ [ -6, 5, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -6, 5, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -5, 4, 0, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -5, 4, 0, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -5, 4, 0, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -5, 4, 0, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -5, 4, 0, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] ], [ - [ [ [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -4, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -4, 4, 0, 2, -1, 2 ], [ -6, 4, 1, 2, -1, 2 ], [ -4, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] + [ [ [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -4, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -5, 4, 0, 2, -1, 2 ], [ -6, 4, 1, 2, -1, 2 ], [ -4, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] ], [ - [ [ [ -4, 4, 0, 2, -1, 2 ], [ -6, 4, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 1, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -5, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 1, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] + [ [ [ -5, 4, 0, 2, -1, 2 ], [ -6, 4, 1, 2, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 1, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 1, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] ], [ - [ [ [ -5, 4, 1, 2, -1, 3 ], [ -5, 4, 1, 1, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -5, 4, 1, 2, -1, 3 ], [ -5, 4, -1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -5, 4, 1, 2, -1, 3 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -4, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] + [ [ [ -6, 4, 1, 2, -1, 3 ], [ -5, 4, 1, 1, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -6, 4, 1, 2, -1, 3 ], [ -5, 4, -1, 2, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -6, 4, 1, 2, -1, 3 ], [ -5, 3, 1, 2, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -5, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] ] ] ], diff --git a/resources/string_quartet_3_rise/4dd2a130/lilypond/part_I.ly b/resources/string_quartet_3_rise/4dd2a130/lilypond/part_I.ly index 07fa029..609f925 100644 --- a/resources/string_quartet_3_rise/4dd2a130/lilypond/part_I.ly +++ b/resources/string_quartet_3_rise/4dd2a130/lilypond/part_I.ly @@ -1,6 +1,5 @@ { - { f'1^\markup { \pad-markup #0.2 "-38"} ~ } - \bar "|" - { f'1} + \time 3/2 + { f'1.^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< IV"\normal-size-super " 1↑" }} ~ } \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/4dd2a130/lilypond/part_II.ly b/resources/string_quartet_3_rise/4dd2a130/lilypond/part_II.ly index 702338f..dff90cd 100644 --- a/resources/string_quartet_3_rise/4dd2a130/lilypond/part_II.ly +++ b/resources/string_quartet_3_rise/4dd2a130/lilypond/part_II.ly @@ -1,6 +1,5 @@ { - { f''8^\markup { \pad-markup #0.2 "-38"}[ c'8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] cis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}[ ais'8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}] ~ ais'8[ c''8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}] f''4^\markup { \pad-markup #0.2 "-38"} } - \bar "|" - { cis'1^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}} + { f'8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< II"\normal-size-super " 1↑" }}[ c'8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] cis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }}[ ais'8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}] ~ ais'8[ c''8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}] f''4^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }} } + { cis''2^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/4dd2a130/lilypond/part_III.ly b/resources/string_quartet_3_rise/4dd2a130/lilypond/part_III.ly index 683b743..bce6f96 100644 --- a/resources/string_quartet_3_rise/4dd2a130/lilypond/part_III.ly +++ b/resources/string_quartet_3_rise/4dd2a130/lilypond/part_III.ly @@ -1,6 +1,5 @@ { - { ais2^\markup { \pad-markup #0.2 "-40"} c'4^\markup { \pad-markup #0.2 "-37"} cis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}[ f8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}] ~ } - \bar "|" - { f8[ g8^\markup { \pad-markup #0.2 "-7"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↓" }}] a8^\markup { \pad-markup #0.2 "-11"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 5↓" }}[ ais8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }}] ~ ais2} + { ais2^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< IV"\normal-size-super " 3↓" }} c'4^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }} cis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}[ f8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}] ~ } + { f8[ g8^\markup { \pad-markup #0.2 "-7"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↓" }}] a8^\markup { \pad-markup #0.2 "-11"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 5↓" }}[ ais8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }}] } \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/4dd2a130/lilypond/part_IV.ly b/resources/string_quartet_3_rise/4dd2a130/lilypond/part_IV.ly index 74ec7e4..4e1dec3 100644 --- a/resources/string_quartet_3_rise/4dd2a130/lilypond/part_IV.ly +++ b/resources/string_quartet_3_rise/4dd2a130/lilypond/part_IV.ly @@ -1,6 +1,6 @@ { - { c''4^\markup { \pad-markup #0.2 "-37"} cis''2.^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }} ~ } - \bar "|" - { cis''8[ c''8^\markup { \pad-markup #0.2 "-37"}] cis''8^\markup { \pad-markup #0.2 "+2"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 13↑" }}[ ais'8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}] ~ ais'2} + { c'4^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< III"\normal-size-super " 1↑" }} cis'2.^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }} ~ } + + { cis'8[ c'8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}] cis'8^\markup { \pad-markup #0.2 "+2"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 13↑" }}[ ais8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}] } \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/4f53a446/lilypond/part_I.ly b/resources/string_quartet_3_rise/4f53a446/lilypond/part_I.ly index 629df46..9402701 100644 --- a/resources/string_quartet_3_rise/4f53a446/lilypond/part_I.ly +++ b/resources/string_quartet_3_rise/4f53a446/lilypond/part_I.ly @@ -17,6 +17,7 @@ \bar "|" { gis1 ~ } \bar "|" - { gis1} + { gis1 \laissezVibrer} + \break \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/4f53a446/lilypond/part_II.ly b/resources/string_quartet_3_rise/4f53a446/lilypond/part_II.ly index 74ba4e1..5895980 100644 --- a/resources/string_quartet_3_rise/4f53a446/lilypond/part_II.ly +++ b/resources/string_quartet_3_rise/4f53a446/lilypond/part_II.ly @@ -5,7 +5,7 @@ \bar "|" { d'1 } \bar "|" - { cis'1^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }} ~ } + { cis'1^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↓" }} ~ } \bar "|" { cis'1 ~ } \bar "|" @@ -17,6 +17,6 @@ \bar "|" { cis'1 ~ } \bar "|" - { cis'1} + { cis'1 \laissezVibrer} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/4f53a446/lilypond/part_III.ly b/resources/string_quartet_3_rise/4f53a446/lilypond/part_III.ly index 69d6915..956ee96 100644 --- a/resources/string_quartet_3_rise/4f53a446/lilypond/part_III.ly +++ b/resources/string_quartet_3_rise/4f53a446/lilypond/part_III.ly @@ -13,10 +13,10 @@ \bar "|" { f'4 ~ f'16[ fis'8.^\markup { \pad-markup #0.2 "-31"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 3↓" }}] ~ fis'2 ~ } \bar "|" - { fis'4 gis'2.^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }} ~ } + { fis'4 gis'2.^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 3↑" }} ~ } \bar "|" { gis'1 ~ } \bar "|" - { gis'1} + { gis'1 \laissezVibrer} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/4f53a446/lilypond/part_IV.ly b/resources/string_quartet_3_rise/4f53a446/lilypond/part_IV.ly index 21a8095..d899504 100644 --- a/resources/string_quartet_3_rise/4f53a446/lilypond/part_IV.ly +++ b/resources/string_quartet_3_rise/4f53a446/lilypond/part_IV.ly @@ -1,4 +1,5 @@ { + \clef treble { a'2^\markup { \pad-markup #0.2 "+28"} ~ a'16[ ais'8.^\markup { \pad-markup #0.2 "-45"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}] ~ ais'4 ~ } \bar "|" { ais'2 c''2^\markup { \pad-markup #0.2 "-41"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↑" }} ~ } @@ -13,10 +14,10 @@ \bar "|" { g'4 ~ g'16[ a'8.^\markup { \pad-markup #0.2 "-16"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 5↓" }}] ~ a'2 ~ } \bar "|" - { a'4 gis,2.^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }} ~ } + { a'4 \clef bass gis,2.^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 3↑" }} ~ } \bar "|" { gis,1 ~ } \bar "|" - { gis,1} + { gis,1 \laissezVibrer} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/50c2b0ad/50c2b0ad_mus_model.json b/resources/string_quartet_3_rise/50c2b0ad/50c2b0ad_mus_model.json index 10eff06..e91ef34 100644 --- a/resources/string_quartet_3_rise/50c2b0ad/50c2b0ad_mus_model.json +++ b/resources/string_quartet_3_rise/50c2b0ad/50c2b0ad_mus_model.json @@ -25,34 +25,34 @@ [ [ [ -4, 4, -1, 1, -2, 2 ], [ -4, 4, 0, 2, -2, 2 ], [ -4, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0 ], [ [ [ -5, 4, 0, 2, -2, 2 ], [ -4, 4, 0, 2, -2, 2 ], [ -4, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ], [ [ [ -5, 4, -1, 2, -2, 2 ], [ -4, 4, 0, 2, -2, 2 ], [ -4, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0 ], - [ [ [ -5, 4, -1, 2, -2, 2 ], [ -4, 3, -1, 2, -2, 2 ], [ -4, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ], - [ [ [ -5, 4, -1, 2, -2, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ], - [ [ [ -5, 4, -1, 2, -2, 2 ], [ -4, 3, -1, 2, -2, 2 ], [ -4, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ] + [ [ [ -5, 4, -1, 2, -2, 2 ], [ -3, 3, -1, 2, -2, 2 ], [ -4, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ], + [ [ [ -5, 4, -1, 2, -2, 2 ], [ -4, 5, -1, 2, -2, 2 ], [ -4, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ], + [ [ [ -5, 4, -1, 2, -2, 2 ], [ -3, 3, -1, 2, -2, 2 ], [ -4, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ] ], [ - [ [ [ -5, 4, -1, 2, -2, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ], - [ [ [ -5, 4, -1, 2, -2, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -3, 4, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0 ], - [ [ [ -4, 5, -1, 2, -2, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -3, 4, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ], - [ [ [ -4, 5, -1, 2, -2, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -2, 4, -1, 1, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ], - [ [ [ -4, 5, -1, 2, -2, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -3, 4, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0 ], - [ [ [ -4, 5, -1, 2, -2, 2 ], [ -4, 3, -1, 2, -2, 2 ], [ -3, 4, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ], - [ [ [ -4, 5, -1, 2, -2, 2 ], [ -4, 3, -1, 2, -2, 2 ], [ -3, 3, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ] + [ [ [ -5, 4, -1, 2, -2, 2 ], [ -4, 5, -1, 2, -2, 2 ], [ -4, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ], + [ [ [ -5, 4, -1, 2, -2, 2 ], [ -4, 5, -1, 2, -2, 2 ], [ -3, 4, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0 ], + [ [ [ -5, 5, -1, 2, -2, 2 ], [ -4, 5, -1, 2, -2, 2 ], [ -3, 4, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ], + [ [ [ -5, 5, -1, 2, -2, 2 ], [ -4, 5, -1, 2, -2, 2 ], [ -2, 4, -1, 1, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ], + [ [ [ -5, 5, -1, 2, -2, 2 ], [ -4, 5, -1, 2, -2, 2 ], [ -3, 4, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0 ], + [ [ [ -5, 5, -1, 2, -2, 2 ], [ -3, 3, -1, 2, -2, 2 ], [ -3, 4, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ], + [ [ [ -5, 5, -1, 2, -2, 2 ], [ -3, 3, -1, 2, -2, 2 ], [ -3, 3, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ] ], [ - [ [ [ -4, 5, -1, 2, -2, 2 ], [ -5, 4, 0, 2, -2, 2 ], [ -3, 3, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0 ], - [ [ [ -4, 5, -1, 2, -2, 2 ], [ -5, 4, 0, 2, -2, 2 ], [ -4, 4, 0, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ], - [ [ [ -4, 5, -1, 2, -2, 2 ], [ -5, 4, -1, 2, -2, 2 ], [ -4, 4, 0, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ] + [ [ [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, 0, 2, -2, 2 ], [ -3, 3, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0 ], + [ [ [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, 0, 2, -2, 2 ], [ -4, 4, 0, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ], + [ [ [ -5, 5, -1, 2, -2, 2 ], [ -3, 4, -1, 2, -2, 2 ], [ -4, 4, 0, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ] ], [ - [ [ [ -4, 5, -1, 2, -2, 2 ], [ -5, 4, -1, 2, -2, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0 ], - [ [ [ -4, 5, -1, 2, -2, 2 ], [ -3, 4, -1, 2, -2, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0 ], - [ [ [ -3, 3, -1, 2, -2, 2 ], [ -3, 4, -1, 2, -2, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ] + [ [ [ -5, 5, -1, 2, -2, 2 ], [ -3, 4, -1, 2, -2, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0 ], + [ [ [ -5, 5, -1, 2, -2, 2 ], [ -3, 4, -1, 2, -2, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0 ], + [ [ [ -4, 3, -1, 2, -2, 2 ], [ -3, 4, -1, 2, -2, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ] ], [ - [ [ [ -4, 4, 0, 2, -2, 2 ], [ -3, 4, -1, 2, -2, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0 ], - [ [ [ -4, 4, 0, 2, -2, 2 ], [ -4, 5, 0, 2, -2, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ], - [ [ [ -4, 4, 0, 2, -2, 2 ], [ -4, 4, -1, 3, -2, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0 ], - [ [ [ -4, 4, -1, 2, -1, 2 ], [ -4, 4, -1, 3, -2, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ] + [ [ [ -5, 4, 0, 2, -2, 2 ], [ -3, 4, -1, 2, -2, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0 ], + [ [ [ -5, 4, 0, 2, -2, 2 ], [ -4, 5, 0, 2, -2, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ], + [ [ [ -5, 4, 0, 2, -2, 2 ], [ -4, 4, -1, 3, -2, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0 ], + [ [ [ -5, 4, -1, 2, -1, 2 ], [ -4, 4, -1, 3, -2, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ] ] ] ], diff --git a/resources/string_quartet_3_rise/50c2b0ad/lilypond/part_I.ly b/resources/string_quartet_3_rise/50c2b0ad/lilypond/part_I.ly index e1ef119..fb30c3e 100644 --- a/resources/string_quartet_3_rise/50c2b0ad/lilypond/part_I.ly +++ b/resources/string_quartet_3_rise/50c2b0ad/lilypond/part_I.ly @@ -1,8 +1,10 @@ { - { cis''2^\markup { \pad-markup #0.2 "-29"} d'2^\markup { \pad-markup #0.2 "-18"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↓" }} } + { cis''2^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< II"\normal-size-super " 1↑" }} d'2^\markup { \pad-markup #0.2 "-18"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↓" }} } \bar "|" - { dis'1^\markup { \pad-markup #0.2 "+38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }} ~ } + { dis'1^\markup { \pad-markup #0.2 "+38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 7↑" }} ~ } \bar "|" - { dis'1} + \time 7/8 + { dis'2 ~ dis'4. ~} + \time 2/2 \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/50c2b0ad/lilypond/part_II.ly b/resources/string_quartet_3_rise/50c2b0ad/lilypond/part_II.ly index 02fc9d9..41b013e 100644 --- a/resources/string_quartet_3_rise/50c2b0ad/lilypond/part_II.ly +++ b/resources/string_quartet_3_rise/50c2b0ad/lilypond/part_II.ly @@ -1,8 +1,8 @@ { - { a'2^\markup { \pad-markup #0.2 "-16"} b'8^\markup { \pad-markup #0.2 "-33"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }}[ cis''8^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↑" }}] d''8^\markup { \pad-markup #0.2 "-18"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}[ dis''8^\markup { \pad-markup #0.2 "+38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 7↑" }}] } + { a'2^\markup { \pad-markup #0.2 "-16"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< I"\normal-size-super " 1↑" }} b'8^\markup { \pad-markup #0.2 "-33"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↓" }}[ cis''8^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↑" }}] d''8^\markup { \pad-markup #0.2 "-18"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}[ dis''8^\markup { \pad-markup #0.2 "+38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 7↑" }}] } \bar "|" - { fis''8^\markup { \pad-markup #0.2 "-31"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}[ ais'8^\markup { \pad-markup #0.2 "+40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}] ~ ais'2 dis''8^\markup { \pad-markup #0.2 "+38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}[ fis''8^\markup { \pad-markup #0.2 "-31"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↓" }}] } + { fis''8^\markup { \pad-markup #0.2 "-31"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}[ ais'8^\markup { \pad-markup #0.2 "+40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}] ~ ais'2 dis''8^\markup { \pad-markup #0.2 "+38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}[ fis''8^\markup { \pad-markup #0.2 "-31"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↓" }}] } \bar "|" - { dis''8^\markup { \pad-markup #0.2 "+38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}[ gis'8^\markup { \pad-markup #0.2 "+36"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}] g'4^\markup { \pad-markup #0.2 "+24"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }} ais2^\markup { \pad-markup #0.2 "+40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}} + { dis''8^\markup { \pad-markup #0.2 "+38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}[ gis'8^\markup { \pad-markup #0.2 "+36"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}] g'4^\markup { \pad-markup #0.2 "+24"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }} ais4.^\markup { \pad-markup #0.2 "+40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }} ~} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/50c2b0ad/lilypond/part_III.ly b/resources/string_quartet_3_rise/50c2b0ad/lilypond/part_III.ly index 2c18edf..838910c 100644 --- a/resources/string_quartet_3_rise/50c2b0ad/lilypond/part_III.ly +++ b/resources/string_quartet_3_rise/50c2b0ad/lilypond/part_III.ly @@ -1,8 +1,8 @@ { - { d'8^\markup { \pad-markup #0.2 "-18"}[ dis'8^\markup { \pad-markup #0.2 "+38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }}] e'8^\markup { \pad-markup #0.2 "-14"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 3↑" }}[ fis'8^\markup { \pad-markup #0.2 "-31"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }}] ~ fis'2 ~ } + { d'8^\markup { \pad-markup #0.2 "-18"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< I"\normal-size-super " 3↓" }}[ dis'8^\markup { \pad-markup #0.2 "+38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }}] e'8^\markup { \pad-markup #0.2 "-14"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 3↑" }}[ fis'8^\markup { \pad-markup #0.2 "-31"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }}] ~ fis'2 ~ } \bar "|" - { fis'8[ g'8^\markup { \pad-markup #0.2 "+24"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }}] gis8^\markup { \pad-markup #0.2 "+36"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }}[ ais8^\markup { \pad-markup #0.2 "+40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}] gis8^\markup { \pad-markup #0.2 "+36"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }}[ ais8^\markup { \pad-markup #0.2 "+40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}] ~ ais4 } + { fis'8[ g'8^\markup { \pad-markup #0.2 "+24"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }}] gis'8^\markup { \pad-markup #0.2 "+36"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }}[ ais'8^\markup { \pad-markup #0.2 "+40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}] gis'8^\markup { \pad-markup #0.2 "+36"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }}[ ais'8^\markup { \pad-markup #0.2 "+40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}] ~ ais'4 } \bar "|" - { gis4^\markup { \pad-markup #0.2 "+36"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 3↓" }} g8^\markup { \pad-markup #0.2 "+24"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }}[ dis8^\markup { \pad-markup #0.2 "+38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}] dis''8^\markup { \pad-markup #0.2 "+38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}[ d''8^\markup { \pad-markup #0.2 "+26"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↑" }}] cis''4^\markup { \pad-markup #0.2 "+6"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↑" }}} + { gis'4^\markup { \pad-markup #0.2 "+36"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }} g'8^\markup { \pad-markup #0.2 "+24"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }}[ dis''8^\markup { \pad-markup #0.2 "+38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}] ~ dis''8[ d''8^\markup { \pad-markup #0.2 "+26"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 5↑" }} cis''8^\markup { \pad-markup #0.2 "+6"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↑" }}]} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/50c2b0ad/lilypond/part_IV.ly b/resources/string_quartet_3_rise/50c2b0ad/lilypond/part_IV.ly index 5f683d4..0bd8aeb 100644 --- a/resources/string_quartet_3_rise/50c2b0ad/lilypond/part_IV.ly +++ b/resources/string_quartet_3_rise/50c2b0ad/lilypond/part_IV.ly @@ -1,8 +1,8 @@ { - { ais2^\markup { \pad-markup #0.2 "+40"} fis2^\markup { \pad-markup #0.2 "-31"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }} ~ } + { ais2 fis2^\markup { \pad-markup #0.2 "-31"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }} ~ } \bar "|" - { fis8[ g8^\markup { \pad-markup #0.2 "+24"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}] dis2^\markup { \pad-markup #0.2 "+38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }} ais'4^\markup { \pad-markup #0.2 "+40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }} ~ } + { fis8[ g8^\markup { \pad-markup #0.2 "+24"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }}] dis2^\markup { \pad-markup #0.2 "+38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }} ais4^\markup { \pad-markup #0.2 "+40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }} ~ } \bar "|" - { ais'2 gis'8^\markup { \pad-markup #0.2 "+36"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↓" }}[ g'8^\markup { \pad-markup #0.2 "+24"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↑" }}] a'4^\markup { \pad-markup #0.2 "-11"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↑" }}} + { ais2 gis8^\markup { \pad-markup #0.2 "+36"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↓" }}[ g8^\markup { \pad-markup #0.2 "+24"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }} a8^\markup { \pad-markup #0.2 "-11"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↑" }}] ~} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/536cac90/536cac90_mus_model.json b/resources/string_quartet_3_rise/536cac90/536cac90_mus_model.json index c479c84..cf23fc2 100644 --- a/resources/string_quartet_3_rise/536cac90/536cac90_mus_model.json +++ b/resources/string_quartet_3_rise/536cac90/536cac90_mus_model.json @@ -9,30 +9,30 @@ [ [ [ -6, 4, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] ], [ - [ [ [ -6, 4, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -6, 3, 1, 3, -1, 2 ] ], 0.25 ], - [ [ [ -6, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -6, 3, 1, 3, -1, 2 ] ], 0 ], - [ [ [ -6, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -6, 3, 1, 3, -1, 2 ] ], 0.25 ], - [ [ [ -6, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, 0, 2 ], [ -6, 3, 1, 3, -1, 2 ] ], 0.25 ], - [ [ [ -6, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -4, 2, 1, 2, -1, 2 ], [ -6, 3, 1, 3, -1, 2 ] ], 0.25 ], - [ [ [ -6, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 3, 2, 2, -1, 2 ], [ -6, 3, 1, 3, -1, 2 ] ], 0.25 ] + [ [ [ -6, 4, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 3, 1, 3, -1, 2 ] ], 0.25 ], + [ [ [ -6, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 3, 1, 3, -1, 2 ] ], 0 ], + [ [ [ -6, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -5, 3, 1, 3, -1, 2 ] ], 0.25 ], + [ [ [ -6, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, 0, 2 ], [ -5, 3, 1, 3, -1, 2 ] ], 0.25 ], + [ [ [ -6, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -4, 2, 1, 2, -1, 2 ], [ -5, 3, 1, 3, -1, 2 ] ], 0.25 ], + [ [ [ -6, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 3, 2, 2, -1, 2 ], [ -5, 3, 1, 3, -1, 2 ] ], 0.25 ] ], [ [ [ [ -6, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 3, 2, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ], [ [ [ -6, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -4, 3, 1, 1, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ] ], [ - [ [ [ -6, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -4, 3, 0, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -6, 3, 1, 2, -1, 2 ], [ -4, 3, 1, 1, -1, 2 ], [ -4, 3, 0, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -5, 3, 1, 1, -1, 2 ], [ -4, 3, 1, 1, -1, 2 ], [ -4, 3, 0, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -5, 3, 1, 2, -1, 1 ], [ -4, 3, 1, 1, -1, 2 ], [ -4, 3, 0, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -5, 3, 1, 2, -1, 1 ], [ -5, 3, 2, 2, -1, 2 ], [ -4, 3, 0, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -5, 3, 1, 2, -1, 1 ], [ -4, 2, 1, 2, -1, 2 ], [ -4, 3, 0, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -5, 3, 1, 2, -1, 1 ], [ -4, 3, 1, 2, -1, 1 ], [ -4, 3, 0, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ] + [ [ [ -6, 3, 1, 3, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -4, 3, 0, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -6, 3, 1, 3, -1, 2 ], [ -4, 3, 1, 1, -1, 2 ], [ -4, 3, 0, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -6, 3, 1, 3, -1, 2 ], [ -4, 3, 1, 1, -1, 2 ], [ -4, 3, 0, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -6, 3, 1, 3, -1, 2 ], [ -4, 3, 1, 1, -1, 2 ], [ -4, 3, 0, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -6, 3, 1, 3, -1, 2 ], [ -5, 3, 2, 2, -1, 2 ], [ -4, 3, 0, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -6, 3, 1, 3, -1, 2 ], [ -4, 2, 1, 2, -1, 2 ], [ -4, 3, 0, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -6, 3, 1, 3, -1, 2 ], [ -4, 3, 1, 2, -1, 1 ], [ -4, 3, 0, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ] ], [ - [ [ [ -5, 3, 1, 2, -1, 1 ], [ -5, 3, 1, 2, -1, 2 ], [ -4, 3, 0, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -5, 3, 1, 2, -1, 1 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -5, 2, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -5, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -4, 3, 0, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -5, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -5, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ], [ [ [ -5, 2, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -4, 2, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ], [ [ [ -5, 2, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 3, 2, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0 ], [ [ [ -5, 2, 1, 2, -1, 2 ], [ -4, 3, 1, 1, -1, 2 ], [ -5, 3, 2, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ], @@ -41,18 +41,8 @@ [ [ [ [ -5, 2, 1, 2, -1, 2 ], [ -5, 3, 2, 2, -1, 2 ], [ -5, 3, 1, 2, 0, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0 ], [ [ [ -5, 2, 1, 2, -1, 2 ], [ -5, 3, 2, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -5, 2, 1, 2, -1, 2 ], [ -4, 2, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ] - ], - [ - [ [ [ -5, 2, 1, 2, -1, 2 ], [ -4, 2, 1, 2, -1, 2 ], [ -3, 2, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -5, 2, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -3, 2, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -6, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -3, 2, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ] - ], - [ - [ [ [ -6, 3, 1, 2, 0, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -3, 2, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -6, 3, 1, 2, 0, 2 ], [ -5, 3, 1, 2, 0, 2 ], [ -3, 2, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -6, 3, 1, 2, 0, 2 ], [ -4, 3, 1, 2, -2, 2 ], [ -3, 2, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -5, 3, 1, 2, -2, 2 ], [ -4, 3, 1, 2, -2, 2 ], [ -3, 2, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ] + [ [ [ -5, 2, 1, 2, -1, 2 ], [ -4, 2, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -5, 2, 1, 2, -1, 2 ], [ -5, 3, 2, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ] ] ] ], diff --git a/resources/string_quartet_3_rise/536cac90/lilypond/part_I.ly b/resources/string_quartet_3_rise/536cac90/lilypond/part_I.ly index 3694e4e..15327de 100644 --- a/resources/string_quartet_3_rise/536cac90/lilypond/part_I.ly +++ b/resources/string_quartet_3_rise/536cac90/lilypond/part_I.ly @@ -1,10 +1,10 @@ { - { f'2^\markup { \pad-markup #0.2 "-38"} g2^\markup { \pad-markup #0.2 "+28"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 7↑" }} ~ } + \time 2/2 + { f'2^\markup { \pad-markup #0.2 "-38"} g'2^\markup { \pad-markup #0.2 "+28"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 7↑" }} ~ } \bar "|" - { g8[ ais'8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] ~ ais'2. ~ } - \bar "|" - { ais'1 ~ } - \bar "|" - { ais'1} -\bar "||" + { g'8[ ais'8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] ~ ais'2. ~ } + \bar "|" +\time 7/8 + { ais'2 ~ ais'4.} +\bar "|" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/536cac90/lilypond/part_II.ly b/resources/string_quartet_3_rise/536cac90/lilypond/part_II.ly index 0db5273..721ffe2 100644 --- a/resources/string_quartet_3_rise/536cac90/lilypond/part_II.ly +++ b/resources/string_quartet_3_rise/536cac90/lilypond/part_II.ly @@ -1,10 +1,8 @@ { - { d'2^\markup { \pad-markup #0.2 "+30"} ~ d'8[ f'8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↑" }}] dis'8^\markup { \pad-markup #0.2 "+11"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 11↑" }}[ dis'8^\markup { \pad-markup #0.2 "-42"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }}] } + { d'2^\markup { \pad-markup #0.2 "+30"} ~ d'8[ f'8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↑" }}] dis'8^\markup { \pad-markup #0.2 "+11"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 11↑" }}[ dis'8^\markup { \pad-markup #0.2 "-42"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }}] } \bar "|" - { cis'4^\markup { \pad-markup #0.2 "+46"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↑" }} c'8^\markup { \pad-markup #0.2 "-9"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 7↓" }}[ fis'8^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↓" }}] ~ fis'2 } + { cis'4^\markup { \pad-markup #0.2 "+46"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↑" }} c'8^\markup { \pad-markup #0.2 "-9"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 7↓" }}[ fis'8^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }}] ~ fis'2 } \bar "|" - { f'8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↑" }}[ dis'8^\markup { \pad-markup #0.2 "-42"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] cis'8^\markup { \pad-markup #0.2 "+46"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↑" }}[ dis'8^\markup { \pad-markup #0.2 "+11"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↑" }}] f'4^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }} dis''4^\markup { \pad-markup #0.2 "-42"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }} ~ } - \bar "|" - { dis''1} -\bar "||" + { f'8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↑" }}[ dis'8^\markup { \pad-markup #0.2 "-42"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }}] cis'8^\markup { \pad-markup #0.2 "+46"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }}[ dis'8^\markup { \pad-markup #0.2 "+11"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↑" }}] f'4.^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}} +\bar "|" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/536cac90/lilypond/part_III.ly b/resources/string_quartet_3_rise/536cac90/lilypond/part_III.ly index 482b168..4532b3a 100644 --- a/resources/string_quartet_3_rise/536cac90/lilypond/part_III.ly +++ b/resources/string_quartet_3_rise/536cac90/lilypond/part_III.ly @@ -1,10 +1,8 @@ { - { ais8^\markup { \pad-markup #0.2 "+13"}[ c'8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↑" }}] b8^\markup { \pad-markup #0.2 "+10"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 11↓" }}[ ais8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }}] ~ ais2 ~ } + { ais8^\markup { \pad-markup #0.2 "+13"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↑" }}[ c'8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↑" }}] b8^\markup { \pad-markup #0.2 "+10"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 11↓" }}[ ais8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }}] ~ ais2 ~ } \bar "|" - { ais4 ~ ais8[ c'8^\markup { \pad-markup #0.2 "-9"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 7↓" }}] cis'8^\markup { \pad-markup #0.2 "+46"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }}[ dis'8^\markup { \pad-markup #0.2 "-42"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }}] cis'8^\markup { \pad-markup #0.2 "+19"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}[ ais8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}] ~ } + { ais4 ~ ais8[ c'8^\markup { \pad-markup #0.2 "-9"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↓" }}] cis'8^\markup { \pad-markup #0.2 "+46"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }}[ dis'8^\markup { \pad-markup #0.2 "-42"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }}] cis'8^\markup { \pad-markup #0.2 "+19"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 13↓" }}[ ais8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}] ~ } \bar "|" - { ais4 c'4^\markup { \pad-markup #0.2 "-9"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↓" }} cis'8^\markup { \pad-markup #0.2 "+46"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }}[ dis'8^\markup { \pad-markup #0.2 "-42"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] ~ dis'8[ f'8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}] ~ } - \bar "|" - { f'8[ dis'8^\markup { \pad-markup #0.2 "+11"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] e'2.^\markup { \pad-markup #0.2 "+8"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↓" }}} -\bar "||" + { ais4 c'4^\markup { \pad-markup #0.2 "-9"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↓" }} cis'8^\markup { \pad-markup #0.2 "+46"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }}[ dis'8^\markup { \pad-markup #0.2 "-42"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] cis'8^\markup { \pad-markup #0.2 "+46"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }}} +\bar "|" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/536cac90/lilypond/part_IV.ly b/resources/string_quartet_3_rise/536cac90/lilypond/part_IV.ly index d228079..1593bf8 100644 --- a/resources/string_quartet_3_rise/536cac90/lilypond/part_IV.ly +++ b/resources/string_quartet_3_rise/536cac90/lilypond/part_IV.ly @@ -1,10 +1,8 @@ { { f2^\markup { \pad-markup #0.2 "-38"} ~ f8[ ais,8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}] ~ ais,4 ~ } \bar "|" - { ais,4 ~ ais,8[ c8^\markup { \pad-markup #0.2 "-9"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}] cis2^\markup { \pad-markup #0.2 "+19"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 13↓" }} } + { ais,4 ~ ais,8[ g8^\markup { \pad-markup #0.2 "+28"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↑" }}] ~ g4 ~ g8[ ais8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}] ~ } \bar "|" - { dis1^\markup { \pad-markup #0.2 "-42"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↓" }} } - \bar "|" - { f8^\markup { \pad-markup #0.2 "-38"}[ dis8^\markup { \pad-markup #0.2 "+11"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↑" }}] e2.^\markup { \pad-markup #0.2 "+8"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}} -\bar "||" + { ais8 dis4^\markup { \pad-markup #0.2 "-42"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }} ~ dis2} +\bar "|" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/567a9375/lilypond/part_I.ly b/resources/string_quartet_3_rise/567a9375/lilypond/part_I.ly index 07fa029..010fba1 100644 --- a/resources/string_quartet_3_rise/567a9375/lilypond/part_I.ly +++ b/resources/string_quartet_3_rise/567a9375/lilypond/part_I.ly @@ -1,6 +1,6 @@ { - { f'1^\markup { \pad-markup #0.2 "-38"} ~ } - \bar "|" - { f'1} + \time 10/8 + { f'2^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< II"\normal-size-super " 1↑" }} ~ } + { f'2. } \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/567a9375/lilypond/part_II.ly b/resources/string_quartet_3_rise/567a9375/lilypond/part_II.ly index 720922d..e174f98 100644 --- a/resources/string_quartet_3_rise/567a9375/lilypond/part_II.ly +++ b/resources/string_quartet_3_rise/567a9375/lilypond/part_II.ly @@ -1,6 +1,4 @@ { - { cis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 7↓" }}[ b8^\markup { \pad-markup #0.2 "+10"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↓" }}] ais8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}[ gis8^\markup { \pad-markup #0.2 "+48"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↑" }}] ais4^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }} c'4^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }} ~ } - \bar "|" - { c'1} + { cis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< II"\normal-size-super " 5↓" }}[ b8^\markup { \pad-markup #0.2 "+10"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↓" }} ] ais8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }} [ gis8^\markup { \pad-markup #0.2 "+48"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↑" }}] ais4^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }} c'2^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }} } \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/567a9375/lilypond/part_III.ly b/resources/string_quartet_3_rise/567a9375/lilypond/part_III.ly index 1098871..d6e4887 100644 --- a/resources/string_quartet_3_rise/567a9375/lilypond/part_III.ly +++ b/resources/string_quartet_3_rise/567a9375/lilypond/part_III.ly @@ -1,6 +1,5 @@ { - { d4^\markup { \pad-markup #0.2 "+30"} f4^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }} e8^\markup { \pad-markup #0.2 "+8"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 11↓" }}[ dis8^\markup { \pad-markup #0.2 "-42"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }}] f4^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }} } - \bar "|" - { g8^\markup { \pad-markup #0.2 "-35"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 3↑" }}[ gis8^\markup { \pad-markup #0.2 "+21"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 13↓" }}] ~ gis2.} + { d4^\markup { \pad-markup #0.2 "+30"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< I"\normal-size-super " 1↑" }} f4^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }} e8^\markup { \pad-markup #0.2 "+8"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 11↓" }}[ dis8^\markup { \pad-markup #0.2 "-42"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }}] f4^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }} } + { g8^\markup { \pad-markup #0.2 "-35"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 3↑" }}[ gis8^\markup { \pad-markup #0.2 "+21"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 13↓" }}] } \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/567a9375/lilypond/part_IV.ly b/resources/string_quartet_3_rise/567a9375/lilypond/part_IV.ly index 4b11c42..2ee0a1e 100644 --- a/resources/string_quartet_3_rise/567a9375/lilypond/part_IV.ly +++ b/resources/string_quartet_3_rise/567a9375/lilypond/part_IV.ly @@ -1,6 +1,5 @@ { - { ais,2.^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }} c8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}[ cis8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↓" }}] ~ } - \bar "|" - { cis8[ d8^\markup { \pad-markup #0.2 "-5"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 7↓" }}] ~ d2.} + { ais,2.^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< II"\normal-size-super " 3↓" }} c8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}[ cis8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↓" }}] ~ } + { cis8[ d8^\markup { \pad-markup #0.2 "-5"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 7↓" }}] } \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3/4ff624b0/4ff624b0_code.scd b/resources/string_quartet_3_rise/5ededd80/5ededd80_code.scd similarity index 96% rename from resources/string_quartet_3/4ff624b0/4ff624b0_code.scd rename to resources/string_quartet_3_rise/5ededd80/5ededd80_code.scd index 0d8c24b..d8f0e14 100644 --- a/resources/string_quartet_3/4ff624b0/4ff624b0_code.scd +++ b/resources/string_quartet_3_rise/5ededd80/5ededd80_code.scd @@ -172,7 +172,7 @@ genDurFunc = {arg chordProb, minPad, maxPad, minDur, maxDur, envData, seed; var env, pTable, durFunc; env = Env.pairs([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).asSignal(256).asList.asArray; pTable = env.asRandomTable; - [chordProb, minPad, maxPad, minDur, maxDur, envData].postln; + //[chordProb, minPad, maxPad, minDur, maxDur, envData].postln; durFunc = {arg allowChord, pad = false; var res; res = if(allowChord.not, { @@ -189,7 +189,7 @@ genDurFunc = {arg chordProb, minPad, maxPad, minDur, maxDur, envData, seed; genStepFunc = {arg minStep, maxStep, envData, seed; var envDataNorm, env, pTable, stepFunc; - [minStep, maxStep, envData].postln; + //[minStep, maxStep, envData].postln; envDataNorm = ([[0, 0]] ++ envData.clump(2) ++ [[1, 0]]).flop; envDataNorm = [envDataNorm[0].normalize(minStep, maxStep), envDataNorm[1]].flop; env = Env.pairs(envDataNorm); @@ -203,13 +203,21 @@ genOrders = {arg minMotifLength = 1, maxMotifLength = 5, minProgLength = 0, maxP ((maxMotifLength.asInteger - minMotifLength.asInteger).rand + minMotifLength.asInteger).collect({ var noProgIns, noSusIns, noSilentIns, prog, sus, silent, order; noSusIns = [1, 2, 3].wchoose(susWeights.normalizeSum); + //noProgIns = (popSize - noSusIns).rand + 1; noProgIns = (popSize - noSusIns); noSilentIns = popSize - noSusIns - noProgIns; + /* + noSilentIns = (popSize - noSusIns).rand.clip(0, 1); + noProgIns = popSize - noSusIns - noSilentIns; + */ + # prog, sus, silent = (0..(popSize-1)).scramble.clumps([noProgIns, noSusIns, noSilentIns]); prog = (prog.scramble ++ ((maxProgLength.asInteger - minProgLength.asInteger).rand + minProgLength.asInteger).collect({prog.choose}).scramble); + //prog = ((maxProgLength.asInteger - minProgLength.asInteger).rand + minProgLength.asInteger).collect({prog.choose}); + if(silent == nil, {silent = []}); [sus.scramble, prog, silent.scramble] }); @@ -222,14 +230,14 @@ updateVoices = {arg ins, sus; candidates = sus.collect({arg v; tuples.collect({arg t; voices[v] + t})}).flatten; candidates = difference(candidates.asSet, voices.asSet).asList; + //candidates.select({arg item; (item ++ voices).asSet.size >= 4}); nProbs = candidates.collect({arg candidate; var stepScore, recentlySoundedScore, isInRangeScore, regScore, hdScore; //stepScore = intervalScore.value(voices[ins], candidate, 30, 400, 0.1); stepScore = intervalScore.value(voices[ins], candidate, 100, 100); recentlySoundedScore = inclusionScore.value(lastXChanges.flop[ins], candidate, 0.01); - - + //recentlySoundedScore = inclusionScore.value(lastXChanges.flatten.collect({arg item; item.drop(1)}), candidate.drop(1), 0.01); /* if(rangeScore.value(candidate.collect({0}), voices[ins], ranges[ins][1] - 500, ranges[ins][1], 0, true) == 1, { @@ -261,10 +269,13 @@ updateVoices = {arg ins, sus; nProbs = nProbs.flop.select({arg scores, s; nWeights[s] != 0}).flop; nWeights = nWeights.select({arg weight; weight != 0}); nProbs = nProbs.flop.collect({arg scores, s; - if(scores.sum == 0, {scores}, {scores.normalizeSum * nWeights[s]}) + if(scores.sum == 0, {scores}, {scores.normalizeSum * nWeights[s]}).postln; }); nProbs = nProbs.flop.collect({arg scores, s; scores.product}).normalizeSum; + nProbs.round(0.001).postln; + [candidates, nProbs.round(0.001)].flop.postln; + sel = candidates.wchoose(nProbs); voices[ins] = sel; @@ -316,6 +327,7 @@ genSubMotif = {arg order, orderIndex, lastState, repeatLast = false, startFromLa }); // pad ending + /* if(orderIndex == (orders.size - 1), { (0..(popSize-1)).scramble.do({arg ins; if(res.last.first[ins] != ["Rest"], { @@ -328,6 +340,7 @@ genSubMotif = {arg order, orderIndex, lastState, repeatLast = false, startFromLa }); }); }); + */ //format and return if(startFromLast, {lastXChanges = lastXChangesHold.deepCopy}); @@ -350,7 +363,8 @@ genMotif = { orders.do({arg order, o; var lastState, subMotif; - lastState = if(o == 0, {popSize.collect({["Rest"]})}, {motif.last.last.first}); + //lastState = if(o == 0, {popSize.collect({["Rest"]})}, {motif.last.last.first}); + lastState = if(o == 0, {lastXChanges.last.deepCopy}, {motif.last.last.first}); subMotif = genSubMotif.value(order, o, lastState, isLastOrder: o == (orders.size - 1)); motif = motif.add(subMotif); @@ -362,10 +376,12 @@ genMotif = { }); //round last duration to measure + /* fDur = fSeq.flatten.flatten.slice(nil, 1).sum; durAdd = fDur.round(4) - fDur; if(durAdd < 0, {durAdd = 4 - durAdd}); fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] = fSeq[0][orders.size - 1][fSeq[0][orders.size - 1].size - 1][1] + durAdd; + */ fSeq }; @@ -411,11 +427,12 @@ Event.addEventType(\osc, { genPatterns = {arg inSeq, addr, oneShot = false; var voices, durs, pbinds, res, indices, sectionDurs, msg, ids, seq; seq = inSeq.collect({arg mSeq; mSeq[0]}); - # voices, durs = seq.flatten2(seq.maxDepth - 5).flop; + //# voices, durs = seq.flatten2(seq.maxDepth - 5).flop; + # voices, durs = seq.flatten2(if(oneShot, {2}, {3})).flop; pbinds = voices.flop.collect({arg voice, v; var clumps, hdScores, freqs, fDurs, attacks, rels, amps; clumps = voice.separate({arg a, b; a != b }); - freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(60.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); + freqs = clumps.collect({arg clump; if(clump[0] != ["Rest"], {(62.midicps * hsArrayToFreq.value(clump[0]))}, {Rest(0)})}); fDurs = durs.clumps(clumps.collect({arg clump; clump.size})).collect({arg clump; clump.sum}); //attacks = 2.collect({rrand(1, 3)}) ++ freqs.drop(2).collect({rrand(0.3, 0.5)}); attacks = fDurs.collect({arg dur; dur * rrand(0.2, 0.4)}); @@ -452,7 +469,7 @@ genPatterns = {arg inSeq, addr, oneShot = false; if(oneShot.not, { msg = inSeq.collect({arg mSeq, m; mSeq[1..]}); //ids = inSeq.collect({arg mSeq, m; mSeq[2]}); - sectionDurs = seq.collect({arg mSeq; mSeq.flatten2(mSeq.maxDepth - 5).flop[1].sum}); + sectionDurs = seq.collect({arg mSeq; mSeq.flatten2(2).flop[1].sum}); pbinds = pbinds ++ [ Pbind( @@ -843,6 +860,8 @@ OSCdef(\transport, {arg msg, time, addr, port; }, { // the cued sequence can now be read from file, so this can be cleaned up var cSize, patterns, pSeq, cuedSeek, indexStart, indexEnd, tmpLedger; + group.freeAllMsg; + //group = Group.new; if(msg[1] == 1, { pSeq = []; cuedSeek = (seq != nil); diff --git a/resources/string_quartet_3_rise/5ededd80/5ededd80_mus_model.json b/resources/string_quartet_3_rise/5ededd80/5ededd80_mus_model.json new file mode 100644 index 0000000..c740609 --- /dev/null +++ b/resources/string_quartet_3_rise/5ededd80/5ededd80_mus_model.json @@ -0,0 +1,54 @@ +{ +"music_data": +[ + [ + [ + [ [ [ -6, 4, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 3, -1, 2 ], [ -4, 3, 2, 2, -1, 2 ] ], 0.25 ], + [ [ [ -5, 2, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 3 ], [ -4, 3, 1, 2, 0, 2 ] ], 0.25 ], + + [ [ [ -6, 4, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -4, 3, 1, 2, 0, 2 ] ], 0.25 ], + [ [ [ -6, 4, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, 0, 2 ], [ -4, 4, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -7, 4, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 3, 2, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 3 ] ], 0.25 ], + [ [ [ -7, 4, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -4, 3, 1, 3, -1, 2 ] ], 0.25 ], + [ [ [ -6, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -3, 3, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -6, 3, 1, 2, -1, 2 ], [ "Rest" ], [ -5, 3, 1, 2, -1, 2 ], [ -3, 3, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -6, 3, 1, 2, -1, 2 ], [ "Rest" ], [ -5, 3, 1, 2, -1, 2 ], [ -3, 3, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ "Rest" ], [ "Rest" ], [ -5, 3, 1, 2, -1, 2 ], [ -3, 3, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ "Rest" ], [ "Rest" ], [ -5, 3, 1, 2, -1, 2 ], [ -3, 3, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ "Rest" ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 1.5 ], + [ [ [ "Rest" ], [ "Rest" ], [ "Rest" ], [ "Rest" ] ], 2.25 ] + ] + ] +], +"last_changes": +[ + [ [ -4, 2, 1, 3, -1, 2 ], [ -4, 2, 0, 2, -1, 2 ], [ -3, 2, 1, 2, -1, 2 ], [ -3, 1, 1, 2, -1, 2 ] ], + [ [ -4, 2, 1, 3, -1, 2 ], [ -4, 2, 0, 2, -1, 2 ], [ -3, 2, 1, 2, -1, 2 ], [ -4, 2, 2, 2, -1, 2 ] ], + [ [ -3, 2, 0, 2, -1, 2 ], [ -4, 2, 0, 2, -1, 2 ], [ -3, 2, 1, 2, -1, 2 ], [ -4, 2, 2, 2, -1, 2 ] ], + [ [ -3, 2, 0, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -3, 2, 1, 2, -1, 2 ], [ -4, 2, 2, 2, -1, 2 ] ], + [ [ -4, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -3, 2, 1, 2, -1, 2 ], [ -4, 2, 2, 2, -1, 2 ] ] +], +"cur_uid": "5ededd80", +"ref_uid": "536cac90", +"order_seed": 445563, +"dur_seed": 232539, +"motifs_seed": 702074, +"entrances_probs_vals": [ 0.78, 0, 0, 0, 1.02, 0.0098039215686275, 0, 0.20915032679739, 0, 0.24183006535948, 0.82432432432432, 0.28758169934641, 0, 1, 0 ], +"passages_probs_vals": [ 0.78, 0, 0, 0, 1.02, 0.0098039215686275, 0, 0.20915032679739, 0, 0.24183006535948, 0.82432432432432, 0.28758169934641, 0, 1, 0 ], +"exits_probs_vals": [ 0.78, 0, 0, 0, 1.02, 0.0098039215686275, 0, 0.20915032679739, 0, 0.24183006535948, 0.82432432432432, 0.28758169934641, 0, 1, 0 ], +"ranges": [ [ -2400, 1200 ], [ -1200, 1453 ], [ -702, 1694 ], [ -702, 1973 ] ], +"step_probs_vals": [ -1200, 1200, 0, 0, 0.41358024691358, 0.0056818181818177, 0.45884773662551, 0.5, 0.52057613168724, 0, 0.56378600823045, 0.85795454545455, 0.60082304526749, 0, 1, 0 ], +"passages_weights": [ 1, 0.15, 0.43, 1, 1 ], +"hd_exp": 10, +"hd_invert": 0, +"order": +[ + [ [ 2 ], [ 3, 0, 1, 1, 3, 0, 1 ], [ ] ], + [ [ 2 ], [ 3, 0, 1, 0 ], [ ] ] +], +"sus_weights": [ 0.7, 0, 0 ], +"order_size": [ 2, 2.0102040816327 ], +"passages_size": [ 0, 6 ], +"motif_edited": "true", +"order_edited": "false" +} \ No newline at end of file diff --git a/resources/string_quartet_3_rise/5ededd80/lilypond/part_I.ly b/resources/string_quartet_3_rise/5ededd80/lilypond/part_I.ly new file mode 100644 index 0000000..f805aa2 --- /dev/null +++ b/resources/string_quartet_3_rise/5ededd80/lilypond/part_I.ly @@ -0,0 +1,5 @@ +{ + \time 2/2 + { cis''8^\markup { \pad-markup #0.2 "+46"}_\markup { \lower #3 \pad-markup #0.2 \concat{ ""\normal-size-super " 5↑" }}[ dis''8^\markup { \pad-markup #0.2 "+11"}_\markup { \lower #3 \pad-markup #0.2 \concat{ ""\normal-size-super " 11↑" }}] ~ dis''8[ f''8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ ""\normal-size-super " 1↑" }}] fis''8^\markup { \pad-markup #0.2 "+0"}_\markup { \lower #3 \pad-markup #0.2 \concat{ ""\normal-size-super " 13↑" }}[ g''8^\markup { \pad-markup #0.2 "+28"}_\markup { \lower #3 \pad-markup #0.2 \concat{ ""\normal-size-super " 7↑" }}] ais''4^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ ""\normal-size-super " 1↑" }} ~ } +\bar "|." +} \ No newline at end of file diff --git a/resources/string_quartet_3_rise/5ededd80/lilypond/part_II.ly b/resources/string_quartet_3_rise/5ededd80/lilypond/part_II.ly new file mode 100644 index 0000000..4495835 --- /dev/null +++ b/resources/string_quartet_3_rise/5ededd80/lilypond/part_II.ly @@ -0,0 +1,4 @@ +{ + { g'8^\markup { \pad-markup #0.2 "+28"}_\markup { \lower #3 \pad-markup #0.2 \concat{ ""\normal-size-super " 7↑" }}[ fis'8^\markup { \pad-markup #0.2 "+0"}_\markup { \lower #3 \pad-markup #0.2 \concat{ ""\normal-size-super " 13↑" }}] f'8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ ""\normal-size-super " 3↑" }}[ dis'8^\markup { \pad-markup #0.2 "+11"}_\markup { \lower #3 \pad-markup #0.2 \concat{ ""\normal-size-super " 11↑" }}] cis'8^\markup { \pad-markup #0.2 "+46"}_\markup { \lower #3 \pad-markup #0.2 \concat{ ""\normal-size-super " 5↑" }}[ c'8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ ""\normal-size-super " 3↑" }}] ais4^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }} ~ } +\bar "||" +} \ No newline at end of file diff --git a/resources/string_quartet_3_rise/5ededd80/lilypond/part_III.ly b/resources/string_quartet_3_rise/5ededd80/lilypond/part_III.ly new file mode 100644 index 0000000..a9b05e8 --- /dev/null +++ b/resources/string_quartet_3_rise/5ededd80/lilypond/part_III.ly @@ -0,0 +1,4 @@ +{ + { g1^\markup { \pad-markup #0.2 "-38"} } +\bar "||" +} \ No newline at end of file diff --git a/resources/string_quartet_3_rise/5ededd80/lilypond/part_IV.ly b/resources/string_quartet_3_rise/5ededd80/lilypond/part_IV.ly new file mode 100644 index 0000000..e81d92e --- /dev/null +++ b/resources/string_quartet_3_rise/5ededd80/lilypond/part_IV.ly @@ -0,0 +1,4 @@ +{ + { f8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ ""\normal-size-super " 3↑" }}[ dis8^\markup { \pad-markup #0.2 "-42"}_\markup { \lower #3 \pad-markup #0.2 \concat{ ""\normal-size-super " 3↓" }}] f4^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ ""\normal-size-super " 3↑" }} f,4^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ ""\normal-size-super " 3↑" }} ais,4^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ ""\normal-size-super " 1↑" }} ~ } +\bar "|." +} \ No newline at end of file diff --git a/resources/string_quartet_3_rise/5ef20586/5ef20586_mus_model.json b/resources/string_quartet_3_rise/5ef20586/5ef20586_mus_model.json index bee7f3b..2e25b90 100644 --- a/resources/string_quartet_3_rise/5ef20586/5ef20586_mus_model.json +++ b/resources/string_quartet_3_rise/5ef20586/5ef20586_mus_model.json @@ -3,29 +3,29 @@ [ [ [ - [ [ [ -6, 4, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -6, 4, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -4, 3, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -4, 3, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -4, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -4, 3, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -3, 4, 1, 1, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -4, 3, 1, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -3, 4, 1, 1, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -4, 3, 1, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] + [ [ [ -5, 4, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -6, 4, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -5, 4, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 3, -1, 2 ], [ -6, 4, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -5, 4, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 3, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -5, 4, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -4, 4, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -5, 4, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -3, 4, 1, 1, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -5, 4, 1, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -3, 4, 1, 1, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -5, 4, 1, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ] ], [ - [ [ [ -4, 3, 1, 2, -1, 2 ], [ -5, 3, 2, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -4, 3, 1, 2, -1, 2 ], [ -5, 3, 2, 2, -1, 2 ], [ -6, 4, 2, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -4, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -6, 4, 2, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] + [ [ [ -5, 4, 1, 2, -1, 2 ], [ -5, 3, 2, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -5, 4, 1, 2, -1, 2 ], [ -5, 3, 2, 2, -1, 2 ], [ -5, 4, 2, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -5, 4, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 2, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ] ], [ - [ [ [ -4, 3, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -4, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -4, 3, 1, 2, -1, 2 ], [ -6, 4, 2, 2, -1, 2 ], [ -4, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -5, 4, 2, 2, -1, 2 ], [ -6, 4, 2, 2, -1, 2 ], [ -4, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] + [ [ [ -5, 4, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -4, 4, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -5, 4, 1, 2, -1, 2 ], [ -6, 4, 2, 2, -1, 2 ], [ -4, 4, 1, 2, -1, 2 ], [ -4, 3, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -5, 4, 1, 2, -1, 2 ], [ -6, 4, 2, 2, -1, 2 ], [ -4, 4, 1, 2, -1, 2 ], [ -5, 4, 2, 2, -1, 2 ] ], 0.25 ] ], [ - [ [ [ -5, 4, 1, 2, 0, 2 ], [ -6, 4, 2, 2, -1, 2 ], [ -4, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -5, 4, 1, 2, 0, 2 ], [ -6, 4, 1, 2, 0, 2 ], [ -4, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -5, 4, 1, 2, 0, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -4, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -5, 5, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -4, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] + [ [ [ -5, 4, 1, 2, -1, 2 ], [ -6, 4, 2, 2, -1, 2 ], [ -4, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, 0, 2 ] ], 0 ], + [ [ [ -5, 4, 1, 2, -1, 2 ], [ -6, 4, 1, 2, 0, 2 ], [ -4, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, 0, 2 ] ], 0.25 ], + [ [ [ -5, 4, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -4, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, 0, 2 ] ], 0 ], + [ [ [ -5, 4, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -4, 4, 1, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ] ], 0.25 ] ] ] ], diff --git a/resources/string_quartet_3_rise/5ef20586/lilypond/part_I.ly b/resources/string_quartet_3_rise/5ef20586/lilypond/part_I.ly index 07fa029..d11e1ac 100644 --- a/resources/string_quartet_3_rise/5ef20586/lilypond/part_I.ly +++ b/resources/string_quartet_3_rise/5ef20586/lilypond/part_I.ly @@ -1,6 +1,6 @@ { - { f'1^\markup { \pad-markup #0.2 "-38"} ~ } - \bar "|" - { f'1} + { ais'2.^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< I"\normal-size-super " 3↓" }} ~ ais'8[ gis'8^\markup { \pad-markup #0.2 "+48"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↑" }}] } + { ais'8^\markup { \pad-markup #0.2 "+13"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 11↑" }}[ c''8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↑" }}] } \bar "||" +\break } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/5ef20586/lilypond/part_II.ly b/resources/string_quartet_3_rise/5ef20586/lilypond/part_II.ly index 5701ebe..ccdb9b3 100644 --- a/resources/string_quartet_3_rise/5ef20586/lilypond/part_II.ly +++ b/resources/string_quartet_3_rise/5ef20586/lilypond/part_II.ly @@ -1,6 +1,5 @@ { - { d''8^\markup { \pad-markup #0.2 "+30"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 7↑" }}[ f''8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}] g''8^\markup { \pad-markup #0.2 "-7"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↓" }}[ ais8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] gis4^\markup { \pad-markup #0.2 "+48"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↑" }} f''4^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }} ~ } - \bar "|" - { f''1} + { d''8^\markup { \pad-markup #0.2 "+30"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< I"\normal-size-super " 7↑" }}[ f''8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] g''8^\markup { \pad-markup #0.2 "-7"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 7↓" }}[ ais'8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}] gis'4^\markup { \pad-markup #0.2 "+48"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↑" }} f''2^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }} } + \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/5ef20586/lilypond/part_III.ly b/resources/string_quartet_3_rise/5ef20586/lilypond/part_III.ly index 3195a24..f1cb2cc 100644 --- a/resources/string_quartet_3_rise/5ef20586/lilypond/part_III.ly +++ b/resources/string_quartet_3_rise/5ef20586/lilypond/part_III.ly @@ -1,6 +1,6 @@ { - { cis'4^\markup { \pad-markup #0.2 "-25"} d'4^\markup { \pad-markup #0.2 "+30"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↑" }} cis'8^\markup { \pad-markup #0.2 "+46"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↑" }}[ ais8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] ~ ais8[ gis8^\markup { \pad-markup #0.2 "+48"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 5↑" }}] } - \bar "|" - { ais8^\markup { \pad-markup #0.2 "+13"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}[ c'8^\markup { \pad-markup #0.2 "-37"}] ~ c'2.} + { cis'4^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< II"\normal-size-super " 1↑" }} d'4^\markup { \pad-markup #0.2 "+30"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 7↑" }} cis'8^\markup { \pad-markup #0.2 "+46"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }}[ ais8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}] ~ ais8[ gis8^\markup { \pad-markup #0.2 "+48"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↑" }}] } + + { ais8^\markup { \pad-markup #0.2 "+13"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 11↑" }}[ c'8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↑" }}]} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/5ef20586/lilypond/part_IV.ly b/resources/string_quartet_3_rise/5ef20586/lilypond/part_IV.ly index 2385283..a2aad51 100644 --- a/resources/string_quartet_3_rise/5ef20586/lilypond/part_IV.ly +++ b/resources/string_quartet_3_rise/5ef20586/lilypond/part_IV.ly @@ -1,6 +1,6 @@ { - { ais'2.^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }} ~ ais'8[ gis'8^\markup { \pad-markup #0.2 "+48"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}] } - \bar "|" - { ais'8^\markup { \pad-markup #0.2 "+13"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 11↑" }}[ c''8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}] ~ c''2.} + { f'2^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< I"\normal-size-super " 1↑" }} ~ } + + { f'2.} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/5f0075ab/5f0075ab_mus_model.json b/resources/string_quartet_3_rise/5f0075ab/5f0075ab_mus_model.json index 11843ff..59ba63a 100644 --- a/resources/string_quartet_3_rise/5f0075ab/5f0075ab_mus_model.json +++ b/resources/string_quartet_3_rise/5f0075ab/5f0075ab_mus_model.json @@ -19,7 +19,7 @@ [ [ [ [ -6, 4, 1, 1, -1, 2 ], [ -5, 4, 2, 1, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], [ [ [ -6, 4, 1, 1, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -7, 4, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] + [ [ [ -6, 4, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] ], [ [ [ [ -5, 3, 0, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], diff --git a/resources/string_quartet_3_rise/5f0075ab/lilypond/part_I.ly b/resources/string_quartet_3_rise/5f0075ab/lilypond/part_I.ly index 07fa029..d0aefbb 100644 --- a/resources/string_quartet_3_rise/5f0075ab/lilypond/part_I.ly +++ b/resources/string_quartet_3_rise/5f0075ab/lilypond/part_I.ly @@ -1,6 +1,5 @@ { - { f'1^\markup { \pad-markup #0.2 "-38"} ~ } - \bar "|" - { f'1} + { f'2^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< III"\normal-size-super " 1↑" }} ~ } + { f'2.} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/5f0075ab/lilypond/part_II.ly b/resources/string_quartet_3_rise/5f0075ab/lilypond/part_II.ly index 775b507..5e0b680 100644 --- a/resources/string_quartet_3_rise/5f0075ab/lilypond/part_II.ly +++ b/resources/string_quartet_3_rise/5f0075ab/lilypond/part_II.ly @@ -1,6 +1,4 @@ { - { c''8^\markup { \pad-markup #0.2 "-37"}[ ais'8^\markup { \pad-markup #0.2 "+13"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 11↑" }}] g'8^\markup { \pad-markup #0.2 "-7"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}[ gis'8^\markup { \pad-markup #0.2 "+48"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }}] ais'4^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }} c''8^\markup { \pad-markup #0.2 "-37"}[ cis''8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }}] ~ } - \bar "|" - { cis''1} + { c''8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< I"\normal-size-super " 1↑" }}[ ais'8^\markup { \pad-markup #0.2 "+13"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 11↑" }} ] g'8^\markup { \pad-markup #0.2 "-7"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }} [ gis'8^\markup { \pad-markup #0.2 "+48"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }}] ais'4^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }} c''8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }} cis''4.^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }} } \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/5f0075ab/lilypond/part_III.ly b/resources/string_quartet_3_rise/5f0075ab/lilypond/part_III.ly index 46fcd27..3db9246 100644 --- a/resources/string_quartet_3_rise/5f0075ab/lilypond/part_III.ly +++ b/resources/string_quartet_3_rise/5f0075ab/lilypond/part_III.ly @@ -1,6 +1,6 @@ { - { g4^\markup { \pad-markup #0.2 "-7"} ~ g8[ gis8^\markup { \pad-markup #0.2 "+48"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}] ~ gis8[ ais8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}] b8^\markup { \pad-markup #0.2 "-21"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↑" }}[ cis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}] } - \bar "|" - { ais8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↑" }}[ c'8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}] ~ c'2.} + { g4^\markup { \pad-markup #0.2 "-7"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 7↓" }} ~ g8[ gis8^\markup { \pad-markup #0.2 "+48"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }}] ~ gis8[ ais8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}] b8^\markup { \pad-markup #0.2 "-21"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↑" }}[ cis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }}] } + + { ais8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }}[ c'8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}] } \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/5f0075ab/lilypond/part_IV.ly b/resources/string_quartet_3_rise/5f0075ab/lilypond/part_IV.ly index a3fcbc8..b3e4c71 100644 --- a/resources/string_quartet_3_rise/5f0075ab/lilypond/part_IV.ly +++ b/resources/string_quartet_3_rise/5f0075ab/lilypond/part_IV.ly @@ -1,6 +1,5 @@ { - { f,4^\markup { \pad-markup #0.2 "-38"} g,2^\markup { \pad-markup #0.2 "-7"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }} ~ g,8[ f,8^\markup { \pad-markup #0.2 "-38"}] } - \bar "|" - { fis8^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↓" }}[ f8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}] ~ f2.} + { f,4^\markup { \pad-markup #0.2 "-38"} g,2^\markup { \pad-markup #0.2 "-7"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }} ~ g,8[ f8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}] } + { fis8^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 3↓" }}[ f8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}] } \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/61207e49/61207e49_mus_model.json b/resources/string_quartet_3_rise/61207e49/61207e49_mus_model.json index 55a3e7c..f28e746 100644 --- a/resources/string_quartet_3_rise/61207e49/61207e49_mus_model.json +++ b/resources/string_quartet_3_rise/61207e49/61207e49_mus_model.json @@ -3,95 +3,95 @@ [ [ [ - [ [ [ -6, 6, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -6, 6, -1, 1, -2, 2 ], [ -4, 6, -2, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -6, 6, -1, 1, -2, 2 ], [ -5, 6, -1, 2, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -6, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0.25 ] + [ [ [ -6, 6, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -6, 6, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ], [ -4, 6, -2, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -6, 6, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ], [ -5, 6, -1, 2, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -6, 6, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ] ], 0.25 ] ], [ - [ [ [ -6, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -5, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -5, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -5, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 6, -2, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -5, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -5, 6, -1, 2, -2, 2 ], [ -3, 6, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -5, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 2 ] ], 0.25 ] + [ [ [ -6, 6, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ] ], 0 ], + [ [ [ -5, 6, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ] ], 0 ], + [ [ [ -5, 6, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -5, 6, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -3, 6, -2, 1, -2, 2 ] ], 0.25 ], + [ [ [ -5, 6, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 2, -2, 2 ] ], 0.25 ], + [ [ [ -5, 6, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ] ], 0.25 ] ], [ - [ [ [ -5, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -5, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 3 ], [ -5, 7, -1, 1, -2, 2 ] ], 0.25 ] + [ [ [ -5, 6, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ] ], 0 ], + [ [ [ -5, 6, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 3 ] ], 0.25 ] ], [ - [ [ [ -5, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -5, 6, -1, 1, -2, 2 ], [ -5, 8, -1, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -6, 8, -1, 1, -2, 2 ], [ -5, 8, -1, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -5, 7, -2, 1, -2, 2 ], [ -5, 8, -1, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -5, 7, -2, 1, -2, 2 ], [ -4, 7, -2, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -5, 7, -2, 1, -2, 2 ], [ -5, 7, -1, 2, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -5, 7, -2, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 3 ], [ -4, 7, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ] ], 0.25 ] + [ [ [ -5, 6, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ] ], 0 ], + [ [ [ -5, 6, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -5, 8, -1, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ] ], 0 ], + [ [ [ -6, 8, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -5, 8, -1, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -5, 7, -2, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -5, 8, -1, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ] ], 0 ], + [ [ [ -5, 7, -2, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -4, 7, -2, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -5, 7, -2, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -5, 7, -1, 2, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -5, 7, -2, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 3 ], [ -4, 7, -1, 1, -2, 2 ] ], 0.25 ] ], [ - [ [ [ -5, 7, -2, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -5, 7, -2, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -3, 7, -1, 0, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -6, 8, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -3, 7, -1, 0, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -6, 8, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 7, 0, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -6, 8, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -5, 8, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -6, 8, -1, 1, -2, 2 ], [ -5, 7, 0, 1, -2, 2 ], [ -5, 8, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -6, 8, -1, 1, -2, 2 ], [ -5, 7, 0, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 3 ], [ -5, 7, -1, 1, -2, 2 ] ], 0.25 ] + [ [ [ -5, 7, -2, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -5, 7, -2, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 7, -1, 0, -2, 2 ] ], 0 ], + [ [ [ -6, 8, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 7, -1, 0, -2, 2 ] ], 0.25 ], + [ [ [ -6, 8, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -5, 7, 0, 1, -2, 2 ] ], 0.25 ], + [ [ [ -6, 8, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -5, 8, -1, 1, -2, 2 ] ], 0 ], + [ [ [ -6, 8, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -5, 7, 0, 1, -2, 2 ], [ -5, 8, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -6, 8, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -5, 7, 0, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 3 ] ], 0.25 ] ], [ - [ [ [ -6, 8, -1, 1, -2, 2 ], [ -6, 8, -1, 1, -2, 3 ], [ -5, 7, -1, 1, -2, 3 ], [ -5, 7, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -6, 8, -1, 1, -2, 2 ], [ -6, 8, -1, 1, -2, 3 ], [ -5, 8, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -6, 8, -1, 1, -2, 2 ], [ -6, 9, -1, 1, -2, 2 ], [ -5, 8, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ] ], 0.25 ] + [ [ [ -6, 8, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -6, 8, -1, 1, -2, 3 ], [ -5, 7, -1, 1, -2, 3 ] ], 0 ], + [ [ [ -6, 8, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -6, 8, -1, 1, -2, 3 ], [ -5, 8, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -6, 8, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -6, 9, -1, 1, -2, 2 ], [ -5, 8, -1, 1, -2, 2 ] ], 0.25 ] ], [ - [ [ [ -6, 8, -1, 1, -2, 2 ], [ -6, 9, -1, 1, -2, 2 ], [ -4, 7, -2, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -6, 8, -1, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 1 ], [ -4, 7, -2, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -5, 7, -2, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 1 ], [ -4, 7, -2, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ] ], 0.25 ] + [ [ [ -6, 8, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -6, 9, -1, 1, -2, 2 ], [ -4, 7, -2, 1, -2, 2 ] ], 0 ], + [ [ [ -6, 8, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 1 ], [ -4, 7, -2, 1, -2, 2 ] ], 0 ], + [ [ [ -5, 7, -2, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 1 ], [ -4, 7, -2, 1, -2, 2 ] ], 0.25 ] ], [ - [ [ [ -6, 7, -1, 1, -1, 2 ], [ -4, 7, -1, 1, -2, 1 ], [ -4, 7, -2, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -6, 7, -1, 1, -1, 2 ], [ -5, 7, -1, 1, -1, 2 ], [ -4, 7, -2, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -6, 7, -1, 1, -1, 2 ], [ -5, 8, -1, 1, -2, 2 ], [ -4, 7, -2, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -5, 6, -1, 1, -2, 2 ], [ -5, 8, -1, 1, -2, 2 ], [ -4, 7, -2, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ] ], 0.25 ] + [ [ [ -6, 7, -1, 1, -1, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 1 ], [ -4, 7, -2, 1, -2, 2 ] ], 0 ], + [ [ [ -6, 7, -1, 1, -1, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -1, 2 ], [ -4, 7, -2, 1, -2, 2 ] ], 0.25 ], + [ [ [ -6, 7, -1, 1, -1, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -5, 8, -1, 1, -2, 2 ], [ -4, 7, -2, 1, -2, 2 ] ], 0 ], + [ [ [ -5, 6, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -5, 8, -1, 1, -2, 2 ], [ -4, 7, -2, 1, -2, 2 ] ], 0.25 ] ], [ - [ [ [ -5, 6, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 1 ], [ -4, 7, -2, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -5, 6, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 1 ], [ -4, 7, -2, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 3 ] ], 0 ], - [ [ [ -5, 6, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 1 ], [ -3, 5, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 3 ] ], 0.25 ], - [ [ [ -5, 6, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 1 ], [ -4, 7, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 3 ] ], 0 ], - [ [ [ -5, 6, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 1 ], [ -4, 7, -1, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ] ], 0.25 ], - [ [ [ -5, 6, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 1 ], [ -3, 6, -2, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ] ], 0.25 ], - [ [ [ -5, 6, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ], [ -3, 6, -2, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ] ], 0.25 ] + [ [ [ -5, 6, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 1 ], [ -4, 7, -2, 1, -2, 2 ] ], 0 ], + [ [ [ -5, 6, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 3 ], [ -3, 6, -1, 1, -2, 1 ], [ -4, 7, -2, 1, -2, 2 ] ], 0 ], + [ [ [ -5, 6, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 3 ], [ -3, 6, -1, 1, -2, 1 ], [ -3, 5, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -5, 6, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 3 ], [ -3, 6, -1, 1, -2, 1 ], [ -4, 7, -1, 1, -2, 2 ] ], 0 ], + [ [ [ -5, 6, -1, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 1 ], [ -4, 7, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -5, 6, -1, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 1 ], [ -3, 6, -2, 1, -2, 2 ] ], 0.25 ], + [ [ [ -5, 6, -1, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ], [ -3, 6, -2, 1, -2, 2 ] ], 0.25 ] ], [ - [ [ [ -5, 6, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -3, 2 ], [ -5, 6, 0, 1, -2, 2 ] ], 0.25 ] + [ [ [ -5, 6, -1, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -3, 2 ] ], 0.25 ] ], [ - [ [ [ -5, 6, -1, 1, -2, 2 ], [ -4, 6, 0, 1, -2, 2 ], [ -3, 6, -1, 1, -3, 2 ], [ -5, 6, 0, 1, -2, 2 ] ], 0 ], - [ [ [ -5, 6, -1, 1, -2, 2 ], [ -4, 6, 0, 1, -2, 2 ], [ -3, 6, -1, 1, -3, 2 ], [ -4, 6, -2, 1, -3, 2 ] ], 0.25 ], - [ [ [ -5, 6, -1, 1, -2, 2 ], [ -4, 6, 0, 1, -2, 2 ], [ -3, 6, -1, 1, -3, 2 ], [ -5, 7, -1, 1, -3, 2 ] ], 0.25 ], - [ [ [ -5, 6, -1, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -3, 2 ], [ -5, 7, -1, 1, -3, 2 ] ], 0.25 ], - [ [ [ -5, 6, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -3, 2 ], [ -5, 7, -1, 1, -3, 2 ] ], 0.25 ] + [ [ [ -5, 6, -1, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -4, 6, 0, 1, -2, 2 ], [ -3, 6, -1, 1, -3, 2 ] ], 0 ], + [ [ [ -5, 6, -1, 1, -2, 2 ], [ -4, 6, -2, 1, -3, 2 ], [ -4, 6, 0, 1, -2, 2 ], [ -3, 6, -1, 1, -3, 2 ] ], 0.25 ], + [ [ [ -5, 6, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -3, 2 ], [ -4, 6, 0, 1, -2, 2 ], [ -3, 6, -1, 1, -3, 2 ] ], 0.25 ], + [ [ [ -5, 6, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -3, 2 ], [ -4, 7, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -3, 2 ] ], 0.25 ], + [ [ [ -5, 6, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -3, 2 ], [ -3, 5, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -3, 2 ] ], 0.25 ] ], [ - [ [ [ -4, 5, -1, 1, -3, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -3, 2 ], [ -5, 7, -1, 1, -3, 2 ] ], 0 ], - [ [ [ -4, 5, -1, 1, -3, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -3, 2 ], [ -5, 7, -1, 1, -3, 2 ] ], 0 ], - [ [ [ -4, 5, -1, 1, -3, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -3, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -4, 5, -1, 1, -3, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 4, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -4, 4, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 4, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -4, 4, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 4, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ] ], 0.25 ] + [ [ [ -4, 5, -1, 1, -3, 2 ], [ -5, 7, -1, 1, -3, 2 ], [ -3, 5, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -3, 2 ] ], 0 ], + [ [ [ -4, 5, -1, 1, -3, 2 ], [ -5, 7, -1, 1, -3, 2 ], [ -3, 5, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -3, 2 ] ], 0 ], + [ [ [ -4, 5, -1, 1, -3, 2 ], [ -5, 6, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -3, 2 ] ], 0.25 ], + [ [ [ -4, 5, -1, 1, -3, 2 ], [ -5, 6, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ], [ -3, 4, -1, 1, -2, 2 ] ], 0 ], + [ [ [ -4, 4, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ], [ -3, 4, -1, 1, -2, 2 ] ], 0 ], + [ [ [ -4, 4, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ], [ -3, 4, -1, 1, -2, 2 ] ], 0.25 ] ], [ - [ [ [ -5, 5, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 4, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -5, 5, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -4, 5, -1, 0, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -5, 5, 0, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -5, 6, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -4, 5, -2, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ] ], 0.25 ] + [ [ [ -5, 5, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ], [ -3, 4, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -5, 5, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0 ], + [ [ [ -4, 5, -1, 0, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -5, 5, 0, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -5, 6, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -4, 5, -2, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0.25 ] ], [ - [ [ [ -4, 5, -2, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 5, -2, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -5, 5, -1, 2, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 5, -2, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ] ], 0.25 ] + [ [ [ -4, 5, -2, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ], [ -3, 5, -2, 1, -2, 2 ] ], 0.25 ], + [ [ [ -5, 5, -1, 2, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ], [ -3, 5, -2, 1, -2, 2 ] ], 0.25 ] ] ] ], diff --git a/resources/string_quartet_3_rise/61207e49/lilypond/part_I.ly b/resources/string_quartet_3_rise/61207e49/lilypond/part_I.ly index 4059675..fdce0c4 100644 --- a/resources/string_quartet_3_rise/61207e49/lilypond/part_I.ly +++ b/resources/string_quartet_3_rise/61207e49/lilypond/part_I.ly @@ -1,14 +1,15 @@ { - { gis2^\markup { \pad-markup #0.2 "-27"} gis''2^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }} } + \time 2/2 + { cis''2^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< III"\normal-size-super " 1↑" }} dis''8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 3↑" }}[ e''8^\markup { \pad-markup #0.2 "-14"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↓" }}] f''8^\markup { \pad-markup #0.2 "+41"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 7↑" }}[ dis''8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↑" }}] } \bar "|" - { dis'1^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }} ~ } + { e''8^\markup { \pad-markup #0.2 "+13"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 13↑" }}[ dis''8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}] ~ dis''2 f'8^\markup { \pad-markup #0.2 "+6"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 7↓" }}[ g'8^\markup { \pad-markup #0.2 "-39"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↑" }}] } \bar "|" - { dis'2. ~ dis'8[ e'8^\markup { \pad-markup #0.2 "+13"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 13↑" }}] } + { ais'8^\markup { \pad-markup #0.2 "-23"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}[ b'8^\markup { \pad-markup #0.2 "+15"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 13↑" }}] ais'4^\markup { \pad-markup #0.2 "-23"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }} b'4^\markup { \pad-markup #0.2 "-12"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↓" }} ~ b'8[ cis''8^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }}] } \bar "|" - { c'2^\markup { \pad-markup #0.2 "-41"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↑" }} ais8^\markup { \pad-markup #0.2 "+35"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 5↓" }}[ a8^\markup { \pad-markup #0.2 "+23"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 3↑" }}] ~ a4 } + { dis''8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↑" }}[ e''8^\markup { \pad-markup #0.2 "-14"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↓" }}] ~ e''8[ d''8^\markup { \pad-markup #0.2 "+21"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 11↓" }}] ~ d''2 } \bar "|" - { gis8^\markup { \pad-markup #0.2 "-27"}[ cis''8^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}] ~ cis''2. ~ } - \bar "|" - { cis''1} + \time 9/8 + { g'8^\markup { \pad-markup #0.2 "+19"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 11↓" }} fis'4^\markup { \pad-markup #0.2 "-31"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 3↓" }} gis'4.^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 3↑" }} ~ gis'8 a'4^\markup { \pad-markup #0.2 "-16"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }} } +\time 2/2 \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/61207e49/lilypond/part_II.ly b/resources/string_quartet_3_rise/61207e49/lilypond/part_II.ly index 396cce5..9b0f13e 100644 --- a/resources/string_quartet_3_rise/61207e49/lilypond/part_II.ly +++ b/resources/string_quartet_3_rise/61207e49/lilypond/part_II.ly @@ -1,14 +1,12 @@ { - { cis'2^\markup { \pad-markup #0.2 "-29"} dis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↑" }}[ e'8^\markup { \pad-markup #0.2 "-14"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↓" }}] f'8^\markup { \pad-markup #0.2 "+41"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 7↑" }}[ dis''8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↑" }}] } + { dis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< I"\normal-size-super " 3↑" }}[ e'8^\markup { \pad-markup #0.2 "-14"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↓" }}] f'8^\markup { \pad-markup #0.2 "+41"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 7↑" }}[ gis'8^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] ~ gis'2 ~ } \bar "|" - { e''8^\markup { \pad-markup #0.2 "+13"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 13↑" }}[ dis''8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}] ~ dis''2 f''8^\markup { \pad-markup #0.2 "+6"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↓" }}[ g''8^\markup { \pad-markup #0.2 "-39"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }}] } + { gis'8[ ais'8^\markup { \pad-markup #0.2 "-23"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↑" }}] b'8^\markup { \pad-markup #0.2 "-12"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↓" }}[ c''8^\markup { \pad-markup #0.2 "+43"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 7↑" }}] b'8^\markup { \pad-markup #0.2 "+15"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 13↑" }}[ gis'8^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↓" }}] ~ gis'4 } \bar "|" - { ais'8^\markup { \pad-markup #0.2 "-23"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}[ b'8^\markup { \pad-markup #0.2 "+15"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 13↑" }}] ais'4^\markup { \pad-markup #0.2 "-23"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }} b'4^\markup { \pad-markup #0.2 "-12"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }} ~ b'8[ cis''8^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }}] } + { g'4^\markup { \pad-markup #0.2 "-39"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↑" }} fis'8^\markup { \pad-markup #0.2 "+17"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 13↑" }}[ f'8^\markup { \pad-markup #0.2 "-21"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↑" }}] fis'8^\markup { \pad-markup #0.2 "+34"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 13↓" }}[ gis'8^\markup { \pad-markup #0.2 "+26"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 11↑" }}] ais'8^\markup { \pad-markup #0.2 "-23"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↑" }}[ b'8^\markup { \pad-markup #0.2 "+32"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 13↓" }}] ~ } \bar "|" - { dis''8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↑" }}[ e''8^\markup { \pad-markup #0.2 "-14"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↓" }}] ~ e''8[ d''8^\markup { \pad-markup #0.2 "+21"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 11↓" }}] ~ d''2 } + { b'4 cis''4^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }} c''4^\markup { \pad-markup #0.2 "-41"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↑" }} dis''8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↑" }}[ cis''8^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }}] ~ } \bar "|" - { g'8^\markup { \pad-markup #0.2 "+19"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}[ fis'8^\markup { \pad-markup #0.2 "-31"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↓" }}] ~ fis'8[ gis'8^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↑" }}] ~ gis'4 ~ gis'8[ a'8^\markup { \pad-markup #0.2 "-16"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] ~ } - \bar "|" - { a'1} + { cis''2. ~ cis''4.} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/61207e49/lilypond/part_III.ly b/resources/string_quartet_3_rise/61207e49/lilypond/part_III.ly index 557b99b..b5f44bf 100644 --- a/resources/string_quartet_3_rise/61207e49/lilypond/part_III.ly +++ b/resources/string_quartet_3_rise/61207e49/lilypond/part_III.ly @@ -1,14 +1,12 @@ { - { dis'8^\markup { \pad-markup #0.2 "-25"}[ e'8^\markup { \pad-markup #0.2 "-14"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↓" }}] f'8^\markup { \pad-markup #0.2 "+41"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 7↑" }}[ gis'8^\markup { \pad-markup #0.2 "-27"}] ~ gis'2 ~ } + { gis2^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< I"\normal-size-super " 1↑" }} gis''2^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }} } \bar "|" - { gis'8[ ais'8^\markup { \pad-markup #0.2 "-23"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 3↑" }}] b'8^\markup { \pad-markup #0.2 "-12"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}[ c''8^\markup { \pad-markup #0.2 "+43"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 7↑" }}] b'8^\markup { \pad-markup #0.2 "+15"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 13↑" }}[ gis'8^\markup { \pad-markup #0.2 "-27"}] ~ gis'4 } + { dis'1^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }} ~ } \bar "|" - { g'4^\markup { \pad-markup #0.2 "-39"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }} fis'8^\markup { \pad-markup #0.2 "+17"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 13↑" }}[ f'8^\markup { \pad-markup #0.2 "-21"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↑" }}] fis'8^\markup { \pad-markup #0.2 "+34"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 13↓" }}[ gis'8^\markup { \pad-markup #0.2 "+26"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] ais'8^\markup { \pad-markup #0.2 "-23"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}[ b'8^\markup { \pad-markup #0.2 "+32"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 13↓" }}] ~ } + { dis'2. ~ dis'8[ e'8^\markup { \pad-markup #0.2 "+13"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 13↑" }}] } \bar "|" - { b'4 cis''4^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }} c''4^\markup { \pad-markup #0.2 "-41"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }} dis''8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↑" }}[ cis'8^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }}] ~ } + { c'2^\markup { \pad-markup #0.2 "-41"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↑" }} ais8^\markup { \pad-markup #0.2 "+35"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }}[ a8^\markup { \pad-markup #0.2 "+23"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}] ~ a4 } \bar "|" - { cis'1 ~ } - \bar "|" - { cis'1} + { gis8^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 3↑" }} cis'4^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }} ~ cis'2.} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/61207e49/lilypond/part_IV.ly b/resources/string_quartet_3_rise/61207e49/lilypond/part_IV.ly index 1d4967b..4a1c871 100644 --- a/resources/string_quartet_3_rise/61207e49/lilypond/part_IV.ly +++ b/resources/string_quartet_3_rise/61207e49/lilypond/part_IV.ly @@ -1,14 +1,13 @@ { - { gis,2^\markup { \pad-markup #0.2 "-27"} gis2^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }} ~ } + { gis,2^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< I"\normal-size-super " 1↑" }} gis2^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }} ~ } \bar "|" - { gis8[ ais8^\markup { \pad-markup #0.2 "-23"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}] b2^\markup { \pad-markup #0.2 "-12"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 5↓" }} ais4^\markup { \pad-markup #0.2 "-23"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }} ~ } + { gis8[ ais8^\markup { \pad-markup #0.2 "-23"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↑" }}] b2^\markup { \pad-markup #0.2 "-12"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↓" }} ais4^\markup { \pad-markup #0.2 "-23"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↑" }} ~ } \bar "|" - { ais2 b8^\markup { \pad-markup #0.2 "-12"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}[ gis8^\markup { \pad-markup #0.2 "+26"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↑" }}] gis4^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }} ~ } + { ais2 b8^\markup { \pad-markup #0.2 "-12"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↓" }}[ gis8^\markup { \pad-markup #0.2 "+26"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 11↑" }}] gis4^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↓" }} ~ } \bar "|" { gis1 } \bar "|" - { g8^\markup { \pad-markup #0.2 "+19"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 11↓" }}[ fis8^\markup { \pad-markup #0.2 "-31"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}] cis8^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}[ dis8^\markup { \pad-markup #0.2 "+2"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 7↓" }}] f8^\markup { \pad-markup #0.2 "-43"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↑" }}[ gis8^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}] a4^\markup { \pad-markup #0.2 "-16"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↓" }} } - \bar "|" - { ais1^\markup { \pad-markup #0.2 "+40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 7↑" }}} + { g8^\markup { \pad-markup #0.2 "+19"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 11↓" }}[ fis8^\markup { \pad-markup #0.2 "-31"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 3↓" }} cis8^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}] dis8^\markup { \pad-markup #0.2 "+2"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 7↓" }}[ f8^\markup { \pad-markup #0.2 "-43"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↑" }} gis8^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}] a4^\markup { \pad-markup #0.2 "-16"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↓" }} } + { ais8^\markup { \pad-markup #0.2 "+40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 7↑" }} ~} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/624f7439/624f7439_mus_model.json b/resources/string_quartet_3_rise/624f7439/624f7439_mus_model.json index 835be59..7e36c60 100644 --- a/resources/string_quartet_3_rise/624f7439/624f7439_mus_model.json +++ b/resources/string_quartet_3_rise/624f7439/624f7439_mus_model.json @@ -10,55 +10,55 @@ ], [ [ [ [ -6, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -3, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -3, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -3, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 0, -2, 2 ], [ -3, 6, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -3, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -3, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 2 ] ], 0.25 ] + [ [ [ -5, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 2 ] ], 0 ], + [ [ [ -5, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -5, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 0, -2, 2 ], [ -3, 6, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -5, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -5, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 6, -1, 1, -2, 2 ] ], 0.25 ] ], [ - [ [ [ -3, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -3, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0.25 ] + [ [ [ -5, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0 ], + [ [ [ -5, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0.25 ] ], [ - [ [ [ -3, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 6, -2, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -3, 5, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -4, 6, -2, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -4, 6, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -4, 6, -2, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -5, 6, -1, 0, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -4, 6, -2, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -5, 6, -1, 0, -2, 2 ], [ -4, 6, -1, 1, -3, 2 ], [ -4, 6, -2, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -5, 6, -1, 0, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -4, 6, -2, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -5, 6, -1, 0, -2, 2 ], [ -5, 6, -1, 1, -1, 2 ], [ -4, 6, -2, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0.25 ] + [ [ [ -5, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 6, -2, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0 ], + [ [ [ -5, 5, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -4, 6, -2, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0 ], + [ [ [ -6, 6, -1, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -4, 6, -2, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -5, 6, -1, 0, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -4, 6, -2, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0 ], + [ [ [ -5, 6, -1, 0, -2, 2 ], [ -4, 6, -1, 1, -3, 2 ], [ -4, 6, -2, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -5, 6, -1, 0, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -4, 6, -2, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -5, 6, -1, 0, -2, 2 ], [ -5, 6, -1, 1, -1, 2 ], [ -4, 6, -2, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0.25 ] ], [ - [ [ [ -5, 6, -1, 0, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -4, 6, -2, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -5, 6, -1, 0, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -6, 6, 0, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -6, 6, 0, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -4, 6, 0, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -6, 6, 0, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -6, 6, 0, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -6, 6, 0, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0.25 ] + [ [ [ -5, 6, -1, 0, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -4, 6, -2, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -5, 6, -1, 0, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0 ], + [ [ [ -6, 6, 0, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -6, 6, 0, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -4, 6, 0, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -6, 6, 0, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0 ], + [ [ [ -6, 6, 0, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -6, 6, 0, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0.25 ] ], [ - [ [ [ -6, 6, 0, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -6, 6, 0, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -6, 6, 0, 1, -2, 2 ], [ -4, 5, 0, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0.25 ] + [ [ [ -6, 6, 0, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -4, 7, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0 ], + [ [ [ -6, 6, 0, 1, -2, 2 ], [ -5, 7, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -6, 6, 0, 1, -2, 2 ], [ -4, 5, 0, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0.25 ] ], [ - [ [ [ -6, 6, 0, 1, -2, 2 ], [ -4, 5, 0, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -6, 6, 0, 1, -2, 2 ], [ -5, 6, -1, 2, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -6, 6, -1, 1, -1, 2 ], [ -5, 6, -1, 2, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0.25 ] + [ [ [ -6, 6, 0, 1, -2, 2 ], [ -4, 5, 0, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0 ], + [ [ [ -6, 6, 0, 1, -2, 2 ], [ -5, 6, -1, 2, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0 ], + [ [ [ -6, 6, -1, 1, -1, 2 ], [ -5, 6, -1, 2, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0.25 ] ], [ - [ [ [ -6, 7, -1, 1, -2, 2 ], [ -5, 6, -1, 2, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -6, 7, -1, 1, -2, 2 ], [ -5, 7, 0, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0.25 ], - [ [ [ -6, 7, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -5, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0.25 ] + [ [ [ -6, 7, -1, 1, -2, 2 ], [ -5, 6, -1, 2, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0 ], + [ [ [ -6, 7, -1, 1, -2, 2 ], [ -5, 7, 0, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0.25 ], + [ [ [ -6, 7, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0 ], + [ [ [ -5, 5, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0.25 ] ], [ - [ [ [ -5, 5, -1, 1, -2, 2 ], [ -3, 5, -2, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -5, 6, -1, 1, -2, 2 ] ], 0 ], - [ [ [ -5, 5, -1, 1, -2, 2 ], [ -3, 5, -2, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -4, 5, -2, 1, -2, 2 ] ], 0 ], - [ [ [ -5, 5, -1, 1, -2, 2 ], [ -3, 5, -2, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -4, 5, -2, 1, -2, 2 ] ], 0.25 ], - [ [ [ -5, 5, -1, 1, -2, 2 ], [ -3, 5, -2, 1, -2, 2 ], [ -4, 5, 0, 1, -2, 2 ], [ -4, 5, -2, 1, -2, 2 ] ], 0 ], + [ [ [ -5, 5, -1, 1, -2, 2 ], [ -3, 5, -2, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0 ], + [ [ [ -5, 5, -1, 1, -2, 2 ], [ -3, 5, -2, 1, -2, 2 ], [ -5, 6, 0, 1, -2, 2 ], [ -3, 5, -2, 1, -2, 2 ] ], 0 ], + [ [ [ -5, 5, -1, 1, -2, 2 ], [ -3, 5, -2, 1, -2, 2 ], [ -4, 5, -1, 1, -2, 2 ], [ -3, 5, -2, 1, -2, 2 ] ], 0.25 ], + [ [ [ -5, 5, -1, 1, -2, 2 ], [ -3, 5, -2, 1, -2, 2 ], [ -4, 5, 0, 1, -2, 2 ], [ -3, 5, -2, 1, -2, 2 ] ], 0 ], [ [ [ -5, 5, -1, 1, -2, 2 ], [ -3, 5, -2, 1, -2, 2 ], [ -4, 5, 0, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0.25 ], [ [ [ -5, 5, -1, 1, -2, 2 ], [ -3, 5, -2, 1, -2, 2 ], [ -3, 4, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0.25 ], [ [ [ -5, 5, -1, 1, -2, 2 ], [ -4, 5, -1, 2, -2, 2 ], [ -3, 4, -1, 1, -2, 2 ], [ -4, 6, -1, 1, -2, 2 ] ], 0.25 ] diff --git a/resources/string_quartet_3_rise/624f7439/lilypond/part_I.ly b/resources/string_quartet_3_rise/624f7439/lilypond/part_I.ly index 7901a68..bfd4b77 100644 --- a/resources/string_quartet_3_rise/624f7439/lilypond/part_I.ly +++ b/resources/string_quartet_3_rise/624f7439/lilypond/part_I.ly @@ -1,14 +1,13 @@ { - { gis2^\markup { \pad-markup #0.2 "-27"} gis''2^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }} } + { \offset Y-offset 4 \textMark \markup \musicglyph "scripts.coda" gis2^\markup { \pad-markup #0.2 "-27"} \repeatTie gis''2^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }} } \bar "|" - { gis1^\markup { \pad-markup #0.2 "-27"} ~ } + { gis'1^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }} ~ } \bar "|" - { gis2. ~ gis8[ a8^\markup { \pad-markup #0.2 "-16"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}] } + { gis'2. ~ gis'8[ a'8^\markup { \pad-markup #0.2 "-16"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↓" }}] } \bar "|" { gis'2^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↑" }} a'8^\markup { \pad-markup #0.2 "-16"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↓" }}[ g'8^\markup { \pad-markup #0.2 "+19"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 11↓" }}] ~ g'4 } \bar "|" - { a'8^\markup { \pad-markup #0.2 "-16"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}[ gis'8^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] ~ gis'2. ~ } - \bar "|" - { gis'1} + \time 9/8 + { a'8^\markup { \pad-markup #0.2 "-16"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↓" }} gis'4^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↑" }} ~ gis'2.} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/624f7439/lilypond/part_II.ly b/resources/string_quartet_3_rise/624f7439/lilypond/part_II.ly index 79346aa..bd074b3 100644 --- a/resources/string_quartet_3_rise/624f7439/lilypond/part_II.ly +++ b/resources/string_quartet_3_rise/624f7439/lilypond/part_II.ly @@ -1,14 +1,13 @@ { - { cis'2^\markup { \pad-markup #0.2 "-29"} gis8^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}[ ais8^\markup { \pad-markup #0.2 "+4"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 7↓" }}] c'8^\markup { \pad-markup #0.2 "-41"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↑" }}[ cis'8^\markup { \pad-markup #0.2 "-29"}] } + { cis'2^\markup { \pad-markup #0.2 "-29"} \repeatTie gis8^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}[ ais8^\markup { \pad-markup #0.2 "+4"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 7↓" }}] c'8^\markup { \pad-markup #0.2 "-41"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↑" }}[ cis'8^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↑" }}] } \bar "|" - { dis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↑" }}[ e'8^\markup { \pad-markup #0.2 "-14"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↓" }}] ~ e'2 dis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}[ c''8^\markup { \pad-markup #0.2 "-41"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] } + { dis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↑" }}[ e'8^\markup { \pad-markup #0.2 "-14"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }}] ~ e'2 dis''8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}[ c''8^\markup { \pad-markup #0.2 "-41"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] } \bar "|" - { cis''8^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }}[ dis''8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}] gis'4^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }} c'4^\markup { \pad-markup #0.2 "-41"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }} ~ c'8[ cis'8^\markup { \pad-markup #0.2 "-29"}] } + { cis''8^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }}[ dis''8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}] gis'4^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }} c'4^\markup { \pad-markup #0.2 "-41"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }} ~ c'8[ cis'8^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] } \bar "|" { f'8^\markup { \pad-markup #0.2 "-43"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↑" }}[ fis'8^\markup { \pad-markup #0.2 "-31"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }}] ~ fis'8[ e'8^\markup { \pad-markup #0.2 "-14"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }}] ~ e'2 } - \bar "|" - { dis'8^\markup { \pad-markup #0.2 "+2"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 7↓" }}[ f'8^\markup { \pad-markup #0.2 "-43"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↑" }}] ~ f'8[ fis'8^\markup { \pad-markup #0.2 "-31"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↓" }}] ~ fis'4 ~ fis'8[ f'8^\markup { \pad-markup #0.2 "-43"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↑" }}] ~ } - \bar "|" - { f'1} + \bar "|" + \time 9/8 + { dis'8^\markup { \pad-markup #0.2 "+2"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 7↓" }} f'4^\markup { \pad-markup #0.2 "-43"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↑" }} fis'4.^\markup { \pad-markup #0.2 "-31"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↓" }} ~ fis'8 f'4^\markup { \pad-markup #0.2 "-43"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↑" }} } \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/624f7439/lilypond/part_III.ly b/resources/string_quartet_3_rise/624f7439/lilypond/part_III.ly index f4cbb75..3615e9e 100644 --- a/resources/string_quartet_3_rise/624f7439/lilypond/part_III.ly +++ b/resources/string_quartet_3_rise/624f7439/lilypond/part_III.ly @@ -1,14 +1,12 @@ { - { a'8^\markup { \pad-markup #0.2 "-16"}[ gis'8^\markup { \pad-markup #0.2 "-27"}] a'8^\markup { \pad-markup #0.2 "+11"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 13↑" }}[ gis'8^\markup { \pad-markup #0.2 "-27"}] ~ gis'2 ~ } + { a'8^\markup { \pad-markup #0.2 "-16"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }} [ gis'8^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] a'8^\markup { \pad-markup #0.2 "+11"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 13↑" }}[ gis'8^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] ~ gis'2 ~ } \bar "|" - { gis'8[ cis'8^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] d'8^\markup { \pad-markup #0.2 "+21"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↓" }}[ dis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}] cis'8^\markup { \pad-markup #0.2 "+24"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↑" }}[ c'8^\markup { \pad-markup #0.2 "-41"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }}] ~ c'4 } + { gis'8[ cis'8^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }}] d'8^\markup { \pad-markup #0.2 "+21"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↓" }}[ dis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}] cis'8^\markup { \pad-markup #0.2 "+24"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↑" }}[ c'8^\markup { \pad-markup #0.2 "-41"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }}] ~ c'4 } \bar "|" - { cis'4^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }} dis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}[ f'8^\markup { \pad-markup #0.2 "-43"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }}] f'8^\markup { \pad-markup #0.2 "+41"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↑" }}[ g'8^\markup { \pad-markup #0.2 "-39"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↑" }}] gis'8^\markup { \pad-markup #0.2 "-27"}[ a'8^\markup { \pad-markup #0.2 "-16"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↓" }}] ~ } + { cis'4^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }} dis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}[ f'8^\markup { \pad-markup #0.2 "-43"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }}] f'8^\markup { \pad-markup #0.2 "+41"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↑" }}[ g'8^\markup { \pad-markup #0.2 "-39"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 3↑" }}] gis'8^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}[ a'8^\markup { \pad-markup #0.2 "-16"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↓" }}] ~ } \bar "|" { a'4 ais'4^\markup { \pad-markup #0.2 "+40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 7↑" }} cis''4^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }} d''8^\markup { \pad-markup #0.2 "-45"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 7↑" }}[ cis''8^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] ~ } \bar "|" - { cis''1 ~ } - \bar "|" - { cis''1} + { cis''2. ~ cis''4.} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/624f7439/lilypond/part_IV.ly b/resources/string_quartet_3_rise/624f7439/lilypond/part_IV.ly index dc2b6a7..b6c98c9 100644 --- a/resources/string_quartet_3_rise/624f7439/lilypond/part_IV.ly +++ b/resources/string_quartet_3_rise/624f7439/lilypond/part_IV.ly @@ -1,14 +1,12 @@ { - { gis,2^\markup { \pad-markup #0.2 "-27"} cis''2^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }} ~ } + { gis,2^\markup { \pad-markup #0.2 "-27"} \repeatTie cis2^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↓" }} ~ } \bar "|" - { cis''8[ gis'8^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}] ais,2^\markup { \pad-markup #0.2 "+4"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↓" }} c4^\markup { \pad-markup #0.2 "-41"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }} ~ } + { cis8[ gis,8^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}] ais,2^\markup { \pad-markup #0.2 "+4"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↓" }} c4^\markup { \pad-markup #0.2 "-41"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }} ~ } \bar "|" - { c2 cis8^\markup { \pad-markup #0.2 "+24"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↑" }}[ dis8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}] cis4^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↓" }} ~ } + { c2 cis8^\markup { \pad-markup #0.2 "+24"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↑" }}[ dis8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}] cis4^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }} ~ } \bar "|" { cis1 } \bar "|" - { a8^\markup { \pad-markup #0.2 "-16"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↓" }}[ gis8^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↑" }}] g8^\markup { \pad-markup #0.2 "+19"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 11↓" }}[ fis8^\markup { \pad-markup #0.2 "-31"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}] cis'8^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}[ c'8^\markup { \pad-markup #0.2 "-41"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }}] cis'4^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }} } - \bar "|" - { d'1^\markup { \pad-markup #0.2 "+21"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↓" }}} + { a8^\markup { \pad-markup #0.2 "-16"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↓" }}[ gis8^\markup { \pad-markup #0.2 "-27"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↑" }} g8^\markup { \pad-markup #0.2 "+19"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 11↓" }}] fis8^\markup { \pad-markup #0.2 "-31"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↓" }}[ cis'8^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }} c'8^\markup { \pad-markup #0.2 "-41"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }} ] cis'4^\markup { \pad-markup #0.2 "-29"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }} d'8^\markup { \pad-markup #0.2 "+21"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↓" }}} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/65120e88/65120e88_mus_model.json b/resources/string_quartet_3_rise/65120e88/65120e88_mus_model.json index 7e0733c..c76bc8b 100644 --- a/resources/string_quartet_3_rise/65120e88/65120e88_mus_model.json +++ b/resources/string_quartet_3_rise/65120e88/65120e88_mus_model.json @@ -3,29 +3,29 @@ [ [ [ - [ [ [ -6, 4, 0, 2, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -6, 4, 0, 2, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -7, 5, 1, 2, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -7, 5, 1, 2, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -7, 5, 1, 2, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -6, 4, 1, 2, 0, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -7, 5, 1, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ], [ -6, 4, 1, 2, 0, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -7, 5, 1, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] + [ [ [ -6, 4, 0, 2, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ] ], 0 ], + [ [ [ -6, 4, 0, 2, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ] ], 0.25 ], + [ [ [ -7, 5, 1, 2, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ] ], 0 ], + [ [ [ -7, 5, 1, 2, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -7, 5, 1, 2, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -6, 4, 1, 2, 0, 2 ] ], 0 ], + [ [ [ -7, 5, 1, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -6, 4, 1, 2, 0, 2 ] ], 0.25 ], + [ [ [ -7, 5, 1, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ] ], 0.25 ] ], [ - [ [ [ -7, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 3 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -7, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 3 ], [ -6, 4, 1, 2, -1, 3 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -7, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 3, -1, 2 ], [ -6, 4, 1, 2, -1, 3 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] + [ [ [ -7, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 3 ], [ -5, 4, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -7, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 3 ], [ -5, 4, 1, 2, -1, 2 ], [ -6, 4, 1, 2, -1, 3 ] ], 0.25 ], + [ [ [ -7, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -6, 4, 1, 2, -1, 3 ] ], 0.25 ] ], [ - [ [ [ -7, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 3, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -7, 5, 1, 2, -1, 2 ], [ -6, 4, 1, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -6, 4, 0, 2, -1, 2 ], [ -6, 4, 1, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] + [ [ [ -7, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ] ], 0 ], + [ [ [ -7, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ] ], 0 ], + [ [ [ -6, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ] ], 0.25 ] ], [ - [ [ [ -7, 4, 1, 3, -1, 2 ], [ -6, 4, 1, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -7, 4, 1, 3, -1, 2 ], [ -6, 4, 1, 3, -1, 1 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -7, 4, 1, 3, -1, 2 ], [ -6, 3, 1, 3, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -7, 4, 0, 3, -1, 2 ], [ -6, 3, 1, 3, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] + [ [ [ -7, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ] ], 0 ], + [ [ [ -7, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 3, -1, 1 ], [ -5, 4, 1, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ] ], 0.25 ], + [ [ [ -7, 4, 1, 3, -1, 2 ], [ -5, 3, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ] ], 0 ], + [ [ [ -7, 4, 0, 3, -1, 2 ], [ -5, 3, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ] ], 0.25 ] ] ] ], diff --git a/resources/string_quartet_3_rise/65120e88/lilypond/part_I.ly b/resources/string_quartet_3_rise/65120e88/lilypond/part_I.ly index 07fa029..3b33560 100644 --- a/resources/string_quartet_3_rise/65120e88/lilypond/part_I.ly +++ b/resources/string_quartet_3_rise/65120e88/lilypond/part_I.ly @@ -1,6 +1,5 @@ { - { f'1^\markup { \pad-markup #0.2 "-38"} ~ } - \bar "|" - { f'1} + + { cis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}[ c'8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 3↑" }} ais8^\markup { \pad-markup #0.2 "+13"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 11↑" }} ] c'8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] cis'4^\markup { \pad-markup #0.2 "+2"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 13↑" }} d'4.^\markup { \pad-markup #0.2 "+30"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 7↑" }} } \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/65120e88/lilypond/part_II.ly b/resources/string_quartet_3_rise/65120e88/lilypond/part_II.ly index 0ef467c..b0d124c 100644 --- a/resources/string_quartet_3_rise/65120e88/lilypond/part_II.ly +++ b/resources/string_quartet_3_rise/65120e88/lilypond/part_II.ly @@ -1,6 +1,5 @@ { - { cis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}[ c'8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] ais8^\markup { \pad-markup #0.2 "+13"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↑" }}[ c'8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] cis'4^\markup { \pad-markup #0.2 "+2"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }} d'4^\markup { \pad-markup #0.2 "+30"} ~ } - \bar "|" - { d'1} + { f'2.^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< I"\normal-size-super " 1↑" }} ~ } + { f'4.} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/65120e88/lilypond/part_III.ly b/resources/string_quartet_3_rise/65120e88/lilypond/part_III.ly index 6a69661..3861845 100644 --- a/resources/string_quartet_3_rise/65120e88/lilypond/part_III.ly +++ b/resources/string_quartet_3_rise/65120e88/lilypond/part_III.ly @@ -1,6 +1,5 @@ { - { cis''4^\markup { \pad-markup #0.2 "-25"} c''4^\markup { \pad-markup #0.2 "-37"} cis''8^\markup { \pad-markup #0.2 "+2"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 13↑" }}[ d''8^\markup { \pad-markup #0.2 "+30"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↑" }}] f8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}[ fis8^\markup { \pad-markup #0.2 "-10"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 13↓" }}] } - \bar "|" - { g1^\markup { \pad-markup #0.2 "+28"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }}} + { cis''4^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }} c''8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }} ~ c''8 [ cis''8^\markup { \pad-markup #0.2 "+2"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 13↑" }} d''8^\markup { \pad-markup #0.2 "+30"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 7↑" }}] f'8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}[ fis'8^\markup { \pad-markup #0.2 "-10"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 13↓" }}} + { g'8^\markup { \pad-markup #0.2 "+28"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }}]} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/65120e88/lilypond/part_IV.ly b/resources/string_quartet_3_rise/65120e88/lilypond/part_IV.ly index 68e695e..c93511b 100644 --- a/resources/string_quartet_3_rise/65120e88/lilypond/part_IV.ly +++ b/resources/string_quartet_3_rise/65120e88/lilypond/part_IV.ly @@ -1,6 +1,5 @@ { - { cis8^\markup { \pad-markup #0.2 "-25"}[ c8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}] ~ c2 cis8^\markup { \pad-markup #0.2 "-25"}[ d8^\markup { \pad-markup #0.2 "+30"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}] } - \bar "|" - { ais,1^\markup { \pad-markup #0.2 "+44"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 5↓" }}} + { cis8^\markup { \pad-markup #0.2 "-25"} c4^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 3↑" }} ~ c4. cis8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 5↓" }}[ d8^\markup { \pad-markup #0.2 "+30"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}} + { ais,8^\markup { \pad-markup #0.2 "+44"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }}]} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/66b20499/66b20499_mus_model.json b/resources/string_quartet_3_rise/66b20499/66b20499_mus_model.json index 2a8636b..8e02a12 100644 --- a/resources/string_quartet_3_rise/66b20499/66b20499_mus_model.json +++ b/resources/string_quartet_3_rise/66b20499/66b20499_mus_model.json @@ -3,27 +3,27 @@ [ [ [ - [ [ [ -4, 4, -1, 2, -1, 2 ], [ -4, 4, -1, 2, -2, 3 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ], - [ [ [ -4, 4, -1, 2, -1, 2 ], [ -4, 5, -1, 2, -2, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ], - [ [ [ -4, 4, -1, 2, -1, 2 ], [ -3, 4, -2, 2, -2, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ], - [ [ [ -4, 4, -1, 2, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ] + [ [ [ -5, 4, -1, 2, -1, 2 ], [ -4, 4, -1, 2, -2, 3 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ], + [ [ [ -5, 4, -1, 2, -1, 2 ], [ -4, 5, -1, 2, -2, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ], + [ [ [ -5, 4, -1, 2, -1, 2 ], [ -3, 4, -2, 2, -2, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ], + [ [ [ -5, 4, -1, 2, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, -1, 2, -2, 2 ] ], 0.25 ] ], [ - [ [ [ -4, 4, -1, 2, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, 0, 1, -1, 2 ] ], 0 ], - [ [ [ -4, 4, 0, 2, -2, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, 0, 1, -1, 2 ] ], 0.25 ], - [ [ [ -4, 4, 0, 2, -2, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -4, 4, 0, 1, -1, 2 ] ], 0.25 ], - [ [ [ -4, 4, 0, 2, -2, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, -1, 2, -1, 2 ], [ -4, 4, 0, 1, -1, 2 ] ], 0.25 ], - [ [ [ -4, 4, 0, 2, -2, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 0, 2, -2, 2 ], [ -4, 4, 0, 1, -1, 2 ] ], 0.25 ], - [ [ [ -4, 4, 0, 2, -2, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -6, 5, 0, 2, -1, 2 ], [ -4, 4, 0, 1, -1, 2 ] ], 0.25 ] + [ [ [ -5, 4, -1, 2, -1, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, 0, 1, -1, 2 ] ], 0 ], + [ [ [ -5, 4, 0, 2, -2, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 5, -1, 2, -2, 2 ], [ -4, 4, 0, 1, -1, 2 ] ], 0.25 ], + [ [ [ -5, 4, 0, 2, -2, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -4, 4, 0, 1, -1, 2 ] ], 0.25 ], + [ [ [ -5, 4, 0, 2, -2, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, -1, 2, -1, 2 ], [ -4, 4, 0, 1, -1, 2 ] ], 0.25 ], + [ [ [ -5, 4, 0, 2, -2, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -5, 4, 0, 2, -2, 2 ], [ -4, 4, 0, 1, -1, 2 ] ], 0.25 ], + [ [ [ -5, 4, 0, 2, -2, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -6, 5, 0, 2, -1, 2 ], [ -4, 4, 0, 1, -1, 2 ] ], 0.25 ] ], [ - [ [ [ -4, 4, 0, 2, -2, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -6, 5, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -4, 4, 0, 2, -2, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -4, 4, 0, 1, -2, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] + [ [ [ -5, 4, 0, 2, -2, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -6, 5, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -5, 4, 0, 2, -2, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -4, 4, 0, 1, -2, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] ], [ - [ [ [ -4, 4, 0, 2, -2, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -4, 4, 0, 2, -2, 2 ], [ -5, 5, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -5, 4, 2, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -5, 4, 0, 2, -2, 2 ], [ -4, 4, 0, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -5, 4, 0, 2, -2, 2 ], [ -5, 5, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -6, 4, 2, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], [ [ [ -6, 4, 1, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], [ [ [ -6, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 3 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], [ [ [ -6, 4, 1, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], diff --git a/resources/string_quartet_3_rise/66b20499/lilypond/part_I.ly b/resources/string_quartet_3_rise/66b20499/lilypond/part_I.ly index 148c963..51a42be 100644 --- a/resources/string_quartet_3_rise/66b20499/lilypond/part_I.ly +++ b/resources/string_quartet_3_rise/66b20499/lilypond/part_I.ly @@ -3,8 +3,7 @@ \bar "|" { dis'8[ f'8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↑" }}] ~ f'2. ~ } \bar "|" - { f'1 ~ } - \bar "|" - { f'1} + \time 9/8 + { f'2. ~ f'4.} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/66b20499/lilypond/part_II.ly b/resources/string_quartet_3_rise/66b20499/lilypond/part_II.ly index 3e62d03..97577ba 100644 --- a/resources/string_quartet_3_rise/66b20499/lilypond/part_II.ly +++ b/resources/string_quartet_3_rise/66b20499/lilypond/part_II.ly @@ -1,10 +1,8 @@ { { ais2^\markup { \pad-markup #0.2 "+40"} ~ ais8[ cis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}] a8^\markup { \pad-markup #0.2 "-11"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↓" }}[ g8^\markup { \pad-markup #0.2 "+24"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] } \bar "|" - { gis8^\markup { \pad-markup #0.2 "-23"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↑" }}[ ais8^\markup { \pad-markup #0.2 "-45"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 7↓" }}] c'2^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }} cis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↓" }}[ d'8^\markup { \pad-markup #0.2 "+30"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↑" }}] } + { gis8^\markup { \pad-markup #0.2 "-23"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↑" }}[ ais8^\markup { \pad-markup #0.2 "-45"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 7↓" }}] c'2^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }} cis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }}[ d'8^\markup { \pad-markup #0.2 "+30"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↑" }}] } \bar "|" - { ais8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}[ c'8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}] cis'4^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }} d'2^\markup { \pad-markup #0.2 "+30"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↑" }} ~ } - \bar "|" - { d'1} + { ais8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}[ c'8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }} cis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }}] ~ cis'8 d'4^\markup { \pad-markup #0.2 "+30"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↑" }} ~ d'4.} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/66b20499/lilypond/part_III.ly b/resources/string_quartet_3_rise/66b20499/lilypond/part_III.ly index e12cc1e..dc2e177 100644 --- a/resources/string_quartet_3_rise/66b20499/lilypond/part_III.ly +++ b/resources/string_quartet_3_rise/66b20499/lilypond/part_III.ly @@ -1,10 +1,8 @@ { - { c''8^\markup { \pad-markup #0.2 "-22"}[ ais'8^\markup { \pad-markup #0.2 "+40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}] c''8^\markup { \pad-markup #0.2 "-49"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }}[ cis''8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↑" }}] ~ cis''2 ~ } + { c''8^\markup { \pad-markup #0.2 "-22"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 13↑" }}[ ais'8^\markup { \pad-markup #0.2 "+40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}] c''8^\markup { \pad-markup #0.2 "-49"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }}[ cis''8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↑" }}] ~ cis''2 ~ } \bar "|" - { cis''4 c''8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}[ cis''8^\markup { \pad-markup #0.2 "+2"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 13↑" }}] c''8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}[ ais'8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }}] gis'4^\markup { \pad-markup #0.2 "+48"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 5↑" }} } + { cis''4 c''8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}[ cis''8^\markup { \pad-markup #0.2 "+2"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 13↑" }}] c''8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}[ ais'8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↓" }}] gis'4^\markup { \pad-markup #0.2 "+48"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }} } \bar "|" - { ais'4^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }} c''8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}[ cis''8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}] d''4^\markup { \pad-markup #0.2 "+30"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }} cis''8^\markup { \pad-markup #0.2 "+2"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 13↑" }}[ c''8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}] ~ } - \bar "|" - { c''1} + { ais'4^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }} c''8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }} cis''8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }} d''4^\markup { \pad-markup #0.2 "+30"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↑" }} cis''8^\markup { \pad-markup #0.2 "+2"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 13↑" }} c''4^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }} } \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/66b20499/lilypond/part_IV.ly b/resources/string_quartet_3_rise/66b20499/lilypond/part_IV.ly index 845aaae..7caa8fc 100644 --- a/resources/string_quartet_3_rise/66b20499/lilypond/part_IV.ly +++ b/resources/string_quartet_3_rise/66b20499/lilypond/part_IV.ly @@ -1,10 +1,9 @@ { - { a'2^\markup { \pad-markup #0.2 "-11"} g'2^\markup { \pad-markup #0.2 "+24"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 11↓" }} ~ } + { a2^\markup { \pad-markup #0.2 "-11"} g2^\markup { \pad-markup #0.2 "+24"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 11↓" }} ~ } \bar "|" - { g'4 gis'8^\markup { \pad-markup #0.2 "+48"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }}[ f8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}] ~ f4 ais,4^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }} ~ } + { g4 gis8^\markup { \pad-markup #0.2 "+48"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }}[ f8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}] ~ f4 ais,4^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }} ~ } \bar "|" - { ais,2 b,8^\markup { \pad-markup #0.2 "+10"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↓" }}[ d8^\markup { \pad-markup #0.2 "+30"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}] ~ d4 } - \bar "|" - { cis1^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }}} + { ais,4. ~ ais,8 [ b,8^\markup { \pad-markup #0.2 "+10"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↓" }} d8^\markup { \pad-markup #0.2 "+30"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}] ~ d4 } + { cis8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }} ~} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/736745da/736745da_mus_model.json b/resources/string_quartet_3_rise/736745da/736745da_mus_model.json index 859dd7a..6a53117 100644 --- a/resources/string_quartet_3_rise/736745da/736745da_mus_model.json +++ b/resources/string_quartet_3_rise/736745da/736745da_mus_model.json @@ -3,29 +3,29 @@ [ [ [ - [ [ [ -6, 5, 1, 1, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -6, 5, 1, 1, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -7, 4, 1, 2, 0, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -7, 4, 1, 2, 0, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -2, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -7, 4, 1, 2, 0, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -6, 4, 1, 2, 0, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -7, 4, 1, 2, 0, 2 ], [ -6, 4, 2, 2, -1, 2 ], [ -6, 4, 1, 2, 0, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -7, 4, 1, 2, 0, 2 ], [ -6, 4, 2, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] + [ [ [ -6, 5, 1, 1, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -6, 5, 1, 1, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ] ], 0 ], + [ [ [ -7, 4, 1, 2, 0, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ] ], 0.25 ], + [ [ [ -7, 4, 1, 2, 0, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -2, 2 ] ], 0.25 ], + [ [ [ -7, 4, 1, 2, 0, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -6, 4, 1, 2, 0, 2 ] ], 0 ], + [ [ [ -7, 4, 1, 2, 0, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -6, 4, 2, 2, -1, 2 ], [ -6, 4, 1, 2, 0, 2 ] ], 0.25 ], + [ [ [ -7, 4, 1, 2, 0, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -6, 4, 2, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ] ], 0.25 ] ], [ - [ [ [ -7, 4, 1, 2, 0, 2 ], [ -6, 4, 1, 2, 0, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -7, 4, 1, 2, 0, 2 ], [ -6, 4, 1, 2, 0, 2 ], [ -5, 4, 1, 2, 0, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -7, 4, 1, 2, 0, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, 0, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] + [ [ [ -7, 4, 1, 2, 0, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -6, 4, 1, 2, 0, 2 ], [ -6, 5, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -7, 4, 1, 2, 0, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -6, 4, 1, 2, 0, 2 ], [ -5, 4, 1, 2, 0, 2 ] ], 0.25 ], + [ [ [ -7, 4, 1, 2, 0, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, 0, 2 ] ], 0.25 ] ], [ - [ [ [ -7, 4, 1, 2, 0, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -7, 4, 1, 2, 0, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -7, 5, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] + [ [ [ -7, 4, 1, 2, 0, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -7, 4, 1, 2, 0, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -7, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ] ], 0.25 ] ], [ - [ [ [ -6, 3, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -6, 3, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -6, 3, 1, 2, -1, 2 ], [ -6, 4, 1, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -7, 4, 1, 2, -1, 2 ], [ -6, 4, 1, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] + [ [ [ -6, 3, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -6, 3, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -6, 3, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -7, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ], [ -5, 5, 1, 2, -1, 2 ] ], 0.25 ] ] ] ], diff --git a/resources/string_quartet_3_rise/736745da/lilypond/part_I.ly b/resources/string_quartet_3_rise/736745da/lilypond/part_I.ly index 07fa029..1e67794 100644 --- a/resources/string_quartet_3_rise/736745da/lilypond/part_I.ly +++ b/resources/string_quartet_3_rise/736745da/lilypond/part_I.ly @@ -1,6 +1,5 @@ { - { f'1^\markup { \pad-markup #0.2 "-38"} ~ } - \bar "|" - { f'1} + { cis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< I"\normal-size-super " 5↓" }}[ b8^\markup { \pad-markup #0.2 "+10"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 11↓" }} ais8^\markup { \pad-markup #0.2 "+13"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }} c'8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↑" }}] ais'4^\markup { \pad-markup #0.2 "+13"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }} c''2^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↑" }} } + \break \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/736745da/lilypond/part_II.ly b/resources/string_quartet_3_rise/736745da/lilypond/part_II.ly index a55b3bd..26c7bc7 100644 --- a/resources/string_quartet_3_rise/736745da/lilypond/part_II.ly +++ b/resources/string_quartet_3_rise/736745da/lilypond/part_II.ly @@ -1,6 +1,6 @@ { - { cis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }}[ b8^\markup { \pad-markup #0.2 "+10"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↓" }}] ais8^\markup { \pad-markup #0.2 "+13"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}[ c'8^\markup { \pad-markup #0.2 "-37"}] ais'4^\markup { \pad-markup #0.2 "+13"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }} c''4^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }} ~ } - \bar "|" - { c''1} + { ais4^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< I"\normal-size-super " 3↓" }} gis4^\markup { \pad-markup #0.2 "+48"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↑" }} ais8^\markup { \pad-markup #0.2 "+13"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}[ c'8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↑" }}] cis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 5↓" }}[ c'8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↑" }}] } + + { f'4^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/736745da/lilypond/part_III.ly b/resources/string_quartet_3_rise/736745da/lilypond/part_III.ly index 52edbce..2ddf31d 100644 --- a/resources/string_quartet_3_rise/736745da/lilypond/part_III.ly +++ b/resources/string_quartet_3_rise/736745da/lilypond/part_III.ly @@ -1,6 +1,6 @@ { - { ais4^\markup { \pad-markup #0.2 "-40"} gis4^\markup { \pad-markup #0.2 "+48"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }} ais8^\markup { \pad-markup #0.2 "+13"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}[ c'8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }}] cis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }}[ c'8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}] } - \bar "|" - { f1^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}} + { f'2^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< I"\normal-size-super " 1↑" }} ~ } + + { f'2.} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/736745da/lilypond/part_IV.ly b/resources/string_quartet_3_rise/736745da/lilypond/part_IV.ly index 13044d9..b42a9e3 100644 --- a/resources/string_quartet_3_rise/736745da/lilypond/part_IV.ly +++ b/resources/string_quartet_3_rise/736745da/lilypond/part_IV.ly @@ -1,6 +1,6 @@ { - { ais,2.^\markup { \pad-markup #0.2 "+13"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↑" }} c8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 1↑" }}[ ais,8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }}] ~ } - \bar "|" - { ais,8[ f,8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}] ~ f,2.} + { ais,2.^\markup { \pad-markup #0.2 "+13"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "< I"\normal-size-super " 11↑" }} c8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}[ ais,8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 3↓" }}] ~ } + + { ais,8[ f,8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }}] ~} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/767e70f0/767e70f0_mus_model.json b/resources/string_quartet_3_rise/767e70f0/767e70f0_mus_model.json index 8421367..1c5521c 100644 --- a/resources/string_quartet_3_rise/767e70f0/767e70f0_mus_model.json +++ b/resources/string_quartet_3_rise/767e70f0/767e70f0_mus_model.json @@ -3,28 +3,28 @@ [ [ [ - [ [ [ -4, 3, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -4, 3, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -5, 5, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -5, 5, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -6, 4, 2, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -5, 5, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -6, 4, 1, 2, 0, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -5, 5, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -6, 4, 1, 2, 0, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -5, 5, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] + [ [ [ -5, 3, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -5, 3, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -6, 5, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -6, 5, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -6, 4, 2, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -6, 5, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -6, 4, 1, 2, 0, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -6, 4, 1, 2, 0, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] ], [ - [ [ [ -5, 5, 1, 2, -1, 2 ], [ -6, 4, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -5, 5, 1, 2, -1, 2 ], [ -6, 4, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -5, 5, 1, 2, -1, 2 ], [ -7, 6, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] + [ [ [ -6, 5, 1, 2, -1, 2 ], [ -6, 4, 1, 2, -1, 2 ], [ -6, 5, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -6, 5, 1, 2, -1, 2 ], [ -6, 4, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -6, 5, 1, 2, -1, 2 ], [ -7, 6, 1, 2, -1, 2 ], [ -5, 4, 0, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] ], [ - [ [ [ -5, 5, 1, 2, -1, 2 ], [ -7, 6, 1, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -5, 5, 1, 2, -1, 2 ], [ -6, 4, 2, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -4, 4, 0, 2, -1, 2 ], [ -6, 4, 2, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] + [ [ [ -6, 5, 1, 2, -1, 2 ], [ -7, 6, 1, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -6, 5, 1, 2, -1, 2 ], [ -6, 4, 2, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -5, 4, 0, 2, -1, 2 ], [ -6, 4, 2, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] ], [ - [ [ [ -6, 4, 1, 4, -1, 2 ], [ -6, 4, 2, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], - [ [ [ -6, 4, 1, 4, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], - [ [ [ -6, 4, 1, 4, -1, 2 ], [ -5, 4, 1, 2, -1, 1 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -7, 4, 1, 4, -1, 2 ], [ -6, 4, 2, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], + [ [ [ -7, 4, 1, 4, -1, 2 ], [ -5, 3, 1, 2, -1, 2 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ], + [ [ [ -7, 4, 1, 4, -1, 2 ], [ -5, 4, 1, 2, -1, 1 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0 ], [ [ [ -6, 4, 1, 2, -1, 2 ], [ -5, 4, 1, 2, -1, 1 ], [ -6, 4, 1, 3, -1, 2 ], [ -5, 4, 1, 2, -1, 2 ] ], 0.25 ] ] ] diff --git a/resources/string_quartet_3_rise/767e70f0/lilypond/part_I.ly b/resources/string_quartet_3_rise/767e70f0/lilypond/part_I.ly index 07fa029..f65f356 100644 --- a/resources/string_quartet_3_rise/767e70f0/lilypond/part_I.ly +++ b/resources/string_quartet_3_rise/767e70f0/lilypond/part_I.ly @@ -1,6 +1,7 @@ -{ - { f'1^\markup { \pad-markup #0.2 "-38"} ~ } - \bar "|" - { f'1} +{ + \time 10/8 + { f'2^\markup { \pad-markup #0.2 "-38"} ~ } + + { f'2. ~} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/767e70f0/lilypond/part_II.ly b/resources/string_quartet_3_rise/767e70f0/lilypond/part_II.ly index e7ebc1a..72f1bda 100644 --- a/resources/string_quartet_3_rise/767e70f0/lilypond/part_II.ly +++ b/resources/string_quartet_3_rise/767e70f0/lilypond/part_II.ly @@ -1,6 +1,5 @@ { - { ais8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}[ gis8^\markup { \pad-markup #0.2 "+48"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }}] ais8^\markup { \pad-markup #0.2 "+13"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↑" }}[ c'8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] cis'4^\markup { \pad-markup #0.2 "-25"} d'4^\markup { \pad-markup #0.2 "+30"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↑" }} ~ } - \bar "|" - { d'1} + { ais8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }}[ gis8^\markup { \pad-markup #0.2 "+48"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }}] ais8^\markup { \pad-markup #0.2 "+13"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 11↑" }}[ c'8^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 1↑" }}] cis'4^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }} d'2^\markup { \pad-markup #0.2 "+30"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 7↑" }} ~ } + \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/767e70f0/lilypond/part_III.ly b/resources/string_quartet_3_rise/767e70f0/lilypond/part_III.ly index 95e6e0a..1c5f12e 100644 --- a/resources/string_quartet_3_rise/767e70f0/lilypond/part_III.ly +++ b/resources/string_quartet_3_rise/767e70f0/lilypond/part_III.ly @@ -1,6 +1,6 @@ { - { c'4^\markup { \pad-markup #0.2 "-37"} cis'4^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }} f8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}[ g8^\markup { \pad-markup #0.2 "-35"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↑" }}] gis4^\markup { \pad-markup #0.2 "+48"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }} } - \bar "|" - { ais8^\markup { \pad-markup #0.2 "-40"}[ gis8^\markup { \pad-markup #0.2 "+21"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 13↓" }}] ~ gis2.} + { c'4^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }} cis'4^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }} f8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}[ g8^\markup { \pad-markup #0.2 "-35"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "IV"\normal-size-super " 3↑" }}] gis4^\markup { \pad-markup #0.2 "+48"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↑" }} } + + { ais8^\markup { \pad-markup #0.2 "-40"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↓" }}[ gis8^\markup { \pad-markup #0.2 "+21"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 13↓" }}]} \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise/767e70f0/lilypond/part_IV.ly b/resources/string_quartet_3_rise/767e70f0/lilypond/part_IV.ly index 85ee8f1..8074860 100644 --- a/resources/string_quartet_3_rise/767e70f0/lilypond/part_IV.ly +++ b/resources/string_quartet_3_rise/767e70f0/lilypond/part_IV.ly @@ -1,6 +1,6 @@ { - { c''2.^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "III"\normal-size-super " 1↑" }} ~ c''8[ cis''8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }}] } - \bar "|" - { c''8^\markup { \pad-markup #0.2 "-1"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 7↑" }}[ f8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}] ~ f2.} + { c'2.^\markup { \pad-markup #0.2 "-37"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 3↑" }} ~ c'8[ cis'8^\markup { \pad-markup #0.2 "-25"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 5↓" }}] } + + { c'8^\markup { \pad-markup #0.2 "-1"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "II"\normal-size-super " 7↑" }}[ f8^\markup { \pad-markup #0.2 "-38"}_\markup { \lower #3 \pad-markup #0.2 \concat{ "I"\normal-size-super " 1↑" }}] ~ } \bar "||" } \ No newline at end of file diff --git a/resources/string_quartet_3_rise_coda_only/4f53a446/lilypond/part_IV.pdf b/resources/string_quartet_3_rise_coda_only/4f53a446/lilypond/part_IV.pdf deleted file mode 100644 index 6aecdbde9f3e76304eff9e724cae77815eea745c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47841 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