diff --git a/README.md b/README.md index bb59e47..e4a57f5 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ The synthetizer matrix can be edited using [HexoSynth](https://github.com/WeirdC ## License -GNU AGPL v3, CopyLeft 2022 Pascal Engélibert, Nixon Cheng +GNU AGPL v3, CopyLeft 2022 Pascal Engélibert This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, version 3 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. diff --git a/assets/init.hxy b/assets/init.hxy index 3700a2f..8ba0f92 100644 --- a/assets/init.hxy +++ b/assets/init.hxy @@ -1 +1 @@ -{"VERSION":2,"atoms":[["tseq",0,"cmode",["i",0]],["sfilter",0,"ftype",["i",13]],["sfilter",1,"ftype",["i",6]],["sfilter",2,"ftype",["i",7]],["quant",0,"keys",["i",0]],["delay",0,"mode",["i",0]],["delay",1,"mode",["i",0]],["comb",0,"mode",["i",0]],["noise",0,"mode",["i",0]],["out",0,"mono",["i",0]],["ad",0,"mult",["i",0]],["ad",1,"mult",["i",1]],["ad",2,"mult",["i",0]],["ad",3,"mult",["i",0]],["amp",0,"neg_att",["i",1]],["amp",1,"neg_att",["i",1]],["amp",2,"neg_att",["i",1]],["amp",3,"neg_att",["i",1]],["bosc",0,"wtype",["i",3]]],"cells":[["ad",2,3,5,["trig",-1,-1],[-1,"sig","sig"]],["sin",1,4,3,[-1,-1,-1],[-1,"sig",-1]],["sin",0,4,4,[-1,-1,-1],["sig",-1,-1]],["ad",3,4,5,[-1,"trig",-1],["sig",-1,-1]],["amp",3,4,6,[-1,"inp","gain"],["sig",-1,-1]],["sin",2,5,2,[-1,-1,-1],[-1,-1,"sig"]],["mix3",0,5,3,["ch3","ch2","ch1"],["sig","sig","sig"]],["mix3",1,5,4,["ch1",-1,"gain1"],[-1,"sig",-1]],["mix3",5,5,5,[-1,-1,"ch1"],["sig",-1,-1]],["noise",0,6,2,[-1,-1,-1],[-1,-1,"sig"]],["sfilter",0,6,3,["freq",-1,"inp"],[-1,"sig",-1]],["ad",0,6,4,[-1,"inp",-1],[-1,"sig",-1]],["sfilter",1,6,5,[-1,"inp","freq"],[-1,"sig",-1]],["ad",1,7,3,[-1,"inp",-1],[-1,-1,"sig"]],["mix3",2,7,4,["ch2","ch1",-1],[-1,-1,"sig"]],["mix3",4,7,5,["ch1","ch2",-1],[-1,"sig","sig"]],["amp",0,7,6,["inp",-1,-1],[-1,"sig",-1]],["amp",1,8,6,[-1,"inp",-1],[-1,-1,"sig"]],["out",0,8,7,["ch2","ch1",-1],[-1,-1,-1]]],"params":[["ad",0,"ashp",0.8149999976158142],["ad",1,"ashp",0.41499999165534973],["ad",2,"ashp",0.36000004410743713],["ad",3,"ashp",1.0],["ad",0,"atk",15.0],["ad",1,"atk",8.0],["ad",2,"atk",1000.0],["ad",3,"atk",775.0],["amp",0,"att",1.0],["amp",1,"att",1.0],["amp",2,"att",0.390625],["amp",3,"att",1.0],["noise",0,"atv",0.1300000101327896],["mix3",0,"ch1",0.0],["mix3",1,"ch1",0.0],["mix3",2,"ch1",0.0],["mix3",3,"ch1",0.0],["mix3",4,"ch1",0.0],["mix3",5,"ch1",0.0],["out",0,"ch1",0.0],["mix3",0,"ch2",0.0],["mix3",1,"ch2",0.0],["mix3",2,"ch2",0.0],["mix3",3,"ch2",0.0],["mix3",4,"ch2",0.0],["mix3",5,"ch2",0.0],["out",0,"ch2",0.0],["mix3",0,"ch3",0.0],["mix3",1,"ch3",0.0],["mix3",2,"ch3",0.0],["mix3",3,"ch3",0.0],["mix3",4,"ch3",0.0],["mix3",5,"ch3",0.0],["tseq",0,"clock",0.0],["ad",0,"dcy",1000.0],["ad",1,"dcy",347.9999694824219],["ad",2,"dcy",488.9999694824219],["ad",3,"dcy",18.999998092651367],["sin",0,"det",0.0],["sin",1,"det",4.0],["sin",2,"det",7.0],["sin",3,"det",-0.0],["bosc",0,"det",0.0],["ad",0,"dshp",0.19500002264976501],["ad",1,"dshp",0.14000003039836884],["ad",2,"dshp",0.875],["ad",3,"dshp",0.2849999964237213],["delay",0,"fb",0.6499999761581421],["delay",1,"fb",0.5999999642372131],["quant",0,"freq",577.044189453125],["sin",0,"freq",440.0,0.0],["sin",1,"freq",440.0],["sin",2,"freq",440.0],["sin",3,"freq",0.4296875],["bosc",0,"freq",440.0],["sfilter",0,"freq",1900.0001220703125],["sfilter",1,"freq",440.0],["sfilter",2,"freq",880.0],["comb",0,"g",0.699999988079071],["amp",0,"gain",0.9999999403953552],["amp",1,"gain",0.9999999403953552],["amp",2,"gain",0.9999999403953552],["amp",3,"gain",0.42320001125335693],["out",0,"gain",0.08999998867511749],["mix3",0,"gain1",0.9999999403953552],["mix3",1,"gain1",0.9999999403953552],["mix3",2,"gain1",0.9999999403953552],["mix3",3,"gain1",0.7616416215896606],["mix3",4,"gain1",0.9999999403953552],["mix3",5,"gain1",0.9999999403953552],["mix3",0,"gain2",0.9999999403953552],["mix3",1,"gain2",0.9999999403953552],["mix3",2,"gain2",0.9999999403953552],["mix3",3,"gain2",0.9999999403953552],["mix3",4,"gain2",2.0],["mix3",5,"gain2",0.9999999403953552],["mix3",0,"gain3",0.9999999403953552],["mix3",1,"gain3",0.9999999403953552],["mix3",2,"gain3",0.9999999403953552],["mix3",3,"gain3",0.9999999403953552],["mix3",4,"gain3",0.9999999403953552],["mix3",5,"gain3",0.9999999403953552],["amp",0,"inp",0.0],["amp",1,"inp",0.0],["amp",2,"inp",0.0],["amp",3,"inp",0.0],["ad",0,"inp",1.0],["ad",1,"inp",1.0],["ad",2,"inp",1.0],["ad",3,"inp",1.0],["delay",0,"inp",0.0],["delay",1,"inp",0.0],["comb",0,"inp",0.0],["sfilter",0,"inp",0.0],["sfilter",1,"inp",0.0],["sfilter",2,"inp",0.0],["delay",0,"mix",0.5],["delay",1,"mix",0.5],["quant",0,"oct",0.0],["noise",0,"offs",0.0],["mix3",0,"ogain",0.9999999403953552],["mix3",1,"ogain",0.10315494984388351],["mix3",2,"ogain",0.9999999403953552],["mix3",3,"ogain",0.9999999403953552],["mix3",4,"ogain",0.9999999403953552],["mix3",5,"ogain",0.9999999403953552],["bosc",0,"pw",0.5,-0.25999999046325684],["sfilter",0,"res",0.5],["sfilter",1,"res",0.9099999666213989],["sfilter",2,"res",0.0],["tslfo",0,"rev",0.5],["tslfo",1,"rev",0.5],["tslfo",2,"rev",0.5],["tslfo",3,"rev",0.5],["tslfo",0,"time",1699.99951171875],["tslfo",1,"time",22999.99609375],["tslfo",2,"time",19999.994140625],["tslfo",3,"time",499.99993896484375],["delay",0,"time",256.70001220703125,0.009999999776482582],["delay",1,"time",249.99998474121094,-0.007999999448657036],["comb",0,"time",24.999996185302734],["tseq",0,"trig",0.0],["ad",0,"trig",0.0],["ad",1,"trig",0.0],["ad",2,"trig",0.0],["ad",3,"trig",0.0],["tslfo",0,"trig",0.0],["tslfo",1,"trig",0.0],["tslfo",2,"trig",0.0],["tslfo",3,"trig",0.0],["delay",0,"trig",0.0],["delay",1,"trig",0.0]],"patterns":[{"col_types":[1,3,0,0,0,0],"cursor_col":2,"cursor_row":2,"data":[[60,4071,-1,-1,-1,-1],[64,4071,-1,-1,-1,-1],[69,4071,-1,-1,-1,-1],[-1,4071,-1,-1,-1,-1],[72,4071,-1,-1,-1,-1],[76,4071,-1,-1,-1,-1],[84,4071,-1,-1,-1,-1],[-1,4071,-1,-1,-1,-1],[60,4071,-1,-1,-1,-1],[64,4071,-1,-1,-1,-1],[79,4071,-1,-1,-1,-1],[-1,4071,-1,-1,-1,-1],[72,4071,-1,-1,-1,-1],[76,4071,-1,-1,-1,-1],[65,4071,-1,-1,-1,-1],[-1,4071,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1]],"edit_step":4,"rows":16},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"props":[]} +{"VERSION":2,"atoms":[["tseq",0,"cmode",["i",0]],["sfilter",0,"ftype",["i",8]],["delay",0,"mode",["i",0]],["delay",1,"mode",["i",0]],["out",0,"mono",["i",0]],["ad",0,"mult",["i",0]],["amp",0,"neg_att",["i",1]],["amp",1,"neg_att",["i",1]],["bosc",0,"wtype",["i",3]]],"cells":[["sin",1,1,2,[-1,-1,-1],[-1,"sig",-1]],["sin",0,1,3,[-1,-1,-1],["sig",-1,-1]],["sin",2,2,2,[-1,-1,-1],[-1,-1,"sig"]],["mix3",0,2,3,["ch3","ch2","ch1"],[-1,"sig",-1]],["ad",0,3,3,[-1,"inp",-1],[-1,"sig","sig"]],["amp",0,3,4,["inp",-1,-1],[-1,"sig",-1]],["amp",1,4,4,[-1,"inp",-1],[-1,-1,"sig"]],["out",0,4,5,["ch2","ch1",-1],[-1,-1,-1]]],"params":[["ad",0,"ashp",0.8149999976158142],["ad",0,"atk",15.0],["amp",0,"att",1.0],["amp",1,"att",1.0],["mix3",0,"ch1",0.0],["out",0,"ch1",0.0],["mix3",0,"ch2",0.0],["out",0,"ch2",0.0],["mix3",0,"ch3",0.0],["tseq",0,"clock",0.0],["ad",0,"dcy",1000.0],["sin",0,"det",0.0],["sin",1,"det",4.0],["sin",2,"det",7.0],["bosc",0,"det",0.0],["ad",0,"dshp",0.19500002264976501],["delay",0,"fb",0.6499999761581421],["delay",1,"fb",0.5999999642372131],["sin",0,"freq",440.0,0.0],["sin",1,"freq",440.0],["sin",2,"freq",440.0],["bosc",0,"freq",440.0],["sfilter",0,"freq",1900.0001220703125],["amp",0,"gain",0.9999999403953552],["amp",1,"gain",0.9999999403953552],["out",0,"gain",0.08999998867511749],["mix3",0,"gain1",0.9999999403953552],["mix3",0,"gain2",0.9999999403953552],["mix3",0,"gain3",0.9999999403953552],["amp",0,"inp",0.0],["amp",1,"inp",0.0],["ad",0,"inp",1.0],["delay",0,"inp",0.0],["delay",1,"inp",0.0],["sfilter",0,"inp",0.0],["delay",0,"mix",0.5],["delay",1,"mix",0.5],["mix3",0,"ogain",0.9999999403953552],["bosc",0,"pw",0.5,-0.25999999046325684],["sfilter",0,"res",0.5],["tslfo",0,"rev",0.5],["tslfo",1,"rev",0.5],["tslfo",2,"rev",0.5],["tslfo",3,"rev",0.5],["tslfo",0,"time",1699.99951171875],["tslfo",1,"time",22999.99609375],["tslfo",2,"time",19999.994140625],["tslfo",3,"time",499.99993896484375],["delay",0,"time",256.70001220703125,0.009999999776482582],["delay",1,"time",249.99998474121094,-0.007999999448657036],["tseq",0,"trig",0.0],["ad",0,"trig",0.0],["tslfo",0,"trig",0.0],["tslfo",1,"trig",0.0],["tslfo",2,"trig",0.0],["tslfo",3,"trig",0.0],["delay",0,"trig",0.0],["delay",1,"trig",0.0]],"patterns":[{"col_types":[1,3,0,0,0,0],"cursor_col":2,"cursor_row":2,"data":[[60,4071,-1,-1,-1,-1],[64,4071,-1,-1,-1,-1],[69,4071,-1,-1,-1,-1],[-1,4071,-1,-1,-1,-1],[72,4071,-1,-1,-1,-1],[76,4071,-1,-1,-1,-1],[84,4071,-1,-1,-1,-1],[-1,4071,-1,-1,-1,-1],[60,4071,-1,-1,-1,-1],[64,4071,-1,-1,-1,-1],[79,4071,-1,-1,-1,-1],[-1,4071,-1,-1,-1,-1],[72,4071,-1,-1,-1,-1],[76,4071,-1,-1,-1,-1],[65,4071,-1,-1,-1,-1],[-1,4071,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1]],"edit_step":4,"rows":16},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"props":[]} diff --git a/src/audio.rs b/src/audio.rs index 767b309..f8400f6 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -33,18 +33,9 @@ pub fn setup(event_channel: Receiver) { let color_mix_b_gain = color_mix.inp_param("gain3").unwrap(); let jump_ad = NodeId::Ad(0); let jump_ad_trig = jump_ad.inp_param("trig").unwrap(); - let switch_ad = NodeId::Ad(1); - let switch_ad_trig = switch_ad.inp_param("trig").unwrap(); - let fusion_ad = NodeId::Ad(2); - let fusion_ad_trig = fusion_ad.inp_param("trig").unwrap(); - let fusion_ad2 = NodeId::Ad(3); - let fusion_ad2_trig = fusion_ad2.inp_param("trig").unwrap(); - for (_tick, _now) in Clock::framerate(20.0).iter() { + for (_tick, _now) in Clock::framerate(10.0).iter() { matrix.set_param(jump_ad_trig, (0.0).into()); - matrix.set_param(switch_ad_trig, (0.0).into()); - matrix.set_param(fusion_ad_trig, (0.0).into()); - matrix.set_param(fusion_ad2_trig, (0.0).into()); if let Ok(msg) = event_channel.try_recv() { match msg { @@ -53,12 +44,7 @@ pub fn setup(event_channel: Receiver) { matrix.set_param(color_mix_g_gain, g.into()); matrix.set_param(color_mix_b_gain, b.into()); } - AudioMsg::Fusion => { - matrix.set_param(fusion_ad_trig, (1.0).into()); - matrix.set_param(fusion_ad2_trig, (1.0).into()); - } AudioMsg::Jump => matrix.set_param(jump_ad_trig, (1.0).into()), - AudioMsg::Switch => matrix.set_param(switch_ad_trig, (1.0).into()), } } } diff --git a/src/game.rs b/src/game.rs index a265f88..0b0d139 100644 --- a/src/game.rs +++ b/src/game.rs @@ -6,18 +6,16 @@ pub use crate::filters::*; use crate::AppState; use bevy::{ - ecs::system::EntityCommands, input::{keyboard::KeyCode, Input}, prelude::{shape::Quad, *}, sprite::Mesh2dHandle, }; use bevy_rapier2d::prelude::*; +use std::collections::BTreeSet; pub enum AudioMsg { Color([f32; 3]), - Fusion, Jump, - Switch, } #[derive(Clone, Copy, Eq, Hash, PartialEq)] @@ -38,14 +36,13 @@ impl Plugin for GamePlugin { .add_system_set( SystemSet::on_update(AppState::Game) .with_system(crate::levels::post_setup_level) - .with_system(change_character_system) - .with_system(player_movement_system) + .with_system(keyboard_input_system) .with_system(move_camera) .with_system(character_particle_effect_system), ) .add_system_set( SystemSet::on_update(AppState::Win) - .with_system(player_movement_system) + .with_system(keyboard_input_system) .with_system(move_camera) .with_system(character_particle_effect_system), ) @@ -84,11 +81,17 @@ impl FromWorld for CharacterMeshes { #[derive(Component)] pub struct Level; -#[derive(Clone, Component, PartialEq)] -pub struct CharacterColor(pub Color); +#[derive(Clone, Component, Copy, Eq, Hash, Ord, PartialEq, PartialOrd)] +pub struct CharacterId(pub u32); + +#[derive(Clone, Component, Copy, Eq, Hash, PartialEq)] +pub struct SelectedCharacterId(pub Option); #[derive(Component)] -pub struct Player; +pub struct CharacterIdList(pub BTreeSet); + +#[derive(Clone, Component, PartialEq)] +pub struct CharacterColor(pub Color); // Systems @@ -108,49 +111,36 @@ fn setup( ); } -pub fn spawn_characters>( - commands: &mut Commands, - character_meshes: &Res, - materials: &mut ResMut>, - audio: &Res>, - - characters: I, -) { - for (i, (transform, color)) in characters.into_iter().enumerate() { - spawn_character( - commands, - character_meshes, - materials, - audio, - transform, - color, - i == 0, - ); - } -} - pub fn spawn_character( commands: &mut Commands, character_meshes: &Res, materials: &mut ResMut>, + selected_character_id: &mut Mut, + character_id_list: &mut Mut, audio: &Res>, mut transform: Transform, color: Color, - is_player: bool, ) { transform.translation.z = transform.translation.z.max(1.0); - let color_mesh_2d_bundle: ColorMesh2dBundle = ColorMesh2dBundle { - mesh: character_meshes.square.clone(), - material: materials.add(ColorMaterial::from(color)), - transform, - ..default() - }; + let character_id = CharacterId( + character_id_list + .0 + .iter() + .last() + .map_or(0, |last_character_id| last_character_id.0 + 1), + ); + character_id_list.0.insert(character_id); - let mut entity_commands: EntityCommands = commands.spawn_bundle(color_mesh_2d_bundle); - - entity_commands + commands + .spawn_bundle(ColorMesh2dBundle { + mesh: character_meshes.square.clone(), + material: materials.add(ColorMaterial::from(color)), + transform, + ..default() + }) .insert(Level) + .insert(character_id) .insert(CharacterColor(color)) .insert(RigidBody::Dynamic) .insert(Collider::cuboid(32., 32.)) @@ -166,8 +156,9 @@ pub fn spawn_character( .insert(ExternalImpulse::default()) .insert(ActiveEvents::COLLISION_EVENTS); - if is_player { - entity_commands.insert(Player); + // If no character is selected, then select this one + if selected_character_id.0.is_none() { + selected_character_id.0 = Some(character_id); audio .send(AudioMsg::Color([color.r(), color.g(), color.b()])) .ok(); @@ -179,18 +170,24 @@ fn collision_event_system( character_meshes: Res, mut materials: ResMut>, mut collision_events: EventReader, - character_query: Query<(&CharacterColor, &Transform, Option<&Player>)>, + character_query: Query<(&CharacterId, &CharacterColor, &Transform)>, + mut level_query: Query<(&mut SelectedCharacterId, &mut CharacterIdList)>, mut app_state: ResMut>, audio: Res>, ) { for collision_event in collision_events.iter() { if let CollisionEvent::Started(e1, e2, flags) = collision_event { if flags.is_empty() { - if let ( - Ok((c1_color, c1_transform, c1_player)), - Ok((c2_color, c2_transform, c2_player)), - ) = (character_query.get(*e1), character_query.get(*e2)) + if let (Ok((c1_id, c1_color, c1_transform)), Ok((c2_id, c2_color, _c2_transform))) = + (character_query.get(*e1), character_query.get(*e2)) { + let (mut selected_character_id, mut character_id_list) = + level_query.single_mut(); + character_id_list.0.remove(c1_id); + character_id_list.0.remove(c2_id); + selected_character_id.0 = None; + + // TODO completely remove particles commands.entity(*e1).despawn_recursive(); commands.entity(*e2).despawn_recursive(); @@ -204,93 +201,70 @@ fn collision_event_system( app_state.replace(AppState::Win).ok(); } - // position character based on current player location spawn_character( &mut commands, &character_meshes, &mut materials, + &mut selected_character_id, + &mut character_id_list, &audio, - if c1_player.is_some() { - *c1_transform - } else if c2_player.is_some() { - *c2_transform - } else { - Transform::identity().with_translation( - (c1_transform.translation + c2_transform.translation) / 2., - ) - }, + *c1_transform, new_color.into(), - c1_player.is_some() || c2_player.is_some(), ); - - audio.send(AudioMsg::Fusion).ok(); } } } } } -fn change_character_system( - mut commands: Commands, - +fn keyboard_input_system( keyboard_input: Res>, - characters: Query<(Entity, &CharacterColor, Option<&Player>)>, - audio: Res>, -) { - if !keyboard_input.just_pressed(KeyCode::Tab) { - return; - } - - let mut player_idx: usize = 0; - let mut player_count: usize = 0; - - // find player idx - for (_entity, _color, player) in characters.iter() { - if player.is_some() { - player_idx = player_count; - } - player_count += 1; - } - - // calculate next player index - let next_player_idx = (player_idx + 1) % player_count; - player_count = 0; - - // exchange `Player` component from old `player_idx` to new `next_player_idx` - for (entity, color, _player) in characters.iter() { - if player_count == player_idx { - commands.entity(entity).remove::(); - } - - if player_count == next_player_idx { - commands.entity(entity).insert(Player); - audio - .send(AudioMsg::Color([color.0.r(), color.0.g(), color.0.b()])) - .ok(); - audio.send(AudioMsg::Switch).ok(); - } - - player_count += 1; - } -} - -fn player_movement_system( - keyboard_input: Res>, - mut characters: Query<&mut Velocity, With>, + mut characters: Query<(&CharacterId, &mut Velocity, &CharacterColor)>, + mut level_query: Query<(&mut SelectedCharacterId, &CharacterIdList)>, mut app_state: ResMut>, audio: Res>, ) { - let right_pressed: bool = - keyboard_input.pressed(KeyCode::Right) || keyboard_input.pressed(KeyCode::D); - let left_pressed: bool = - keyboard_input.pressed(KeyCode::Left) || keyboard_input.pressed(KeyCode::A); + if let Ok((mut selected_character_id, character_id_list)) = level_query.get_single_mut() { + if keyboard_input.just_pressed(KeyCode::Tab) { + let selected = if let Some(selected_character_id) = &mut selected_character_id.0 { + *selected_character_id = *character_id_list + .0 + .range(*selected_character_id..) + .nth(1) + .unwrap_or_else(|| character_id_list.0.iter().next().unwrap()); + *selected_character_id + } else { + selected_character_id.0 = Some(CharacterId(0)); + CharacterId(0) + }; - for mut velocity in characters.iter_mut() { - velocity.linvel.x = 200. * (right_pressed as i8 - left_pressed as i8) as f32; + if let Some((_character_id, _velocity, color)) = characters + .iter_mut() + .find(|(character_id, _velocity, _color)| **character_id == selected) + { + audio + .send(AudioMsg::Color([color.0.r(), color.0.g(), color.0.b()])) + .ok(); + } + } - if keyboard_input.just_pressed(KeyCode::Space) { - audio.send(AudioMsg::Jump).ok(); - velocity.linvel.y = 500.; + let right_pressed: bool = + keyboard_input.pressed(KeyCode::Right) || keyboard_input.pressed(KeyCode::D); + let left_pressed: bool = + keyboard_input.pressed(KeyCode::Left) || keyboard_input.pressed(KeyCode::A); + + if let Some(selected_character_id) = &selected_character_id.0 { + if let Some((_character_id, mut velocity, _color)) = characters + .iter_mut() + .find(|(character_id, _velocity, _color)| *character_id == selected_character_id) + { + velocity.linvel.x = 200. * (right_pressed as i8 - left_pressed as i8) as f32; + + if keyboard_input.just_pressed(KeyCode::Space) { + audio.send(AudioMsg::Jump).ok(); + velocity.linvel.y = 500.; + } + } } } @@ -300,12 +274,20 @@ fn player_movement_system( } fn character_particle_effect_system( - characters: Query<(&Transform, &CharacterColor), With>, + mut characters: Query<(&CharacterId, &Transform, &CharacterColor)>, mut particle_effect: ResMut, + mut level_query: Query<&SelectedCharacterId>, ) { - for (transform, color) in characters.iter() { - particle_effect.translation = transform.translation; - particle_effect.color = color.0; + if let Ok(selected_character_id) = level_query.get_single_mut() { + if let Some(selected_character_id) = &selected_character_id.0 { + if let Some((_character_id, transform, color)) = characters + .iter_mut() + .find(|(character_id, _transform, _color)| *character_id == selected_character_id) + { + particle_effect.translation = transform.translation; + particle_effect.color = color.0; + } + } } } @@ -329,25 +311,31 @@ fn win_setup(mut commands: Commands, asset_server: Res) { fn move_camera( mut camera_query: Query<(&Camera, &mut Transform)>, - characters: Query<&Transform, (Without, With)>, + characters: Query<(&CharacterId, &Transform), Without>, + level_query: Query<&SelectedCharacterId>, time: Res