diff --git a/.gitignore b/.gitignore index 6d1a850..98bf95a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,11 @@ node_modules/ -node_modules/rx/ts/core/observable.ts deps/ -config/ dist/ build/ +config/ +server/public/ +vis/ +vis/media/ +package-lock.json +asd .DS_Store -vis/media/ \ No newline at end of file diff --git a/Readme.md b/Readme.md index c283b88..73ec6ee 100755 --- a/Readme.md +++ b/Readme.md @@ -1,151 +1,135 @@ -# Updates -### Global controls and Pattern History (Experimental) -There are now two sections dedicated to appending and prepending to the running code. `ctrl+enter` activates the code and sections can be recalled by creating presets. `shift+click` overwrites the presets and pressing `rec` creates a new one. -These parameters directly access to the patterns in the history. (i.e active patterns) -There is now a dedicated channel called `G` to sequence the channels you want to include within global controls. You can specify the index of global and channels like : "1 `1 2 4`" where first `1` is the index of global and `1 2 4` are the channel numbers. +# Siren +*Siren*, is a tracker interface that embodies abstractions where programming is realized as the medium for pattern sequencing in a modular fashion. It is based on a hierarchical structure that consists of scenes and channels. Separate channels have independent patterns; a complete song consists of a master list of repeated patterns. In addition to pattern composition, *Siren* supports programming variations of and transitions between patterns. -# Siren +Supported programming languages : +SuperCollider +Haskell/TidalCycles -*Siren*, a software environment that fills the gap between live coding performance and algorithmic composition. It is based on a hierarchical structure and a tracker-inspired user interface on top of the [TidalCycles](https://github.com/tidalcycles/Tidal/) language for pattern programming. In addition to pattern composition, *Siren* supports programming variations of and transitions between patterns. -**Note:** This is a beta release (*v0.3*). If you come across a bug, please do submit an `issue` on this page, and/or create a `pull request` of you feel like participating in its development. -## Download +**Note:** This is a beta release (*v0.5*), and it has not been tested comprehensively. If you come across a bug, please do [submit an `issue` ](https://github.com/cannc4/Siren/issues/new), and/or create a `pull request` of you feel like participating in its development. -In order to download a copy of the repository, either download repository `as a ZIP file` at [https://github.com/cannc4/sq](github.com/cannc4/sq), or use command line to `clone` repository. +## Download +You can get *Siren* either by downloading repository `as a ZIP file` at [https://github.com/cannc4/siren](github.com/cannc4/siren), or by using the command line to `clone` the repository. -``` +```shell git clone https://github.com/cannc4/Siren.git ``` ## Build and Run - -### Dependencies: +#### Dependencies: Make sure the latest versions of following software are installed for your system user - - [SuperCollider](http://supercollider.github.io/download.html) -- [NodeJS](https://nodejs.org/en/download/) +- [NodeJS](https://nodejs.org/en/download/) ++ Make sure `npm` is globally installed with `NodeJS` - [TidalCycles](https://tidalcycles.org/getting_started.html) Then follow these lines to install package dependencies: +```shell +cd path/to/downloaded/repo +npm i +``` + ``` -cd path/to/siren -npm i +In order to bind software dependencies, edit full paths in config/config.json according to your file system formatting and save the file. Copy paste your startup files to scd-start-default.scd and tidal-boot-default.hs into config folder or set the appropriate paths in config.json + +Note that it's possible to target required paths using the `Settings` module in the interface. ``` -In order to bind software dependencies, edit full paths in `config/config.json` according to your file system formatting and save the file. -Copy paste your startup files to `scd-start-default.scd` and `tidal-boot-default.hs` into config folder or set the appropriate paths in `config.json` -**## Note:** Make sure SuperCollider is either idle or closed before moving on. +**Note:** Make sure SuperCollider is either idle or closed before moving on. Now you can start the interface -``` +```shell npm start ``` - and initialize the backend -``` + +```shell npm run siren ``` -then go to `http://localhost:3000/` or `http://127.0.0.1:3000/` in your browser (tested on Chrome) - -*Tested on Windows 10 and MacOSX El Capitan* -## Usage +then go to `http://localhost:3000/` or `http://127.0.0.1:3000/` in your browser +*Tested with Chrome on Windows 10 and MacOSX El Capitan* -![](src/assets/readme_images/panel.png) -- Login / Logout to the system using Github authentication -- Boot `SuperCollider` by pressing the square button - + The button will turn into a circle once it successfully boots (check console for possible errors) -- Start all timers with `play` button +## Modules -## Scenes -| ![](src/assets/readme_images/scenes.png) | ![](src/assets/readme_images/channel.png) | ![](src/assets/readme_images/patterns.png) | -|---|---|---| -| **Figure (a)** | **Figure (b)** | **Figure (c)** | +### Scenes -### Duration and Timer +Scenes are the core of `Siren` and a scene serves as a framework to the composition. Each scene comprises of unique channels, global modifiers and patterns. -Duration of each channel can be specified using the textarea next to channel number on top of the grid. Duration is the time it takes to reach the last step in seconds. +*example in Figure (a)*- Textbox for scene name - `Update`/`Add` button- `Clear Matrix` button -`ctrl + enter` starts selected timer and `shift + enter` stops it. -Alternatively, `ctrl + channel number` starts the desired channel and `shift + channel number` stops it. +### Sequencer (aka Matrix) +#### Channels -*examples in Figure (b)* -- Channel number (i.e. `2`) -- Channel duration (i.e. `20` seconds) +Channels can be added using the `Channel` module layout and consists of `type`, `name`, `step` and `transition` parameters. Once a channel is added to the sequencer, the parameters and layout can be adjusted dynamically. Each cell is a textbox allowing any type of text input. Patterns can be looked up from the dictionary with their names and parameters. When a cell is active, it triggers the pattern with appropriate name and applies parameters in an ordered fashion. See `parameters` for various types. +The syntax to be used for encoding patterns in each entry in the pattern dictionary is determined by the channel definition, which determines the language in which the pattern will be written. -### Dictionary +###Channel +Please note that channels has to be defined appropriately in `tidal-boot-default.hs` or compiled using `console`. -Tidal patterns are stored in the `dictionary` on the right hand side of the interface. Please omit the channel number and dollar sign on Tidal commands (instead of `d1 $ sound "bd"` just write `sound "bd"`). +**Transitions:** Transition functions for TidalCycles +*example in Figure (b)*- Transition function (i.e. `(clutchIn 4)`) +**Steps:** Initial step number of channel +**Type:** Channel type, possible types; SCSynth, MIDI, Visual -*example in Figure (c)* -- Patterns named `bt2`, `jvv`, `jvbass`, and `lax` with corresponding Tidal commands and 2, 1, 0 and 1 parameters, respectively. +#### Cells +Cells of the channels serve as a canvas for pattern names and pattern parameters. -### Pattern Functions +### Pattern Parameters -Patterns can be looked up from the dictionary with their names and parameters. See `parameters` for various types. +Siren allows patterns to be parameterized and can be called with different parameters from different cells in the channel. -*example in Figure (b)* -- Pattern functions in cells (i.e. ```bt2 `every 2(#coarse 12)` `c` ```) +### Random Parameters +`|x,y|` returns a random value within the `x` and `y` +## Patterns +Disclaimer: Please omit the channel number and dollar sign on Tidal commands (instead of `d1 $ sound "bd"` just write `sound "bd"`) -### Transitions -Transitions are stored in the bottom row of the grid and are unique for each scene. +Tidal patterns are stored in the `dictionary` on the right hand side of the interface. This dictionary is unique for each scene and interacts with the sequencer in terms of parameters and calls. -*example in Figure (b)* -- Transition function (i.e. `(clutchIn 4)`) +#### Temporal parameter + `t` represents the temporal parameter for each timer and it can be used in expressions to create complex values, especially with math expressions. -### Song mode -If toggled, scenes are iterated top-down fashion based on their ordering. It updates the active scene by writing its grid and dictionary once all timers reach to the last step of the scene. +#### Mathematical expressions +Mathematical expressions can be used in the patterns in the dictionary, parser evaluates the expressions when enclosed with `&` symbol.*example in Figure (c)*- Math expression enclosed by `& ... &` (i.e. in the body of `jvv`: ```... [~ f3 &`t`%3 &] ~ ...```) -- To save a new scene, input a name and click on `Add` button. It'll create a new item in the list below. -- Update your saved grid and dictionary by inputting the active scene's name to the textbox and clicking on `Update` button. -- Use `arrow keys` next to the item to reorder. -- Press ` x ` button if you want to delete the scene all together. -*example in Figure (a)* -- Textbox for scene name (i.e. `docs`) -- `Update`/`Add` button -- `Clear Matrix` button -- `Start`/`Stop Songmode` to enable above feature -- Scenes are itemized with `delete` and `reorder` functionalities +#### Value Parameters +Any character sequence inside Siren pattern can be parameterized by surrounding desired spot with \` symbol (like surrounding a phrase for Markdown code block). Using this feature, you can not only pass well-tuned values dynamically, but also pass anything you want. -## Parameters -### Mathematical expressions -Mathematical expressions can be used in the patterns in the dictionary, parser evaluates the expressions when enclosed with `&` symbol. +```haskell +n `x` # s `y` +``` +This can be called with any `x`or `y` value such as (assume it's named as `sq`): +``` sq `"{3*4}%3"` `"bd"` ``` +or +``` sq `"{3*4 4*2}%3"` `"bd"` ``` -*example in Figure (c)* -- Math expression enclosed by `& ... &` (i.e. in the body of `jvv`: ```... [~ f3 &`t`%3 &] ~ ...```) +### Pattern History +This module stores the successfully compiled patterns to keep track of the running sequences and serves as a container for the global modifiers. -### Value Parameters -Any character sequence inside Tidal command can be parameterized by surrounding desired spot with \` symbol (like surrounding a phrase for Markdown code block). Using this feature, you can not only pass well-tuned values dynamically, but also pass anything you want. +### Console +This module serves as a CLI(Command-Line-Interface) to Haskell and SuperCollider -```n `x` # s `y` ``` +### Global Modifiers -This can be called with any ``` `x` ``` or ``` `y` ``` value such as (assume it's named as `sq`): -``` sq `"{3*4}%3"` `"bd"` ``` or -``` sq `"{3*4 4*2}%3"` `"bd"` ``` or -``` sq `"{3*4 4*2}%3"` `"bd"` ``` +This is an experimental module that can be toggled using right click menu. There are two sections dedicated to appending and prepending to the running code. `ctrl+enter` activates the code and sections can be recalled by creating presets. Pressing `Rec` button saves the active modifiers. `shift+ click` clears the desired slot and `alt+ click` overwrites it. These modifiers are applied to the patterns shown in the pattern history section. (i.e active patterns)Channels that you want to modify can also be specified using the `channel` section in the submenu. Writing `1 2` will make the modifiers only affect the first two channels, `0` is a special case and means that modifiers will be applied to all channels in the scene. -### Random Parameters -``` `[x,y]` ``` returns a random value within the `x` and `y` boundaries `[x,y)`. +### Settings +In this module, it’s possible to set various settings of Siren such as startup configs or various paths. -### Temporal Parameter -``` `t` ``` represents the temporal parameter for each timer and it can be used in expressions to create complex values, especially with math expressions. +### Debug Console +This module serves as a debug console for GHC. -## Notes -- Pause timers for a few seconds if you see too much flood in GHC terminal. (stack gets full) -- `npm run siren` starts up the server - it's not required if you want to refresh the interface however you need to manually close node and restart it if `scsynth` crashes -- As each cell contains a pattern, having a timer duration like 4 seconds doesn't really makes sense if you have 8 steps (i.e. 4/8 seconds per step) +##Notes ## Known Bugs -- Editing parameters in the patterns fails when timer is active -## TODO -- Config generator -- boot/shut down server from the interface + + diff --git a/config/config.json b/config/config.json old mode 100755 new mode 100644 index d551950..5144b95 --- a/config/config.json +++ b/config/config.json @@ -1,12 +1 @@ -{ - "userpath": "/Users/canince", - "debug": true, - "ghcipath": "/Library/Frameworks/GHC.framework/Versions/8.0.1-x86_64/usr/bin/ghci-8.0.1", - "sclang": "/Applications/SuperCollider/SuperCollider.app/Contents/MacOS/sclang", - "scsynth": "/Applications/SuperCollider/SuperCollider.app/Contents/Resources/scsynth", - "sclang_conf": "/Users/canince/Library/Application Support/SuperCollider/sclang_conf.yaml", - "port": 3001, - "path" : "/Users/canince/Documents/git/Siren/config/config.json", - "tidal_boot": "/Users/canince/Documents/git/Siren/config/tidal-boot-default.hs", - "scd_start": "/Users/canince/Documents/git/Siren/config/scd-start-default.scd" -} +{"debug":true,"ghcipath":"/Library/Frameworks/GHC.framework/Versions/8.2.1-x86_64/usr/bin/ghci-8.2.1","path":"/Users/canince/Documents/github/Siren/config/config.json","port":3001,"samples_path":"/Users/canince/desktop/pool1/*","scd_start":"/Users/canince/Documents/github/Siren/config/scd-start-default.scd","sclang":"/Applications/SuperCollider/SuperCollider.app/Contents/MacOS/sclang","sclang_conf":"/Users/canince/Library/Application Support/SuperCollider/sclang_conf.yaml","scsynth":"/Applications/SuperCollider/SuperCollider.app/Contents/Resources/scsynth","tidal_boot":"/Users/canince/Documents/github/Siren/config/tidal-boot-default.hs","tidal_sync":"/Users/canince/Documents/github/Siren/server/sync.hs","userpath":"/Users/canince"} \ No newline at end of file diff --git a/config/scd-start-default.scd b/config/scd-start-default.scd old mode 100755 new mode 100644 index 6df26fb..0379f55 --- a/config/scd-start-default.scd +++ b/config/scd-start-default.scd @@ -1,77 +1,13 @@ ( s.options.numInputBusChannels = 6; -s.options.numOutputBusChannels = 14; -s.options.numBuffers = 2048 * 32; +s.options.numOutputBusChannels = 16; +s.options.numBuffers = 2048 * 64; s.options.maxNodes = 1024 * 32; -s.options.memSize_(65536 * 16); -//s.recorder.recHeaderFormat = "WAV"; +s.options.memSize = 131072 * 16; s.quit; s.waitForBoot { - ~dirt = SuperDirt(2, s); - ~dirt.loadSoundFiles("/Users/canince/dropbox/whalehouse/99s/*"); - s.sync; - ~dirt.start(57120, (0,2 .. 7)); - s.sync; - "SUPERDIRT LOADED".postln; - StageLimiter.activate; - 3.wait; - SuperDirt.default = ~dirt; - TempoClock.default.tempo = 120/60; - 1.wait; - s.makeGui; - s.meter; - s.scope; - s.latency = 0.3; - "/Users/canince/documents/git/Siren/deps/SynthDefs/experimentsc.scd".load; - 0.2.wait; - "SIREN LOADED".postln; - - //Compressor Side Chain - /*~bus1.free; - ~bus2.free; - ~bus3.free; - ~bus1 = Bus.new('audio',5,2); - ~bus2 = Bus.new('audio',6,2); - ~bus3 = Bus.new('audio',7,2); - ~dirt.orbits[4].outBus = ~bus1; // play into that bus. - ~dirt.orbits[0].outBus = ~bus2; // play into that bus. - ~dirt.orbits[1].outBus = ~bus3; // play into that bus. - b= Ndef(\b, { - var control = InBus.ar(~dirt.orbits[2].dryBus, 2).sum; - var dirt = InBus.ar(~bus1); - Compander.ar(dirt, control, thresh:0.03, slopeBelow:1, slopeAbove: 0.1, clampTime:0.002, relaxTime:0.05) - }); - b.playN( - outs:[8,9] - ); - -a= Ndef(\a, { - var control = InBus.ar(~dirt.orbits[2].dryBus, 2).sum; - var dirt = InBus.ar(~bus2); - Compander.ar(dirt, control, thresh:0.04, slopeBelow:1, slopeAbove: 0.1, clampTime:0.02, relaxTime:0.1) - }); - a.playN( - outs:[0,1] - ); - - c= Ndef(\c, { - var control = InBus.ar(~dirt.orbits[2].dryBus, 2).sum; - var dirt = InBus.ar(~bus3); - Compander.ar(dirt, control, thresh:0.04, slopeBelow:1, slopeAbove: 0.1, clampTime:0.02, relaxTime:0.1) - }); - c.playN( - outs:[2,3] - );*/ -/*~bus.free; -~bus = Bus.audio(s, numChannels:2); // assuming stereo, expand if needed -~dirt.orbits[0].outBus = ~bus; // play into that bus. -Ndef(\x, { - var control = InBus.ar(~dirt.orbits[1].dryBus, 2).sum; - var dirt = InBus.ar(~bus, 2); - Compander.ar(dirt, control, thresh:0.01, slopeBelow:1, slopeAbove: 0.1, clampTime:0.02, relaxTime:0.1) - }).play; -};*/ - }; + SuperDirt.start; +} ) diff --git a/config/tidal-boot-default.hs b/config/tidal-boot-default.hs old mode 100755 new mode 100644 index 43700e2..1cde8ee --- a/config/tidal-boot-default.hs +++ b/config/tidal-boot-default.hs @@ -1,32 +1,13 @@ :set prompt "" :module Sound.Tidal.Context -import qualified Sound.Tidal.Scales as Scales -import Sound.OSC.FD -import Sound.Tidal.MIDI.Context -import Sound.Tidal.MIDI.Output -import Sound.Tidal.MIDI.Machinedrum +import Sound.Tidal.Utils +import Sound.Tidal.Scales +import Sound.Tidal.Chords import Data.Maybe - -import DxSevenOSC -z1 <- dxStream - -procF_t <- openUDP "127.0.0.1" 12000 -procF_v <- openUDP "127.0.0.1" 12000 -procS1 <- openUDP "127.0.0.1" 12000 -procS2 <- openUDP "127.0.0.1" 12000 -procS3 <- openUDP "127.0.0.1" 12000 -procS4 <- openUDP "127.0.0.1" 12000 -scdx <- openUDP "127.0.0.1" 57120 +import Control.Applicative +import Data.Char (digitToInt) (cps, getNow) <- bpsUtils -devices <- midiDevices - -m1 <- midiStream devices "USB MIDI Device Port 1" 1 machinedrumController -m2 <- midiStream devices "USB MIDI Device Port 1" 2 machinedrumController -m3 <- midiStream devices "USB MIDI Device Port 1" 3 machinedrumController -m4 <- midiStream devices "USB MIDI Device Port 1" 4 machinedrumController -m5 <- midiStream devices "USB MIDI Device Port 1" 5 machinedrumController - (d1,t1) <- superDirtSetters getNow (d2,t2) <- superDirtSetters getNow @@ -37,170 +18,13 @@ m5 <- midiStream devices "USB MIDI Device Port 1" 5 machinedrumController (d7,t7) <- superDirtSetters getNow (d8,t8) <- superDirtSetters getNow (d9,t9) <- superDirtSetters getNow - +devices <- midiDevices let bps x = cps (x/2) -let hush = mapM_ ($ silence) [d1,d2,d3,d4,d5,d6,d7,d8,d9,m1,m2,m3,m4] -let mjou = mapM_ ($ silence) [m1,m2,m3,m4] -let jou = mapM_ ($ silence) [d1,d2,d3,d4,d5,d6,d7,d8,d9] -let solo = (>>) hush - - + hush = mapM_ ($ silence) [d1,d2,d3,d4,d5,d6,d7,d8,d9,m1,m2,m3,m4,m5,m6,m7,m8] + solo = (>>) hush --- custom Tidal transform/effect functions - -let rip a b p = within (0.25, 0.75) (slow 2 . rev . stut 8 a b) p - rip' a b c d e p = within (a, b) (slow 2 . rev . stut c d e) p - spike p = ((|+| delaytime (scale 0.001 0.3 $ slow 7.1 sine1)) . (|+| delayfeedback (scale 0.7 0.99 $ slow 6.71 sine1))) $ p - spike' p = (|+| delay "0.3") $ spike $ p - gtfo p = (const $ sound "~") p - shift p = (1024 <~) p - shift' x p = (x <~) p - choose xs = (xs !!) <$> (irand $ fromIntegral $ length xs) - one p = stut' 1 (0.125/2) (|*| gain "1") $ p - one' p = rarely (stut' 1 (0.125/2) (|*| gain "1")) $ shift' 1024 $ p - one'' p = sometimes (stut' 1 (0.125/2) (|*| gain "1")) $ shift' 1024 $ p - rep n p = stut' (n-1) (0.125*3) (|*| gain "1") $ p - rep' n p = stut' (n-1) (0.125/2*3) (|*| gain "1") $ p - rep'' n p = stut' (n-1) (0.125/4*3) (|*| gain "1") $ p - prog = (|+| note "{0 0 0 2 2}%1") - timemod p = whenmod 28 18 (foldEvery [2,3,4] (0.25 <~)) $ p - progwav = (|+| up "{0 0 0 2 2}%1") - - - -let (degree, degree_p) = pF "degree" (Nothing) - (ctranspose, ctranspose_p) = pF "ctranspose" (Nothing) - (mtranspose, mtranspose_p) = pF "mtranspose" (Nothing) - (gtranspose, gtranspose_p) = pF "gtranspose" (Nothing) - (harmonic, harmonic_p) = pF "harmonic" (Nothing) - (detune, detune_p) = pF "detune" (Nothing) - (scale, scale_p) = pS "scaleName" (Nothing) - (tuning, tuning_p) = pS "tuningName" (Nothing) - (stepsPerOctave, stepsPerOctave_p) = pI "stepsPerOctave" (Nothing) - (octaveRatio, octaveRatio_p) = pF "octaveRatio" (Nothing) - - --- params - -(hpdub, hpdub_p) = pF "hpdub" (Just 0) -(lpdub, lpdub_p) = pF "lpdub" (Just 0) -mf x = fst $ pF x (Just 0) -mi x = fst $ pI x (Just 0) -fm = mf "fm" -fmf = mf "fmf" -modamp = mf "modamp" -modfreq = mf "modfreq" -feedback = mf "feedback" -wub = mf "wub" -wubn = mf "wubn" -wubf = mf "wubf" -wubw = mf "wubw" -wubd = mf "wubd" -wubt = mf "wubt" -wubp = mf "wubp" -wubv = mf "wubv" -wrap = mf "wrap" -wrapoff = mf "wrapoff" -rect = mf "rect" -rectoff = mf "rectoff" -envsaw = mf "envsaw" -envsawf = mf "envsawf" -envtri = mf "envtri" -envtrif = mf "envtrif" -amt = mf "amt" -ampdtf = mf "ampdtf" -dtfq = mf "dtfq" -dtfnoise = mf "dtfnoise" -dtftype = mf "dtftype" -rate = mf "rate" -threshdtf = mf "threshdtf" -onsetdtf = mf "onsetdtf" -dtfreq = mf "dtfreq" -octer = mf "octer" -octersub = mf "octersub" -octersubsub = mf "octersubsub" -ring = mf "ring" -ringf = mf "ringf" -comp = mf "comp" -compa = mf "compa" -compr = mf "compr" -distort = mf "distort" -boom = mf "boom" -gboom = mf "gboom" -tape = mf "tape" -taped = mf "taped" -tapefb = mf "tapefb" -tapec = mf "tapec" -vibrato = mf "vibrato" -vrate = mf "vrate" -leslie = mf "leslie" -lrate = mf "lrate" -lsize = mf "lsize" -maxdel = mf "maxdel" -edel = mf "edel" -krushf = mf "krushf" -krush = mf "krush" -wshap = mf "wshap" -perc = mf "perc" -percf = mf "percf" -freeze = mf "freeze" -thold = mf "thold" -tlen = mf "tlen" -trate = mf "trate" +:set prompt "tidal> " -(ts, ts_p) = pF "ts" (Just 1) -(cone, cone_p) = pF "cone" (Just 1) -(ctwo, ctwo_p) = pF "ctwo" (Just 0) -(cfhzmin, cfhzmin_p) = pF "cfhzmin" (Just 0) -(cfhzmax, cfhzmax_p) = pF "cfhzmax" (Just 1) -(cfhmin, cfhmin_p) = pF "cfhmin" (Just 500) -(cfmax, cfmax_p) = pF "cfmax" (Just 2000) -(cfmin, cfmin_p) = pF "cfmin" (Just 0) -(rqmin, rqmin_p) = pF "rqmin" (Just 0) -(rqmax, rqmax_p) = pF "rqmax" (Just 1) -(lsf, lsf_p) = pF "lsf" (Just 200) -(ldb, ldb_p) = pF "ldb" (Just 1) -(ffreq,ffreq_p) = pF "ffreq"(Just 1000) -(preamp, preamp_p) = pF "preamp" (Just 4) -(dist, dist_p) = pF "dist" (Just 0) -(smooth, smooth_p) = pF "smooth" (Just 0) -(click, click_p) = pF "click" (Just 0) -(hfeedback, hfeedback_p) = pF "hfeedback" (Just 0) -(hena,hena_p)= pF "hena"(Just 1) -(henb,henb_p)= pF "henb"(Just 0) -(phfirst, phfirst_p) = pF "phfirst" (Just 0) -(phlast, phlast_p) = pF "phlast" (Just 5) -(fattack, fattack_p) = pF "fattack" (Just 0) -(fhold, fhold_p) = pF "fhold" (Just 1) -(frelease, frelease_p) = pF "frelease" (Just 0) -(fenv, fenv_p) = pF "fenv" (Just 0) -fmod = grp [fenv_p, fattack_p, fhold_p, frelease_p] -(sfcutoff, sfcutoff_p) = pF "sfcutoff" (Just 1000) -(sfresonance, sfresonance_p) = pF "sfresonance" (Just 0) -(sfattack, sfattack_p) = pF "sfattack" (Just 0) -(sfrelease, sfrelease_p) = pF "sfrelease" (Just 0) -(sfenv, sfenv_p) = pF "sfenv" (Just 0) -(pbend, pbend_p) = pF "pbend" (Just 1) -sfmod = grp [sfcutoff_p, sfresonance_p, sfenv_p, sfattack_p, sfrelease_p] -(cpcutoff, cpcutoff_p) = pF "cpcutoff" (Just 500) -(note3, note3_p) = pF "note3" (Just 44) -(note2, note2_p) = pF "note2" (Just 48) -(note, note_p) = pF "note" (Just 0) -(octer, octer_p) = pF "octer" (Just 1) -(octersub, octersub_p) = pF "octer" (Just 1) -(octersubsub, octersubsub_p) = pF "octersubsub" (Just 01) -(freeze, freeze_p) = pF "freeze" (Just 1) -(ff, ff_p) = pF "ff" (Just 440) -(bsize, bsize_p) = pF "bsize" (Just 2048) -(kcutoff, kcutoff_p) = pF "kcutoff" (Just 5000) -(krush, krush_p) = pF "krush" (Just 1) -(wshap, wshap_p) = pF "wshap" (Just 1) -(maxdel, maxdel_p) = pF "maxdel" (Just 10) -(edel, edel_p) = pF "edel" (Just 1) -(thold, thold_p) = pF "thold" (Just 0) -(tlen, tlen_p) = pF "tlen" (Just 1) -(trate, trate_p) = pF "trate" (Just 12) -:set prompt "tidal> " diff --git a/favicon.icns b/favicon.icns old mode 100644 new mode 100755 index 936bed0..36947b3 Binary files a/favicon.icns and b/favicon.icns differ diff --git a/favicon.ico b/favicon.ico old mode 100644 new mode 100755 index 936bed0..36947b3 Binary files a/favicon.ico and b/favicon.ico differ diff --git a/npm-debug.log b/npm-debug.log deleted file mode 100644 index 660367e..0000000 --- a/npm-debug.log +++ /dev/null @@ -1,45 +0,0 @@ -0 info it worked if it ends with ok -1 verbose cli [ '/usr/local/bin/node', '/usr/local/bin/npm', 'run', 'siren' ] -2 info using npm@3.10.9 -3 info using node@v7.1.0 -4 verbose run-script [ 'presiren', 'siren', 'postsiren' ] -5 info lifecycle Siren@0.2.1~presiren: Siren@0.2.1 -6 silly lifecycle Siren@0.2.1~presiren: no script for presiren, continuing -7 info lifecycle Siren@0.2.1~siren: Siren@0.2.1 -8 verbose lifecycle Siren@0.2.1~siren: unsafe-perm in lifecycle true -9 verbose lifecycle Siren@0.2.1~siren: PATH: /usr/local/lib/node_modules/npm/bin/node-gyp-bin:/Users/canince/Documents/GitHub/Siren/node_modules/.bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin -10 verbose lifecycle Siren@0.2.1~siren: CWD: /Users/canince/Documents/GitHub/Siren -11 silly lifecycle Siren@0.2.1~siren: Args: [ '-c', 'node server/start.js' ] -12 silly lifecycle Siren@0.2.1~siren: Returned: code: 1 signal: null -13 info lifecycle Siren@0.2.1~siren: Failed to exec siren script -14 verbose stack Error: Siren@0.2.1 siren: `node server/start.js` -14 verbose stack Exit status 1 -14 verbose stack at EventEmitter. (/usr/local/lib/node_modules/npm/lib/utils/lifecycle.js:255:16) -14 verbose stack at emitTwo (events.js:106:13) -14 verbose stack at EventEmitter.emit (events.js:191:7) -14 verbose stack at ChildProcess. (/usr/local/lib/node_modules/npm/lib/utils/spawn.js:40:14) -14 verbose stack at emitTwo (events.js:106:13) -14 verbose stack at ChildProcess.emit (events.js:191:7) -14 verbose stack at maybeClose (internal/child_process.js:885:16) -14 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5) -15 verbose pkgid Siren@0.2.1 -16 verbose cwd /Users/canince/Documents/GitHub/Siren -17 error Darwin 16.6.0 -18 error argv "/usr/local/bin/node" "/usr/local/bin/npm" "run" "siren" -19 error node v7.1.0 -20 error npm v3.10.9 -21 error code ELIFECYCLE -22 error Siren@0.2.1 siren: `node server/start.js` -22 error Exit status 1 -23 error Failed at the Siren@0.2.1 siren script 'node server/start.js'. -23 error Make sure you have the latest version of node.js and npm installed. -23 error If you do, this is most likely a problem with the Siren package, -23 error not with npm itself. -23 error Tell the author that this fails on your system: -23 error node server/start.js -23 error You can get information on how to open an issue for this project with: -23 error npm bugs Siren -23 error Or if that isn't available, you can get their info via: -23 error npm owner ls Siren -23 error There is likely additional logging output above. -24 verbose exit [ 1, true ] diff --git a/package.json b/package.json index aa23555..f29b9c6 100755 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "Siren", - "main": "http://localhost:3000/", - "version": "0.2.1", + "main": "http://localhost:3001/", + "version": "0.5.0", "private": true, "author": "vou", "license": "MIT", @@ -18,7 +18,7 @@ }, "window": { "title": "Siren", - "icon": "favicon.ico", + "icon": "favicon.icns", "toolbar": true, "frame": true, "width": 1024, @@ -43,29 +43,53 @@ "dependencies": { "axios": "^0.14.0", "body-parser": "^1.15.2", - "dgram": "^1.0.0", + "chokidar": "^1.7.0", + "debug": "^3.0.0", + "dgram": "^1.0.1", "express": "^4.14.0", + "file-saveable": "^0.1.0", + "file-saver": "^1.3.3", "firebase": "3.1.0", + "fs": "0.0.1-security", + "gl-react": "^2.3.1", + "gl-react-dom": "^2.2.9", + "jsonfile": "^4.0.0", + "keymaster": "^1.6.2", "lodash": "^4.17.2", "mathjs": "^3.10.0", + "os-homedir": "^1.0.2", + "osc": "^2.2.0", + "osc-js": "^1.1.1", + "prop-types": "^15.5.10", "raw-loader": "^0.5.1", + "rc-slider": "^8.3.5", "react": "^15.4.2", - "react-button": "^1.2.1", - "react-codemirror": "^0.3.0", - "react-dd-menu": "^2.0.1", + "react-addons-perf": "^15.4.2", + "react-codemirror": "^1.0.0", + "react-codemirror2": "^3.0.3", + "react-contextmenu": "^2.6.5", "react-dom": "^15.4.2", + "react-draggable": "^3.0.3", + "react-dropdown": "^1.2.5", "react-flex-layout": "^0.9.6", - "react-knob": "^0.1.0", + "react-glslcanvas": "0.0.6", + "react-grid-layout": "^0.15.0", + "react-maskedinput": "^4.0.0", + "react-motion": "^0.5.2", "react-number-editor": "^4.0.2", + "react-p5-wrapper": "0.0.4", + "react-perf-tool": "^0.2.2", "react-redux": "^4.4.5", + "react-render-debugger": "^1.0.2", "react-router": "^2.7.0", - "react-splitter": "^0.2.0", - "react-tangle": "^2.2.0", - "react-three-renderer": "^3.0.2", + "react-selectable": "^1.3.3", "redux": "^3.5.2", "redux-promise": "^0.5.3", "redux-thunk": "^2.0.1", + "require-haskell": "^1.0.2", + "shelljs": "^0.7.8", "socket.io": "^1.7.1", + "sockjs-client": "^1.1.4", "supercolliderjs": "^0.13.0", "threads": "^0.7.2", "three": "^0.82.1", @@ -74,11 +98,12 @@ "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "startnw": "run .", - "buildnw": "build --mac --x64 --mirror https://dl.nwjs.io/ .", + "buildnw": "run --mac --x64 --mirror https://dl.nwjs.io/ .", "start": "react-scripts start", "build": "react-scripts build", "eject": "react-scripts eject", "siren": "node server/start.js", + "tidalink": "./deps/tidalink/compile.sh", "web": "react-scripts start", "rename-samples": "node rename-samples-folder.js" }, diff --git a/public/tworker.js b/public/tworker.js deleted file mode 100644 index 17aa529..0000000 --- a/public/tworker.js +++ /dev/null @@ -1,19 +0,0 @@ -self.onmessage=function(e){ - if (e.data.type == "start") { - var interval= e.data.duration / e.data.steps * 1000; - var t = setInterval(function(){postMessage({type:"tick", id:e.data.id, msg: t});},interval) - } - else if (e.data.type == "update") { - var interval= e.data.duration / e.data.steps * 1000; - if (e.data.timer) { - clearInterval(e.data.timer); - var t=setInterval(function(){postMessage({type: "tick", id:e.data.id, msg:t});},interval) - } - } - else if (e.data.type == "stop" || e.data.type == "pause") { - clearInterval(e.data.timer); - e.data.timer=null; - - } -} -export default self; diff --git a/server/app.js b/server/app.js index eb96c11..55bb2bf 100755 --- a/server/app.js +++ b/server/app.js @@ -1,38 +1,164 @@ import _ from 'lodash'; -import config from '../config/config.json' import fs from 'fs'; import path from 'path'; import { spawn } from 'child_process'; import errorHandler from './errorHandler'; import express from 'express'; import bodyParser from 'body-parser'; + const startSCD = `${__dirname}/scd_start-default.scd`; const supercolliderjs = require('supercolliderjs'); const socketIo = require('socket.io'); -var globalCount = 0; -// REPL is an GHCI Instance -class REPL { +let exec = require('child_process').exec; +let synchs = exec('cd ' + __dirname + ' && runhaskell sync.hs'); +let python = exec('cd ' + __dirname + ' && python3 trig_roll.py'); +// console.log(' ## --> Python initialized @ ' + __dirname+'/trig_roll.py' ); +let jsonfile = require('jsonfile') + +let osc = require("osc"); + +let dcon = socketIo.listen(3004); +let dseq = socketIo.listen(4004); +var chokidar = require('chokidar'); +var watcher = chokidar.watch('./server/processing/', { + ignored: /(^|[\/\\])\../, + persistent: true +}); + +watcher.on('change', (path, stats) => { + + dseq.sockets.emit('dseqo', ({fileseq: path})); +}); +watcher.on('addDir', (path, stats) => { + + dseq.sockets.emit('dseqo', ({fileseq: path})); +}); +watcher.on('add', (path, stats) => { + + dseq.sockets.emit('dseqo', ({fileseq: path})); +}); +class REPL { hush() { this.tidalSendExpression('hush'); } - doSpawn() { + doSpawn(config, reply) { this.repl = spawn(config.ghcipath, ['-XOverloadedStrings']); - this.repl.stderr.on('data', (data) => { - console.error(data.toString('utf8')); - }); - this.repl.stdout.on('data', data => console.error(data)); - } + this.repl.stderr.on('data', (data) => { + console.error(data.toString('utf8')); + dcon.sockets.emit('dcon', ({dcon: data.toString('utf8')})); + }); + this.repl.stdout.on('data', data => { + console.error(data.toString()) + dcon.sockets.emit('dcon', ({dcon: data.toString('utf8')})); + }); + console.log(" ## --> GHC Spawned"); - initTidal() { + // python print + python.stdout.on('data', function(data){ + console.log(data.toString()); + }); + // error + python.stderr.on('data', (data) => { + console.error(`node-python stderr:\n${data}`); + }); + } + initTidal(config) { this.myPatterns = { values: [] }; const patterns = fs.readFileSync(config.tidal_boot).toString().split('\n'); for (let i = 0; i < patterns.length; i++) { this.tidalSendLine(patterns[i]); } + console.log(" ## --> Tidal initialized"); + } + + initSC(config, reply) { + const self = this; + // console.log("INITSC", req); + supercolliderjs.resolveOptions(config.path).then((options) => { + options.sclang = config.sclang; + options.scsynth = config.scsynth; + options.sclang_conf = config.sclang_conf; + + supercolliderjs.lang.boot(options).then((sclang) => { + self.sc = sclang; + + let dconSC = socketIo.listen(3006); + + let udpPort = new osc.UDPPort({ + remoteAddress: "127.0.0.1", + remotePort: 3007, + metadata: true + }); + + // Open the socket. + udpPort.open(); + + sclang.on('stdout', function(d) { + // Converts 'd' into an object + let re = /\[.+\]/g, match = re.exec(d); + if(match !== null && match !== undefined && match[0] !== undefined) { + let msg = _.split(_.trim(match[0], '[]'), ',') + _.each(msg, function(m, i) { + msg[i] = _.trim(m) + }) + + let time = 0; + re = /(time:).+/g; + match = re.exec(d); + if(match !== null && match !== undefined && match[0] !== undefined) { + time = _.toNumber(_.trim(match[0].substring(5))); + } + + if (_.trim(msg[0]) === '/play2') { + let cycleInfo = _.fromPairs(_.chunk(_.drop(msg), 2)); + cycleInfo['time'] = time; + + // Message to Unity + let unityMessage = { + address: "/siren", + args: [ + { + type: "s", + value: _.toString(_.concat(time,_.drop(msg))) + } + ] + }; + udpPort.send(unityMessage); + + // Message to React frontend + dconSC.sockets.emit('/sclog', {trigger: cycleInfo}); + } + } + }); + + setTimeout(function(){ + let samples_path; + // Windows + if (_.indexOf(config.samples_path, '\\') !== -1) { + samples_path = _.join(_.split(config.samples_path, /\/|\\/), "\\\\"); + } + // UNIX + else { + samples_path = _.join(_.split(config.samples_path, /\/|\\/), path.sep); + } + + const samples = fs.readFileSync(config.scd_start).toString().replace("{samples_path}", samples_path) + sclang.interpret(samples).then((samplePromise) => { + console.log(' ## --> SuperCollider initialized' ); + }); + }, 4000) + }); + }); + } + + start(config) { + this.doSpawn(config); + this.initTidal(config); + this.initSC(config); } stdinWrite(pattern) { @@ -46,79 +172,61 @@ class REPL { tidalSendExpression(expression) { this.tidalSendLine(':{'); - const splits = expression.split('\n'); - - for (let i = 0; i < splits.length; i++) { - this.tidalSendLine(splits[i]); - } + this.tidalSendLine(expression); this.tidalSendLine(':}'); } - initSC() { - const self = this; - - supercolliderjs.resolveOptions(config.path).then((options) => { - const SCLang = supercolliderjs.sclang.SCLang; - const lang = new SCLang(options); - lang.boot().then((sclang) => { - self.sc = lang; - setTimeout(function(){ - const samples = fs.readFileSync(config.scd_start).toString().replace("{samples_path}", config.samples_path) - lang.interpret(samples); - - }, 4000) - }); - }); - - } - // exitSC() { - // const self = this; - // supercolliderjs.resolveOptions(config.path).then((options) => { - // const SCLang = supercolliderjs.sclang.SCLang; - // const lang = new SCLang(options); - // lang.quit() - // }); - // } sendSC(message) { - var self = this; - self.sc.interpret(message); - } - - start() { - this.doSpawn(); - this.initTidal(); - this.initSC(); + let self = this; + self.sc.interpret(message).then(function(result) { + console.log('sendSC:' , result); + return result; + // result is a native javascript array + // dconSC.sockets.emit('dconSC', ({dconSC: result.toString('utf8')})); + }, function(error) { + console.error(error); + }); } } const TidalData = { - myTidal: new REPL() + TidalConsole: new REPL() } -const myApp = () => { +const Siren = () => { const app = express(); + let udpHosts = []; + let dgram = require("dgram"); + let UDPserver = dgram.createSocket("udp4"); + let tick = socketIo.listen(3003); + let py = socketIo.listen(5005); - var udpHosts = []; - var dgram = require("dgram"); - var UDPserver = dgram.createSocket("udp4"); - var tick = socketIo.listen(3003); + let oscPy = require('osc') + let udpPortPy = new oscPy.UDPPort({ + localAddress: "127.0.0.1", + localPort: 5005, + remoteAddress: "127.0.0.1", + remotePort: 3009, + metadata: true + }); + + // Open the socket. + udpPortPy.open(); //Get tick from sync.hs Port:3002 UDPserver.on("listening", function () { - var address = UDPserver.address(); - console.log("UDP server listening on " + - address.address + ":" + address.port); + let address = UDPserver.address(); + console.log(" ## --> UDP server listening on " + address.address + ":" + address.port); }); UDPserver.on("message", function (msg, rinfo) { - console.log("server got: " + msg + " from " +rinfo.address + ":" + rinfo.port); - tick.sockets.emit('osc', {osc:msg}); + tick.sockets.emit('/tick2react', {osc:msg}); }); UDPserver.on("disconnect", function (msg) { - tick.sockets.emit('dc', {osc:msg}); + tick.sockets.emit('/tick2react-done', {osc:msg}); }); UDPserver.bind(3002); @@ -131,81 +239,125 @@ const myApp = () => { next(); }); - const startTidal = (reply) => { - if (TidalData.myTidal.repl && TidalData.myTidal.repl.killed === false) { - reply.status(200).json({ isActive: !TidalData.myTidal.repl.killed, pattern: TidalData.myTidal.myPatterns }); - } else { - if (TidalData.myTidal.repl && TidalData.myTidal.repl.killed) { - TidalData.myTidal = new REPL(); + const startTidal = (b_config, reply) => { + try{ + if (TidalData.TidalConsole.repl && TidalData.TidalConsole.repl.killed === false) { + reply.status(200).json({ isActive: !TidalData.TidalConsole.repl.killed, pattern: TidalData.TidalConsole.myPatterns }); + } else { + if (TidalData.TidalConsole.repl && TidalData.TidalConsole.repl.killed) { + TidalData.TidalConsole = new REPL(); + } + TidalData.TidalConsole.start(b_config); + TidalData.TidalConsole.myPatterns.values.push('initiate tidal'); + reply.status(200).json({ isActive: !TidalData.TidalConsole.repl.killed, pattern: TidalData.TidalConsole.myPatterns }); } - TidalData.myTidal.start(); - TidalData.myTidal.myPatterns.values.push('initiate tidal'); - reply.status(200).json({ isActive: !TidalData.myTidal.repl.killed, pattern: TidalData.myTidal.myPatterns }); - + }catch(e) { + reply.status(500).json({ isActive: TidalData.TidalConsole.repl.killed, pattern: TidalData.TidalConsole.myPatterns }); } }; const sendPattern = (expr, reply) => { _.each(expr, c => { - TidalData.myTidal.tidalSendExpression(c); - TidalData.myTidal.myPatterns.values.push(c); + TidalData.TidalConsole.tidalSendExpression(c); + TidalData.TidalConsole.myPatterns.values.push(c); + if (TidalData.TidalConsole.myPatterns.values.length > 10) + TidalData.TidalConsole.myPatterns.values = _.drop( TidalData.TidalConsole.myPatterns.values , 10) }) - reply.status(200).json({ isActive: !TidalData.myTidal.repl.killed, patterns: TidalData.myTidal.myPatterns }); + reply.status(200).json({ isActive: !TidalData.TidalConsole.repl.killed, patterns: TidalData.TidalConsole.myPatterns }); }; const sendPatterns = (patterns, reply) => { _.each(patterns, c => { - TidalData.myTidal.tidalSendExpression(c[0]); - // TidalData.myTidal.myPatterns.values.push(c[0]); - - TidalData.myTidal.tidalSendExpression(c[1]); - // TidalData.myTidal.myPatterns.values.push(c[1]); + TidalData.TidalConsole.tidalSendExpression(c[0]); + TidalData.TidalConsole.tidalSendExpression(c[1]); }) - reply.status(200).json({ isActive: !TidalData.myTidal.repl.killed, patterns: TidalData.myTidal.myPatterns }); + reply.status(200).json({ isActive: !TidalData.TidalConsole.repl.killed, patterns: TidalData.TidalConsole.myPatterns }); }; - const sendScPattern = (expr, reply) => { - TidalData.myTidal.sendSC(expr); - console.log(expr); - reply.status(200).send(expr); + const sendScPattern = (pattern, reply) => { + const sc_message = TidalData.TidalConsole.sendSC(pattern); + reply.status(200).json({ pattern, sc_message }); + } + + // Not working + const generateConfig = (config,reply) => { + let configfile = path.join(__dirname, '..', 'config', 'config.json'); + console.log(' - configfile: ', configfile); + fs.writeFileSync(configfile, JSON.stringify(config), { flag: 'w' }, function(err) { + if(err) { + return console.error("home-made write error: ", err); + } + console.log(" - Config file is saved"); + }); } app.use("/", express.static(path.join(__dirname, "public"))); - app.get('/tidal', (req, reply) => startTidal(reply)); - // app.get('/tidaltick', (req, reply) => startTidal(reply)); + app.post('/tidal', (req, reply) => { + const { b_config } = req.body; + generateConfig(b_config,reply); + + startTidal(b_config, reply); + }); + + app.post('/processing', (req, reply) => { + exec('processing-java --sketch=' + __dirname + '/processing --run'); + + reply.status(200); + }); + + app.post('/sq', (req, reply) => { + const {sq} = req.body; + + console.log(' ## --> sq inbound:', sq); + + let pythonMessage = { + address: "/roll", + args: [{ + type: "s", + value: sq + }] + }; + udpPortPy.send(pythonMessage); + + reply.status(200).json({'sq': sq}); + }); + + app.post('/boot', (req, reply) => { + const { b_config } = req.body; + generateConfig(b_config, reply); + }); app.post('/pattern', (req, reply) => { const { pattern } = req.body; - console.log('Pattern inbound:', pattern); + console.log(' ## --> Pattern inbound:', pattern); sendPattern(pattern, reply); }); app.post('/patterns', (req, reply) => { const { patterns } = req.body; - console.log('Pattern inbound:', patterns); + console.log(' ## --> Patterns inbound:', patterns); sendPatterns(patterns, reply); }); app.post('/scpattern', (req, reply) => { const {pattern} = req.body; _.replace(pattern, "\\", ''); - console.log('ScPattern inbound:', pattern); - + console.log(' ## --> SC Pattern inbound:', pattern); sendScPattern(pattern, reply); }) app.get('*', errorHandler); - app.listen(config.port, () => { - console.log(`Server started at http://localhost:${config.port}`); + app.listen(3001, () => { + console.log(` ## --> Server started at http://localhost:${3001}`); }); } process.on('SIGINT', () => { - if (TidalData.myTidal.repl !== undefined) TidalData.myTidal.repl.kill(); + if (TidalData.TidalConsole.repl !== undefined) TidalData.TidalConsole.repl.kill(); process.exit(1) }); -module.exports = myApp; +module.exports = Siren; diff --git a/server/processing/C_Editor.pde b/server/processing/C_Editor.pde new file mode 100755 index 0000000..3861fc8 --- /dev/null +++ b/server/processing/C_Editor.pde @@ -0,0 +1,211 @@ +boolean isPlaying = false; +int current_timestamp = -1; + +class SirenEditorCanvas extends Canvas { + public float x, y, w, h; + public int mx, my; + + public PGraphics grid; + + public SirenEditorCanvas(float x, float y, float w, float h) { + this.x = x; + this.y = y; + this.w = w; + this.h = h; + } + + public void setup(PGraphics pg) { + this.grid = createGraphics(int(w+3*marginx), int(h)); + } + + public void update(PApplet p) { + mx = p.mouseX; + my = p.mouseY; + + // mousepressed + if (p.mousePressed && mx >= x && mx < x+w && my >= y && my < y+h){ + try { + float _h = h/canvas.numberOfSamples; + int s_index = int((my-y)/_h); + + float __h = _h/canvas.sampleList.get(s_index).notes.size(); + int n_index = int((my-(s_index*_h+y))/__h); + + float _w = w/(canvas.cycleResolution*canvas.numberOfCycles); + float t_index = (mx-x)/_w; + + String s = canvas.sampleList.get(s_index).s; + int n = canvas.sampleList.get(s_index).notes.get(n_index).n; + + Message m = canvas.getNote(s_index, n_index, (int)t_index); + + if(p.mouseButton == LEFT){ + if(m == null) { + m = new Message(); + m.assignUpdate(s, n, canvas.startCycle + t_index/canvas.cycleResolution); + + for (int i=0; i < numberOfFieldTextfields; i++) { + println(i,'/',numberOfFieldTextfields); + if(cp5.get(Textfield.class, "cp5_tf"+i+"_key") != null && + cp5.get(Textfield.class, "cp5_tf"+i+"_value") != null) + m.addField(cp5.get(Textfield.class, "cp5_tf"+i+"_key").getText(), + parseFloat(cp5.get(Textfield.class, "cp5_tf"+i+"_value").getText())); + } + + canvas.addNote(s, n, m); + } + else { + cp5.get(Textfield.class, "cp5_note").setText(str(m.n)); + + // create and add boxes for each field + int index = 0; + remove_optional_fields(); + for(Map.Entry field : m.fields.entrySet()) { + cp5_addField(); + cp5.get(Textfield.class, "cp5_tf"+index+"_key").setText((String)field.getKey()); + cp5.get(Textfield.class, "cp5_tf"+index+"_value").setText(str((float)field.getValue())); + index++; + } + } + } + else if(p.mouseButton == RIGHT) + canvas.removeNote(s_index, n_index, (int)t_index); + } catch(Exception e) {} + } + + // animate time + if (isPlaying) { + time += timeCoefficient * deltaTime; + + // trig samples only on integer time + int timestamp_location = icmap(time, + 0, canvas.maxTime, + 0, canvas.cycleResolution*canvas.numberOfCycles); + if ((timeCoefficient > 0 && timestamp_location > current_timestamp) || + (timeCoefficient < 0 && timestamp_location < current_timestamp)) { + current_timestamp = timestamp_location; + + ArrayList messages = canvas.getMessagesAt(current_timestamp); + for (int i = 0; i < messages.size(); i++) { + // triggers audio + sendSCMessage(messages.get(i)); + } + } + + if(time > canvas.maxTime) { + time -= canvas.maxTime; + current_timestamp = -1; + } + if(time < 0) { + time += canvas.maxTime; + current_timestamp = canvas.cycleResolution*canvas.numberOfCycles + 1 ; + } + } + + // redraw grid + if (renewGrid) { + int extended = canvas.cycleResolution * canvas.numberOfCycles; + float _w = w/extended; + float _h = h/canvas.numberOfSamples; + + // draw the grid and labels + grid.beginDraw(); + grid.background(0, 0); + float x = 3*marginx; + for(int i = 0; i < extended; i++) { + float _x = x + i*_w; + grid.stroke(255, i%canvas.cycleResolution == 0 ? 35 : 15); + grid.line(_x, 0, _x, h); + } + for(int i = 0; i < canvas.numberOfSamples; i++) { + float _y = i*_h; + + if(isLabels) { + grid.fill(20); + grid.stroke(50); + grid.rect(x-3*marginx, _y+2 , _w, _h - 4); + grid.pushMatrix(); + grid.textAlign(CENTER, CENTER); + grid.translate(x-2.5*marginx, _y+_h*0.5); + grid.rotate(3*HALF_PI); + grid.fill(150); + grid.text(canvas.sampleList.get(i).s, 0, 0); + grid.popMatrix(); + } + + grid.stroke(255, 35); + grid.line(x, _y, x+w, _y); + for(int j = 0; j < canvas.sampleList.get(i).notes.size(); j++) { + float __h = _h/canvas.sampleList.get(i).notes.size(); + float __y = _y+j*__h; + + if(isLabels) { + grid.fill(20); + grid.stroke(50); + grid.rect(x-1.5*marginx, __y+2 , _w, __h - 4); + grid.pushMatrix(); + grid.textAlign(CENTER, CENTER); + grid.translate(x-marginx, __y+__h*0.5); + grid.rotate(3*HALF_PI); + grid.fill(150); + grid.text(canvas.sampleList.get(i).notes.get(j).n, 0, 0); + grid.popMatrix(); + } + + grid.stroke(255, 15); + grid.line(0, __y , w, __y); + } + } + grid.endDraw(); + renewGrid = false; + } + } + + public void draw(PGraphics pg) { + try { + // Background + pg.fill(27); + pg.rect(x, y, w, h); + + // the background grid + pg.image(grid, x-3*marginx, y); + + // useful variables + int extended = canvas.cycleResolution * canvas.numberOfCycles; + float _w = w/extended; + float _h = h/canvas.numberOfSamples; + + // draw notes + for(int i = 0; i < canvas.sampleList.size(); i++) { + try{ + SampleContainer s = canvas.sampleList.get(i); + + float __h = _h/s.notes.size(); + for(int j = 0; j < s.notes.size(); j++) { + NoteContainer n = s.notes.get(j); + float _y = y + i*_h + j*__h; + + for(int k = 0; k < n.messages.size(); k++) { + float _x = x + _w*icmap(n.messages.get(k).cycle, + canvas.startCycle, + canvas.startCycle+canvas.numberOfCycles, + 0, extended); + + pg.stroke(150); + pg.fill(200); + pg.rect(_x, _y+2, _w, __h-4); + } + } + }catch(Exception e) {print("_dn_");} + } + + // draw timer + float _x = x + map(time, 0, canvas.maxTime, 0, w); + pg.stroke(255, 0, 0, isPlaying ? 200 : 150); + pg.line(_x, y, _x, y+h); + } + catch (ConcurrentModificationException e) { + println("Skipped"); + } + } +} \ No newline at end of file diff --git a/server/processing/C_P5.pde b/server/processing/C_P5.pde new file mode 100644 index 0000000..8ea0835 --- /dev/null +++ b/server/processing/C_P5.pde @@ -0,0 +1,86 @@ +import controlP5.*; +import java.util.*; + +ControlP5 cp5; +Canvas gc; +Group createPattern; + +int marginx = 10; +int marginy = 10; + +PVector pos = new PVector(marginx, marginy); +PVector size = new PVector(100, height-2*marginy); + +HashMap fields = new HashMap(); + +void initControls() { + cp5 = new ControlP5(this); + cp5.setAutoDraw(true); + cp5.setColorForeground(color(0, 200)); + cp5.setColorBackground(color(255, 50)); + cp5.setColorActive(color(255, 150)); + + // Canvas + gc = new SirenEditorCanvas(100+4*marginx, marginy, + width-5*marginx-100, height-2*marginy); + gc.pre(); + cp5.addCanvas(gc); + + initWindow(); + + //// RightClickMenu + //contextMenu = cp5.addGroup("g1") + // .setPosition(0,0) + // .setBackgroundHeight(100) + // .setBackgroundColor(color(255,50)) + // ; + //contextMenu.setVisible(false); +} + +void initWindow() { + createPattern = cp5.addGroup("createPattern") + .setPosition(pos.x, pos.y) + .setWidth(int(size.x)) + .setBackgroundHeight(int(size.y)) + .setBackgroundColor(color(20, 50)) + .disableCollapse(); + createPattern.hideBar(); + + cp5.addTextfield("cp5_rollname") + .setCaptionLabel("Editor Name") + .setPosition(marginx, marginy) + .setSize(int(size.x-2*marginx), 20) + .setAutoClear(false) + .setGroup(createPattern) + .setText(canvas.name); + + String[] filenames = listFileNames("/Users/canince/Dropbox/~siren/pool1/"); + cp5.addScrollableList("cp5_samples") + .setCaptionLabel("Samples") + .setPosition(marginx, 20+4*marginy) + .setSize(int(size.x-2*marginx), 100) + .setBarHeight(20) + .setItemHeight(20) + .addItems(Arrays.asList(filenames)) + .setType(ControlP5.LIST) + .setGroup(createPattern); + + cp5.addTextfield("cp5_note") + .setCaptionLabel("n") + .setPosition(marginx, 100+2*marginy + 20+3*marginy) + .setSize(int(size.x-5*marginx), 20) + .setAutoClear(false) + .setGroup(createPattern); + + cp5.addBang("cp5_addField") + .setCaptionLabel("+") + .setPosition(int(size.x-3*marginx), 100+2*marginy + 20+3*marginy) + .setSize(int(2*marginx), 20) + .setGroup(createPattern); + + cp5.addBang("cp5_add") + .setCaptionLabel("add") + .setPosition(marginx, 500+2*marginy) + .setSize(int(size.x-2*marginx), 20) + .setGroup(createPattern); +} \ No newline at end of file diff --git a/server/processing/Interaction.pde b/server/processing/Interaction.pde new file mode 100755 index 0000000..a867581 --- /dev/null +++ b/server/processing/Interaction.pde @@ -0,0 +1,132 @@ +boolean isLabels = true; +boolean renewGrid = true; + +int selectableIndex = 0; + +void keyPressed(KeyEvent e) { + // toogle playing + if(key == ' ') { + isPlaying = !isPlaying; + } + // clears canvas + else if(key == 'c') { + canvas.nuke(-1); + } + // toggle labels + else if(key == 'l') { + isLabels = !isLabels; + renewGrid = true; + } + + if (keyCode == UP) { + timeCoefficient += 0.2; + } else if (keyCode == DOWN) { + timeCoefficient -= 0.2; + } + + + // CTRL + SHIFT + S + if (e.isShiftDown() && e.isControlDown() && int(e.getKey()) == 's'-'a'+1) { + println("SAVE"); + saveJSON(); + } + // CTRL + SHIFT + O + // TODO: make filename generic + if (e.isShiftDown() && e.isControlDown() && int(e.getKey()) == 'o'-'a'+1) { + println("LOAD"); + loadJSON("export/exp~~~pmy~~~14568100010.json"); + } + + // Change cycle resolution and total cycles + if(key == '=' || key == '-' || key == '[' || key == ']') { + switch(key) { + case '=': + canvas.numberOfCycles++; + break; + case '-': + canvas.numberOfCycles--; + break; + case '[': + canvas.cycleResolution--; + break; + case ']': + canvas.cycleResolution++; + break; + default: + break; + } + canvas.maxTime = canvas.numberOfCycles * 1000; + canvas.restructureMessages(); + } + + + // Scrubbing right and left + if(keyCode == LEFT) { + int coeff = e.isShiftDown() ? 8 : 1; + coeff *= isPlaying ? 2 : 1; + time -= coeff*deltaTime; + time = constrain(time, 0, canvas.maxTime); + current_timestamp = icmap(time, 0, canvas.maxTime, 0, canvas.cycleResolution*canvas.numberOfCycles); + } + else if(keyCode == RIGHT) { + int coeff = e.isShiftDown() ? 8 : 1; + time += coeff*deltaTime; + time = constrain(time, 0, canvas.maxTime); + } +} + + +//// CONTROL P5 EVENTS ///// +int numberOfFieldTextfields = 0; +void cp5_samples(int n) { + selectableIndex = n; + println(selectableIndex); +} +public void cp5_add() { + String selectedSample = (String)cp5.get(ScrollableList.class, "cp5_samples").getItem(selectableIndex).get("name"); + String selectedNote = (String)cp5.get(Textfield.class,"cp5_note").getText(); + + canvas.addNote(selectedSample, int(selectedNote), null); +} +public void cp5_addField() { + float offset = 100+2*marginy + 20+3*marginy+ (numberOfFieldTextfields+1)*40; + cp5.addBang("cp5_tf"+numberOfFieldTextfields+"_delete") + .setCaptionLabel("-") + .setPosition(0, offset) + .setSize(marginx, 20) + .setGroup(createPattern); + cp5.addTextfield("cp5_tf"+numberOfFieldTextfields+"_key") + .setCaptionLabel("key") + .setPosition(marginx, offset) + .setSize(int(size.x-2*marginx)/2, 20) + .setAutoClear(false) + .setGroup(createPattern); + cp5.addTextfield("cp5_tf"+numberOfFieldTextfields+"_value") + .setCaptionLabel("value") + .setPosition(int(size.x)/2, offset) + .setSize(int(size.x-2*marginx)/2, 20) + .setAutoClear(false) + .setGroup(createPattern); + numberOfFieldTextfields++; +} +public void remove_optional_fields() { + for (int i=0; i < numberOfFieldTextfields; i++) { + if(cp5.get(Textfield.class, "cp5_tf"+i+"_key") != null && + cp5.get(Textfield.class, "cp5_tf"+i+"_value") != null){ + cp5.get(Textfield.class, "cp5_tf"+i+"_key").remove(); + cp5.get(Textfield.class, "cp5_tf"+i+"_value").remove(); + cp5.get(Bang.class, "cp5_tf"+i+"_delete").remove(); + } + } + numberOfFieldTextfields = 0; +} +public void controlEvent(ControlEvent theEvent) { + for (int i=0; i < numberOfFieldTextfields; i++) { + if (theEvent.getController().getName().equals("cp5_tf"+i+"_delete")) { + cp5.get(Textfield.class, "cp5_tf"+i+"_key").remove(); + cp5.get(Textfield.class, "cp5_tf"+i+"_value").remove(); + cp5.get(Bang.class, "cp5_tf"+i+"_delete").remove(); + } + } +} +//////////////////////////// \ No newline at end of file diff --git a/server/processing/Message.pde b/server/processing/Message.pde new file mode 100755 index 0000000..78e5de9 --- /dev/null +++ b/server/processing/Message.pde @@ -0,0 +1,216 @@ +public class PianoRoll { + public ArrayList sampleList; + + public String name = ""; + + public int numberOfCycles = 8; + public int cycleResolution = 12; + + public int numberOfSamples = 0; + + public int maxTime = numberOfCycles*1000; + public int startCycle = -1; + + public PianoRoll() { + this.sampleList = new ArrayList(); + + // creates a default random name for the scene + int randomLength = int(random(3, 6)); + for(int i = 0; i < randomLength; i++) { + name += (char)random(97, 122); + } + } + public ArrayList getMessagesAt(int x) { + ArrayList _msg = new ArrayList(); + for(SampleContainer s : sampleList) { + for(NoteContainer n : s.notes) { + Message _m = n.getMessageAt(x); + if(_m != null) _msg.add(_m); + } + } + return _msg; + } + + public void restructureMessages() { + for(SampleContainer s : sampleList) { + for(NoteContainer n : s.notes) { + for(Message m : n.messages) { + m.assignUpdate(m.s, m.n, m.cycle); + } + } + } + renewGrid = true; + } + public void addNote (String s, int n, Message m) { + SampleContainer _sample = isExist(s); + + if(_sample != null) { + if(m == null) _sample.addNote(n); + else _sample.addNote(n,m); + } + else { + this.sampleList.add(new SampleContainer(s, n)); + this.sampleList.sort(new Comparator() { + @Override + public int compare(SampleContainer one, SampleContainer other) { + return one.s.compareTo(other.s); + } + }); + renewGrid = true; + this.numberOfSamples++; + } + } + public Message getNote(int s_i, int n_i, int t_i) { + NoteContainer n = sampleList.get(s_i).notes.get(n_i); + for(Message m : n.messages) { + if(m.t_index == t_i) { + return m; + } + } + return null; + } + public void removeNote(int s_i, int n_i, int t_i) { + NoteContainer n = sampleList.get(s_i).notes.get(n_i); + for(Message m : n.messages) { + if(m.t_index == t_i) { + n.messages.remove(m); + break; + } + } + } + + public void nuke(int cycleNumber) { + sampleList.clear(); + numberOfSamples = 0; + renewGrid = true; + startCycle = cycleNumber; + } + + public SampleContainer isExist(String s) { + for(SampleContainer sample : sampleList) { + if(s.equalsIgnoreCase(sample.s)){ + return sample; + } + } + return null; + } +} + +public class SampleContainer { + public ArrayList notes; + public String s; + + public SampleContainer (String s, int n) { + this.s = s; + this.notes = new ArrayList(); + this.notes.add(new NoteContainer(s, n)); + } + + public void addNote(int n) { + NoteContainer _node = isExist(n); + if(_node == null) + notes.add(new NoteContainer(s, n)); + } + public void addNote (int n, Message m) { + NoteContainer _node = isExist(n); + if(_node != null) + _node.messages.add(m); + else + notes.add(new NoteContainer(s, n, m)); + } + public NoteContainer isExist (int n) { + for(NoteContainer node : notes) + if(node.n == n && s.equalsIgnoreCase(node.s)) return node; + return null; + } +} + +public class NoteContainer { + public String s = ""; + public int n = 0; + public ArrayList messages; + + public NoteContainer (String s, int n) { + this.s = s; + this.n = n; + this.messages = new ArrayList(); + } + public NoteContainer (String s, int n, Message m) { + this.s = s; + this.n = n; + this.messages = new ArrayList(); + this.messages.add(m); + } + public Message getMessageAt(int x) { + for(Message m : messages) + if(m.t_index == x) + return m; + return null; + } +} + +public class Message { + public float time = 0; + public float cps = 1; + public float cycle = 0; + public float delta = 0; + public String s = ""; + public int n = 1; + public int orbit = 0; + + public int t_index = 0; + public HashMap fields = new HashMap(); + + public Message() {} + public boolean addField(String key, float value) { + if(!fields.containsKey(key)) { + fields.put(key, value); + return true; + } + return false; + } + public void assignUpdate(String s, int n, float c) { + this.s = s; + this.n = n; + this.cycle = c; + this.t_index = icmap(c, + canvas.startCycle, canvas.startCycle+canvas.numberOfCycles, + 0, canvas.numberOfCycles*canvas.cycleResolution); + } + + public String toString() { + return s+":"+n+" "+cycle+" "+time+" "+orbit + " " + fields.toString(); + } +} + +// 'latency', 'cps', 'sound', 'offset', 'begin', 'end', 'speed', +// 'pan', 'velocity', 'vowel', 'cutoff', 'resonance', 'accelerate', +// 'shape', 'krio', 'gain', 'cut', 'delay', 'delaytime', +// 'delayfeedback', 'crush', 'coarse', 'hcutoff', 'hresonance', 'bandqf', 'bandq', 'unit' ] + +//orbit, cycle, s, n +//sound +// begin +// end + +// legato +// sustain + +//length +//accelerate +//cps +//unit +//loop +// delta +//amp +//gain +//channel +//pan +//note +//freq +//midinote +//octave +//latency +//lag +//offset +// cut \ No newline at end of file diff --git a/server/processing/Network.pde b/server/processing/Network.pde new file mode 100755 index 0000000..95874d2 --- /dev/null +++ b/server/processing/Network.pde @@ -0,0 +1,79 @@ +import netP5.*; +import oscP5.*; + +OscP5 oscP5; +NetAddress myRemoteLocation; + +void initNetwork() { + oscP5 = new OscP5(this, 3007); + myRemoteLocation = new NetAddress("127.0.0.1", 57120); +} + +void oscEvent(OscMessage theOscMessage) { + if(theOscMessage.checkAddrPattern("/siren")) { + if(theOscMessage.checkTypetag("s")) { + String[] splitMessage = split(theOscMessage.get(0).stringValue(), ','); + + Message m = new Message(); + m.time = float(splitMessage[0]); + for(int i = 1; i < splitMessage.length; i+=2) { + switch(splitMessage[i]) { + case "s": + m.s = splitMessage[i+1]; + break; + case "n": + m.n = int(splitMessage[i+1]); + break; + case "cycle": + m.cycle = float(splitMessage[i+1]); + break; + case "cps": + m.cps = int(splitMessage[i+1]); + break; + case "orbit": + m.orbit = int(splitMessage[i+1]); + break; + case "delta": + m.delta = float(splitMessage[i+1]); + break; + default: + m.addField(splitMessage[i], float(splitMessage[i+1])); + break; + } + } + + // Reset + if(m.cycle > canvas.startCycle + canvas.numberOfCycles || canvas.startCycle < 0) { + canvas.nuke(int(m.cycle)+1); + } + + // Keep sample + m.assignUpdate(m.s, m.n, m.cycle); + canvas.addNote(m.s, m.n, m); + + return; + } + } +} + +// Sends message to SC +void sendSCMessage(Message m) { + OscMessage myMessage = new OscMessage("/play2"); + myMessage.add("cycle"); + myMessage.add(m.cycle); + myMessage.add("delta"); + myMessage.add(m.delta); + myMessage.add("cps"); + myMessage.add(m.cps); + myMessage.add("s"); + myMessage.add(m.s); + myMessage.add("n"); + myMessage.add(m.n); + myMessage.add("orbit"); + myMessage.add(m.orbit); + for(Map.Entry f : m.fields.entrySet()){ + myMessage.add((String)f.getKey()); + myMessage.add((float)f.getValue()); + } + oscP5.send(myMessage, myRemoteLocation); +} \ No newline at end of file diff --git a/server/processing/Utilities.pde b/server/processing/Utilities.pde new file mode 100755 index 0000000..4925dae --- /dev/null +++ b/server/processing/Utilities.pde @@ -0,0 +1,138 @@ +// File +static String[] listFileNames(String dir) { + File file = new File(dir); + if (file.isDirectory()) { + String names[] = file.list(); + return names; + } else { + // If it's not a directory + return null; + } +} + +// Class getter +Object getField(Object obj, String field) { + try{ + return obj.getClass().getDeclaredField(field).get(obj); + }catch(Exception e) { + println("No \"" + field+"\" field in "+obj.getClass().getName()); + } + return null; +} + +// Math +static float log10 (float x) { + return (log(x) / log(10)); +} +static float cmap(float v, float x1, float y1, float x2, float y2) { + return constrain(map(v, x1, y1, x2, y2), min(x2, y2), max(x2, y2)); +} +static int icmap(float v, float x1, float y1, float x2, float y2) { + return int(constrain(map(v, x1, y1, x2, y2), min(x2, y2), max(x2, y2))); +} + +// Save current window +void saveJSON () { + JSONObject json = new JSONObject(); + json.setFloat("speed", timeCoefficient); + json.setFloat("resolution", canvas.cycleResolution); + json.setFloat("start", 0); + json.setFloat("end", canvas.numberOfCycles); + json.setFloat("loop", 1); + + int i = 0; + JSONArray messages = new JSONArray(); + for(SampleContainer s : canvas.sampleList) { + for(NoteContainer n : s.notes) { + for(Message m : n.messages) { + JSONObject message = new JSONObject(); + + message.setString("s", m.s); + message.setInt("n", m.n); + message.setInt("orbit", m.orbit); + message.setFloat("cycle", m.cycle); + message.setInt("t_index", m.t_index); + //message.setFloat("time", m.time); + message.setFloat("cps", m.cps); + message.setFloat("delta", m.delta); + + String fieldString = ""; + for(Map.Entry field : m.fields.entrySet()) { + fieldString += (String)field.getKey()+','+str((float)field.getValue())+','; + } + if(!fieldString.equals("")) + message.setString("fields", fieldString.substring(0, fieldString.length()-1)); + + messages.setJSONObject(i++, message); + } + } + } + json.setJSONArray("messages", messages); + + saveJSONObject(json, "export/exp~~~"+ + (String)cp5.get(Textfield.class,"cp5_rollname").getText()+"~~~"+ + hour()+minute()+second()+millis()+".json"); +} +void loadJSON (String filename) { + canvas.startCycle = 0; + + JSONObject json = loadJSONObject(filename); + + timeCoefficient = json.getFloat("speed"); + canvas.cycleResolution = int(json.getFloat("resolution")); + canvas.numberOfCycles = int(json.getFloat("end")); + //json.getFloat("start"); + //json.getFloat("loop"); + + + JSONArray msgs = json.getJSONArray("messages"); + for (int i = 0; i < msgs.size(); i++) { + Message m = new Message(); + JSONObject msg = msgs.getJSONObject(i); + + m.s = msg.getString("s"); + m.n = msg.getInt("n"); + m.orbit = msg.getInt("orbit"); + m.t_index = msg.getInt("t_index"); + //m.time = msg.getFloat("time"); + m.cps = msg.getFloat("cps"); + m.delta = msg.getFloat("delta"); + m.cycle = msg.getFloat("cycle"); + + // fields + String fields = msg.getString("fields"); + if (fields != null && !fields.equals("")) { + String[] s = fields.split(","); + for(int j=0; j < s.length; j+=2) { + m.addField(s[j], parseFloat(s[j+1])); + } + } + m.assignUpdate(m.s, m.n, m.cycle); + canvas.addNote(m.s, m.n, m); + } +} + +//// Audio functions +//static public float mtof(float m) { +// return 8.175799f * (float)pow(2.0f, m / 12.0f); +//} +//static public float ftom(float f){ +// return 12.0f * log(f / (float)8.175799); +//} +//static public float dbtoa(float db) { +// return 1.0f * pow(10.0f, db / 20.0f); +//} +//public float atodb(float a) { +// return 20.0f * log10(a / 1.0f); +//} + +//// Float indexing +//static float getFloatIndex(float arr[], float index) { +// int lo = floor(index); +// int hi = lo+1; +// float t = index % 1.0; +// if(lo >= 0 && hi < arr.length) { +// return arr[lo]*(1-t) + arr[hi]*t; +// } +// return 0; +//} \ No newline at end of file diff --git a/server/processing/export/exp~~~nspy~~~17233508874.json b/server/processing/export/exp~~~nspy~~~17233508874.json new file mode 100755 index 0000000..1f19964 --- /dev/null +++ b/server/processing/export/exp~~~nspy~~~17233508874.json @@ -0,0 +1,949 @@ +{ + "loop": 1, + "start": 0, + "messages": [ + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 223.5, + "t_index": 0, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 223.625, + "t_index": 0, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 223.625, + "t_index": 0, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 224.25, + "t_index": 3, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 224.375, + "t_index": 4, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 224.375, + "t_index": 4, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 224.625, + "t_index": 7, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 224.625, + "t_index": 7, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 225, + "t_index": 12, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 225.125, + "t_index": 13, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 225.25, + "t_index": 15, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 225.375, + "t_index": 16, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 225.5, + "t_index": 18, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 226.125, + "t_index": 25, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 226.25, + "t_index": 27, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 226.375, + "t_index": 28, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 226.375, + "t_index": 28, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 226.75, + "t_index": 33, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 226.875, + "t_index": 34, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 227, + "t_index": 36, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,2.0", + "cycle": 227.125, + "t_index": 37, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 227.25, + "t_index": 39, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 227.5, + "t_index": 42, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 227.625, + "t_index": 43, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 227.875, + "t_index": 46, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,2.0", + "cycle": 227.875, + "t_index": 46, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 228.125, + "t_index": 49, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,2.0", + "cycle": 228.125, + "t_index": 49, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 228.25, + "t_index": 51, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 228.375, + "t_index": 52, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 228.375, + "t_index": 52, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 228.75, + "t_index": 57, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,2.0", + "cycle": 228.75, + "t_index": 57, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,2.0", + "cycle": 228.875, + "t_index": 58, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 229, + "t_index": 60, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 229.125, + "t_index": 61, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 229.375, + "t_index": 64, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 229.625, + "t_index": 67, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 229.625, + "t_index": 67, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,2.0", + "cycle": 229.75, + "t_index": 69, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 229.875, + "t_index": 70, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 230.375, + "t_index": 76, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 230.5, + "t_index": 78, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 230.625, + "t_index": 79, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,2.0", + "cycle": 230.625, + "t_index": 79, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 230.75, + "t_index": 81, + "n": 1 + }, + { + "s": "foil2", + "cps": 1, + "delta": 0.125, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 230.875, + "t_index": 82, + "n": 1 + }, + { + "s": "foil3", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,2.0", + "cycle": 223.375, + "t_index": 0, + "n": 1 + }, + { + "s": "foil3", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 223.75, + "t_index": 0, + "n": 1 + }, + { + "s": "foil3", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,2.0", + "cycle": 224.25, + "t_index": 3, + "n": 1 + }, + { + "s": "foil3", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 224.5, + "t_index": 6, + "n": 1 + }, + { + "s": "foil3", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 224.5, + "t_index": 6, + "n": 1 + }, + { + "s": "foil3", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,2.0", + "cycle": 225.125, + "t_index": 13, + "n": 1 + }, + { + "s": "foil3", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 225.25, + "t_index": 15, + "n": 1 + }, + { + "s": "foil3", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 225.375, + "t_index": 16, + "n": 1 + }, + { + "s": "foil3", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 225.5, + "t_index": 18, + "n": 1 + }, + { + "s": "foil3", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,2.0", + "cycle": 225.875, + "t_index": 22, + "n": 1 + }, + { + "s": "foil3", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 226, + "t_index": 24, + "n": 1 + }, + { + "s": "foil3", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,2.0", + "cycle": 226, + "t_index": 24, + "n": 1 + }, + { + "s": "foil3", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 226.25, + "t_index": 27, + "n": 1 + }, + { + "s": "foil3", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 227.125, + "t_index": 37, + "n": 1 + }, + { + "s": "foil3", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 227.5, + "t_index": 42, + "n": 1 + }, + { + "s": "foil3", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,2.0", + "cycle": 227.625, + "t_index": 43, + "n": 1 + }, + { + "s": "foil3", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 228.25, + "t_index": 51, + "n": 1 + }, + { + "s": "foil3", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,2.0", + "cycle": 228.5, + "t_index": 54, + "n": 1 + }, + { + "s": "foil3", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 229.25, + "t_index": 63, + "n": 1 + }, + { + "s": "foil3", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,2.0", + "cycle": 229.375, + "t_index": 64, + "n": 1 + }, + { + "s": "foil3", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 229.875, + "t_index": 70, + "n": 1 + }, + { + "s": "foil3", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 230.25, + "t_index": 75, + "n": 1 + }, + { + "s": "foil3", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,2.0", + "cycle": 230.25, + "t_index": 75, + "n": 1 + }, + { + "s": "foil3", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 230.75, + "t_index": 81, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 223.25, + "t_index": 0, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 223.75, + "t_index": 0, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 223.875, + "t_index": 0, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 224, + "t_index": 0, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 224, + "t_index": 0, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 224.75, + "t_index": 9, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 225.625, + "t_index": 19, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 225.75, + "t_index": 21, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 225.75, + "t_index": 21, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 226.5, + "t_index": 30, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 226.5, + "t_index": 30, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 226.75, + "t_index": 33, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 227, + "t_index": 36, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 227.25, + "t_index": 39, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 227.375, + "t_index": 40, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 228, + "t_index": 48, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 228, + "t_index": 48, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 229, + "t_index": 60, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 229.125, + "t_index": 61, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 229.75, + "t_index": 69, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 230, + "t_index": 72, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,1.0", + "cycle": 230.5, + "t_index": 78, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0.25, + "orbit": 0, + "fields": "pan,0.0", + "cycle": 230.75, + "t_index": 81, + "n": 1 + } + ], + "end": 8, + "resolution": 12, + "speed": 1 +} \ No newline at end of file diff --git "a/server/processing/export/exp~~~sge2\023\023~~~175522141281.json" "b/server/processing/export/exp~~~sge2\023\023~~~175522141281.json" new file mode 100644 index 0000000..b6a9af9 --- /dev/null +++ "b/server/processing/export/exp~~~sge2\023\023~~~175522141281.json" @@ -0,0 +1,3847 @@ +{ + "loop": 1, + "start": 0, + "messages": [ + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.6666259765625, + "t_index": 19, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.6666259765625, + "t_index": 19, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.6666259765625, + "t_index": 19, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.6666259765625, + "t_index": 19, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.451416015625, + "t_index": 89, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.451416015625, + "t_index": 89, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.239990234375, + "t_index": 74, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.6666259765625, + "t_index": 19, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.1180419921875, + "t_index": 73, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835, + "t_index": 48, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.1180419921875, + "t_index": 73, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.239990234375, + "t_index": 74, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.451416015625, + "t_index": 89, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.6666259765625, + "t_index": 19, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835, + "t_index": 48, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.1180419921875, + "t_index": 73, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.239990234375, + "t_index": 74, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.451416015625, + "t_index": 89, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.6666259765625, + "t_index": 19, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835, + "t_index": 48, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.1180419921875, + "t_index": 73, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.239990234375, + "t_index": 74, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.451416015625, + "t_index": 89, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.6666259765625, + "t_index": 19, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835, + "t_index": 48, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.1180419921875, + "t_index": 73, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.239990234375, + "t_index": 74, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.451416015625, + "t_index": 89, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.6666259765625, + "t_index": 19, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835, + "t_index": 48, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.1180419921875, + "t_index": 73, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.239990234375, + "t_index": 74, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.451416015625, + "t_index": 89, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.6666259765625, + "t_index": 19, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835, + "t_index": 48, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.1180419921875, + "t_index": 73, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.239990234375, + "t_index": 74, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.6666259765625, + "t_index": 19, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835, + "t_index": 48, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1830.6666259765625, + "t_index": 0, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831, + "t_index": 0, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.6666259765625, + "t_index": 7, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.3333740234375, + "t_index": 16, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1833, + "t_index": 24, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1834, + "t_index": 36, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.3333740234375, + "t_index": 52, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.6666259765625, + "t_index": 55, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1836.3333740234375, + "t_index": 64, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.1295166015625, + "t_index": 1, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1830.6666259765625, + "t_index": 0, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.1295166015625, + "t_index": 1, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.6666259765625, + "t_index": 7, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.3333740234375, + "t_index": 16, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1833, + "t_index": 24, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1834, + "t_index": 36, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.3333740234375, + "t_index": 52, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.6666259765625, + "t_index": 55, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1836.3333740234375, + "t_index": 64, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1830.6666259765625, + "t_index": 0, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.1295166015625, + "t_index": 1, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.6666259765625, + "t_index": 7, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.3333740234375, + "t_index": 16, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1833, + "t_index": 24, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1834, + "t_index": 36, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.3333740234375, + "t_index": 52, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.6666259765625, + "t_index": 55, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1836.3333740234375, + "t_index": 64, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1830.6666259765625, + "t_index": 0, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.1295166015625, + "t_index": 1, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.6666259765625, + "t_index": 7, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.3333740234375, + "t_index": 16, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1833, + "t_index": 24, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1834, + "t_index": 36, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.3333740234375, + "t_index": 52, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.6666259765625, + "t_index": 55, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1836.3333740234375, + "t_index": 64, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.4971923828125, + "t_index": 89, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.4971923828125, + "t_index": 89, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1830.6666259765625, + "t_index": 0, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.1295166015625, + "t_index": 1, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.59814453125, + "t_index": 79, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.6666259765625, + "t_index": 7, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.3333740234375, + "t_index": 16, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1833, + "t_index": 24, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1834, + "t_index": 36, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.3333740234375, + "t_index": 52, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.6666259765625, + "t_index": 55, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1836.3333740234375, + "t_index": 64, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.59814453125, + "t_index": 79, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.4971923828125, + "t_index": 89, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1830.6666259765625, + "t_index": 0, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.1295166015625, + "t_index": 1, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.6666259765625, + "t_index": 7, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.3333740234375, + "t_index": 16, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1833, + "t_index": 24, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1834, + "t_index": 36, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.3333740234375, + "t_index": 52, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.6666259765625, + "t_index": 55, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1836.3333740234375, + "t_index": 64, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.59814453125, + "t_index": 79, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1830.6666259765625, + "t_index": 0, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.1295166015625, + "t_index": 1, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.6666259765625, + "t_index": 7, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.3333740234375, + "t_index": 16, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1833, + "t_index": 24, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1834, + "t_index": 36, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.3333740234375, + "t_index": 52, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.6666259765625, + "t_index": 55, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1836.3333740234375, + "t_index": 64, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.59814453125, + "t_index": 79, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1830.6666259765625, + "t_index": 0, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.1295166015625, + "t_index": 1, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.6666259765625, + "t_index": 7, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.3333740234375, + "t_index": 16, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1833, + "t_index": 24, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1834, + "t_index": 36, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.3333740234375, + "t_index": 52, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.6666259765625, + "t_index": 55, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1836.3333740234375, + "t_index": 64, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.59814453125, + "t_index": 79, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1830.6666259765625, + "t_index": 0, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.1295166015625, + "t_index": 1, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.6666259765625, + "t_index": 7, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.3333740234375, + "t_index": 16, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1833, + "t_index": 24, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1834, + "t_index": 36, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.3333740234375, + "t_index": 52, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.6666259765625, + "t_index": 55, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1836.3333740234375, + "t_index": 64, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.59814453125, + "t_index": 79, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.4971923828125, + "t_index": 89, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1830.6666259765625, + "t_index": 0, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.1295166015625, + "t_index": 1, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.3333740234375, + "t_index": 16, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1833, + "t_index": 24, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1834, + "t_index": 36, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.3333740234375, + "t_index": 52, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.6666259765625, + "t_index": 55, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1836.3333740234375, + "t_index": 64, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.59814453125, + "t_index": 79, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.1295166015625, + "t_index": 1, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.6666259765625, + "t_index": 7, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.3333740234375, + "t_index": 16, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1833, + "t_index": 24, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1834, + "t_index": 36, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.3333740234375, + "t_index": 52, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1836.3333740234375, + "t_index": 64, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1834, + "t_index": 36, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.3333740234375, + "t_index": 52, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.6666259765625, + "t_index": 55, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 2, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.3333740234375, + "t_index": 4, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.0743408203125, + "t_index": 12, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 2, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.3333740234375, + "t_index": 4, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.0743408203125, + "t_index": 12, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.1771240234375, + "t_index": 38, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.8494873046875, + "t_index": 34, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.6285400390625, + "t_index": 31, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.4686279296875, + "t_index": 29, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.4686279296875, + "t_index": 29, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.6285400390625, + "t_index": 31, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.8494873046875, + "t_index": 34, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.1771240234375, + "t_index": 38, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 2, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.3333740234375, + "t_index": 4, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.0743408203125, + "t_index": 12, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.4686279296875, + "t_index": 29, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.6285400390625, + "t_index": 31, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.8494873046875, + "t_index": 34, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.1771240234375, + "t_index": 38, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.0743408203125, + "t_index": 12, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.4686279296875, + "t_index": 29, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.6285400390625, + "t_index": 31, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.8494873046875, + "t_index": 34, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.1771240234375, + "t_index": 38, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 2, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.3333740234375, + "t_index": 4, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.0743408203125, + "t_index": 12, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.4686279296875, + "t_index": 29, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.6285400390625, + "t_index": 31, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.8494873046875, + "t_index": 34, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.1771240234375, + "t_index": 38, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 2, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.3333740234375, + "t_index": 4, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.0743408203125, + "t_index": 12, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.4686279296875, + "t_index": 29, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.6285400390625, + "t_index": 31, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.8494873046875, + "t_index": 34, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.1771240234375, + "t_index": 38, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 2, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.3333740234375, + "t_index": 4, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.0743408203125, + "t_index": 12, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.4686279296875, + "t_index": 29, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.6285400390625, + "t_index": 31, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.8494873046875, + "t_index": 34, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.1771240234375, + "t_index": 38, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 2, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.3333740234375, + "t_index": 4, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.0743408203125, + "t_index": 12, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.4686279296875, + "t_index": 29, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.6285400390625, + "t_index": 31, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.8494873046875, + "t_index": 34, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.1771240234375, + "t_index": 38, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 2, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.3333740234375, + "t_index": 4, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.0743408203125, + "t_index": 12, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.4686279296875, + "t_index": 29, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.6285400390625, + "t_index": 31, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.8494873046875, + "t_index": 34, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.1771240234375, + "t_index": 38, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 2, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.3333740234375, + "t_index": 4, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.0743408203125, + "t_index": 12, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.6285400390625, + "t_index": 31, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.1771240234375, + "t_index": 38, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 2, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.3333740234375, + "t_index": 4, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.0743408203125, + "t_index": 12, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.6285400390625, + "t_index": 31, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.8494873046875, + "t_index": 34, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.1771240234375, + "t_index": 38, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 2, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.3333740234375, + "t_index": 4, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.8494873046875, + "t_index": 34, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.1771240234375, + "t_index": 38, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666674613952637, + "orbit": 3, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832, + "t_index": 12, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.6400146484375, + "t_index": 7, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.6400146484375, + "t_index": 7, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666674613952637, + "orbit": 3, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832, + "t_index": 12, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.6571044921875, + "t_index": 43, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.396240234375, + "t_index": 52, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.6571044921875, + "t_index": 43, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.396240234375, + "t_index": 52, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.4761962890625, + "t_index": 77, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.3447265625, + "t_index": 88, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.4761962890625, + "t_index": 77, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.3447265625, + "t_index": 88, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.4171142578125, + "t_index": 65, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.5791015625, + "t_index": 54, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.3314208984375, + "t_index": 27, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.1790771484375, + "t_index": 26, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.026611328125, + "t_index": 24, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.6400146484375, + "t_index": 7, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666674613952637, + "orbit": 3, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832, + "t_index": 12, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.026611328125, + "t_index": 24, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.1790771484375, + "t_index": 26, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.3314208984375, + "t_index": 27, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.857177734375, + "t_index": 34, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.6571044921875, + "t_index": 43, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.396240234375, + "t_index": 52, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.5791015625, + "t_index": 54, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.9371337890625, + "t_index": 59, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.6304931640625, + "t_index": 67, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.0648193359375, + "t_index": 72, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.9371337890625, + "t_index": 59, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.4171142578125, + "t_index": 65, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.6304931640625, + "t_index": 67, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.0648193359375, + "t_index": 72, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.603759765625, + "t_index": 91, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.2152099609375, + "t_index": 86, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.4761962890625, + "t_index": 77, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.56005859375, + "t_index": 78, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.2152099609375, + "t_index": 86, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.3447265625, + "t_index": 88, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.603759765625, + "t_index": 91, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.6400146484375, + "t_index": 7, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.8590087890625, + "t_index": 22, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666674613952637, + "orbit": 3, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832, + "t_index": 12, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.4476318359375, + "t_index": 17, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.8590087890625, + "t_index": 22, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.026611328125, + "t_index": 24, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.1790771484375, + "t_index": 26, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.3314208984375, + "t_index": 27, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.857177734375, + "t_index": 34, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.6571044921875, + "t_index": 43, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.396240234375, + "t_index": 52, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.5791015625, + "t_index": 54, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.9371337890625, + "t_index": 59, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.4171142578125, + "t_index": 65, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.6304931640625, + "t_index": 67, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.0648193359375, + "t_index": 72, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.4761962890625, + "t_index": 77, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.56005859375, + "t_index": 78, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.2152099609375, + "t_index": 86, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.3447265625, + "t_index": 88, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.603759765625, + "t_index": 91, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.6400146484375, + "t_index": 7, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666674613952637, + "orbit": 3, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832, + "t_index": 12, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.4476318359375, + "t_index": 17, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.8590087890625, + "t_index": 22, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.026611328125, + "t_index": 24, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.1790771484375, + "t_index": 26, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.3314208984375, + "t_index": 27, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.857177734375, + "t_index": 34, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.6571044921875, + "t_index": 43, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.396240234375, + "t_index": 52, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.5791015625, + "t_index": 54, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.9371337890625, + "t_index": 59, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.4171142578125, + "t_index": 65, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.6304931640625, + "t_index": 67, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.0648193359375, + "t_index": 72, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.4761962890625, + "t_index": 77, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.56005859375, + "t_index": 78, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.2152099609375, + "t_index": 86, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.3447265625, + "t_index": 88, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.603759765625, + "t_index": 91, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.6400146484375, + "t_index": 7, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666674613952637, + "orbit": 3, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832, + "t_index": 12, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.4476318359375, + "t_index": 17, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.8590087890625, + "t_index": 22, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.026611328125, + "t_index": 24, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.1790771484375, + "t_index": 26, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.3314208984375, + "t_index": 27, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.857177734375, + "t_index": 34, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.6571044921875, + "t_index": 43, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.396240234375, + "t_index": 52, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.5791015625, + "t_index": 54, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.9371337890625, + "t_index": 59, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.4171142578125, + "t_index": 65, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.6304931640625, + "t_index": 67, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.0648193359375, + "t_index": 72, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.4761962890625, + "t_index": 77, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.56005859375, + "t_index": 78, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.2152099609375, + "t_index": 86, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.3447265625, + "t_index": 88, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.603759765625, + "t_index": 91, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.6400146484375, + "t_index": 7, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666674613952637, + "orbit": 3, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832, + "t_index": 12, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.4476318359375, + "t_index": 17, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.8590087890625, + "t_index": 22, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.026611328125, + "t_index": 24, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.1790771484375, + "t_index": 26, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.3314208984375, + "t_index": 27, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.857177734375, + "t_index": 34, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.396240234375, + "t_index": 52, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.5791015625, + "t_index": 54, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.9371337890625, + "t_index": 59, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.4171142578125, + "t_index": 65, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.6304931640625, + "t_index": 67, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.0648193359375, + "t_index": 72, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.4761962890625, + "t_index": 77, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.56005859375, + "t_index": 78, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.2152099609375, + "t_index": 86, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.3447265625, + "t_index": 88, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.603759765625, + "t_index": 91, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.6400146484375, + "t_index": 7, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666674613952637, + "orbit": 3, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832, + "t_index": 12, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.4476318359375, + "t_index": 17, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.8590087890625, + "t_index": 22, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.026611328125, + "t_index": 24, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.1790771484375, + "t_index": 26, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.3314208984375, + "t_index": 27, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.857177734375, + "t_index": 34, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.6571044921875, + "t_index": 43, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.396240234375, + "t_index": 52, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.5791015625, + "t_index": 54, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.9371337890625, + "t_index": 59, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.4171142578125, + "t_index": 65, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.6304931640625, + "t_index": 67, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.0648193359375, + "t_index": 72, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.56005859375, + "t_index": 78, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.2152099609375, + "t_index": 86, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.3447265625, + "t_index": 88, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.603759765625, + "t_index": 91, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.6400146484375, + "t_index": 7, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666674613952637, + "orbit": 3, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832, + "t_index": 12, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.4476318359375, + "t_index": 17, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.8590087890625, + "t_index": 22, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.026611328125, + "t_index": 24, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.1790771484375, + "t_index": 26, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.3314208984375, + "t_index": 27, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.857177734375, + "t_index": 34, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.6571044921875, + "t_index": 43, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.396240234375, + "t_index": 52, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.5791015625, + "t_index": 54, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.9371337890625, + "t_index": 59, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.4171142578125, + "t_index": 65, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.6304931640625, + "t_index": 67, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.0648193359375, + "t_index": 72, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.4761962890625, + "t_index": 77, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.56005859375, + "t_index": 78, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.2152099609375, + "t_index": 86, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.3447265625, + "t_index": 88, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.603759765625, + "t_index": 91, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666674613952637, + "orbit": 3, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832, + "t_index": 12, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.4476318359375, + "t_index": 17, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.026611328125, + "t_index": 24, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.1790771484375, + "t_index": 26, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.3314208984375, + "t_index": 27, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.396240234375, + "t_index": 52, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.5791015625, + "t_index": 54, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.4171142578125, + "t_index": 65, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.6304931640625, + "t_index": 67, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.0648193359375, + "t_index": 72, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.4761962890625, + "t_index": 77, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.56005859375, + "t_index": 78, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.2152099609375, + "t_index": 86, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.3447265625, + "t_index": 88, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.4476318359375, + "t_index": 17, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.3314208984375, + "t_index": 27, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.6571044921875, + "t_index": 43, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.396240234375, + "t_index": 52, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.5791015625, + "t_index": 54, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.4171142578125, + "t_index": 65, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.3447265625, + "t_index": 88, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.603759765625, + "t_index": 91, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.857177734375, + "t_index": 34, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.6571044921875, + "t_index": 43, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.396240234375, + "t_index": 52, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.5791015625, + "t_index": 54, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666650772094727, + "orbit": 4, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.1666259765625, + "t_index": 13, + "n": 4 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666650772094727, + "orbit": 4, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.1666259765625, + "t_index": 13, + "n": 4 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666650772094727, + "orbit": 4, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.1666259765625, + "t_index": 13, + "n": 4 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666650772094727, + "orbit": 4, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.1666259765625, + "t_index": 13, + "n": 4 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666650772094727, + "orbit": 4, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.1666259765625, + "t_index": 13, + "n": 4 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666650772094727, + "orbit": 4, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.1666259765625, + "t_index": 13, + "n": 4 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666650772094727, + "orbit": 4, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.1666259765625, + "t_index": 13, + "n": 4 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666650772094727, + "orbit": 4, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.1666259765625, + "t_index": 13, + "n": 4 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666650772094727, + "orbit": 4, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.1666259765625, + "t_index": 13, + "n": 4 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666650772094727, + "orbit": 4, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.1666259765625, + "t_index": 13, + "n": 4 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666650772094727, + "orbit": 4, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.1666259765625, + "t_index": 13, + "n": 4 + } + ], + "end": 8, + "resolution": 12, + "speed": 1 +} \ No newline at end of file diff --git "a/server/processing/export/exp~~~sge2\023~~~175522140954.json" "b/server/processing/export/exp~~~sge2\023~~~175522140954.json" new file mode 100644 index 0000000..b6a9af9 --- /dev/null +++ "b/server/processing/export/exp~~~sge2\023~~~175522140954.json" @@ -0,0 +1,3847 @@ +{ + "loop": 1, + "start": 0, + "messages": [ + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.6666259765625, + "t_index": 19, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.6666259765625, + "t_index": 19, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.6666259765625, + "t_index": 19, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.6666259765625, + "t_index": 19, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.451416015625, + "t_index": 89, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.451416015625, + "t_index": 89, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.239990234375, + "t_index": 74, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.6666259765625, + "t_index": 19, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.1180419921875, + "t_index": 73, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835, + "t_index": 48, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.1180419921875, + "t_index": 73, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.239990234375, + "t_index": 74, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.451416015625, + "t_index": 89, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.6666259765625, + "t_index": 19, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835, + "t_index": 48, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.1180419921875, + "t_index": 73, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.239990234375, + "t_index": 74, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.451416015625, + "t_index": 89, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.6666259765625, + "t_index": 19, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835, + "t_index": 48, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.1180419921875, + "t_index": 73, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.239990234375, + "t_index": 74, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.451416015625, + "t_index": 89, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.6666259765625, + "t_index": 19, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835, + "t_index": 48, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.1180419921875, + "t_index": 73, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.239990234375, + "t_index": 74, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.451416015625, + "t_index": 89, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.6666259765625, + "t_index": 19, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835, + "t_index": 48, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.1180419921875, + "t_index": 73, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.239990234375, + "t_index": 74, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.451416015625, + "t_index": 89, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.6666259765625, + "t_index": 19, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835, + "t_index": 48, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.1180419921875, + "t_index": 73, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.239990234375, + "t_index": 74, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.6666259765625, + "t_index": 19, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 1, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835, + "t_index": 48, + "n": 1 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1830.6666259765625, + "t_index": 0, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831, + "t_index": 0, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.6666259765625, + "t_index": 7, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.3333740234375, + "t_index": 16, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1833, + "t_index": 24, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1834, + "t_index": 36, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.3333740234375, + "t_index": 52, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.6666259765625, + "t_index": 55, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1836.3333740234375, + "t_index": 64, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.1295166015625, + "t_index": 1, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1830.6666259765625, + "t_index": 0, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.1295166015625, + "t_index": 1, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.6666259765625, + "t_index": 7, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.3333740234375, + "t_index": 16, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1833, + "t_index": 24, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1834, + "t_index": 36, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.3333740234375, + "t_index": 52, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.6666259765625, + "t_index": 55, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1836.3333740234375, + "t_index": 64, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1830.6666259765625, + "t_index": 0, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.1295166015625, + "t_index": 1, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.6666259765625, + "t_index": 7, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.3333740234375, + "t_index": 16, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1833, + "t_index": 24, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1834, + "t_index": 36, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.3333740234375, + "t_index": 52, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.6666259765625, + "t_index": 55, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1836.3333740234375, + "t_index": 64, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1830.6666259765625, + "t_index": 0, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.1295166015625, + "t_index": 1, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.6666259765625, + "t_index": 7, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.3333740234375, + "t_index": 16, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1833, + "t_index": 24, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1834, + "t_index": 36, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.3333740234375, + "t_index": 52, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.6666259765625, + "t_index": 55, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1836.3333740234375, + "t_index": 64, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.4971923828125, + "t_index": 89, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.4971923828125, + "t_index": 89, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1830.6666259765625, + "t_index": 0, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.1295166015625, + "t_index": 1, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.59814453125, + "t_index": 79, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.6666259765625, + "t_index": 7, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.3333740234375, + "t_index": 16, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1833, + "t_index": 24, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1834, + "t_index": 36, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.3333740234375, + "t_index": 52, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.6666259765625, + "t_index": 55, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1836.3333740234375, + "t_index": 64, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.59814453125, + "t_index": 79, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.4971923828125, + "t_index": 89, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1830.6666259765625, + "t_index": 0, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.1295166015625, + "t_index": 1, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.6666259765625, + "t_index": 7, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.3333740234375, + "t_index": 16, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1833, + "t_index": 24, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1834, + "t_index": 36, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.3333740234375, + "t_index": 52, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.6666259765625, + "t_index": 55, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1836.3333740234375, + "t_index": 64, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.59814453125, + "t_index": 79, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1830.6666259765625, + "t_index": 0, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.1295166015625, + "t_index": 1, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.6666259765625, + "t_index": 7, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.3333740234375, + "t_index": 16, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1833, + "t_index": 24, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1834, + "t_index": 36, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.3333740234375, + "t_index": 52, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.6666259765625, + "t_index": 55, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1836.3333740234375, + "t_index": 64, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.59814453125, + "t_index": 79, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1830.6666259765625, + "t_index": 0, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.1295166015625, + "t_index": 1, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.6666259765625, + "t_index": 7, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.3333740234375, + "t_index": 16, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1833, + "t_index": 24, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1834, + "t_index": 36, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.3333740234375, + "t_index": 52, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.6666259765625, + "t_index": 55, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1836.3333740234375, + "t_index": 64, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.59814453125, + "t_index": 79, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1830.6666259765625, + "t_index": 0, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.1295166015625, + "t_index": 1, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.6666259765625, + "t_index": 7, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.3333740234375, + "t_index": 16, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1833, + "t_index": 24, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1834, + "t_index": 36, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.3333740234375, + "t_index": 52, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.6666259765625, + "t_index": 55, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1836.3333740234375, + "t_index": 64, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.59814453125, + "t_index": 79, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.4971923828125, + "t_index": 89, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1830.6666259765625, + "t_index": 0, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.1295166015625, + "t_index": 1, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.3333740234375, + "t_index": 16, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1833, + "t_index": 24, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1834, + "t_index": 36, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.3333740234375, + "t_index": 52, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.6666259765625, + "t_index": 55, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1836.3333740234375, + "t_index": 64, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.59814453125, + "t_index": 79, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.1295166015625, + "t_index": 1, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.6666259765625, + "t_index": 7, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.3333740234375, + "t_index": 16, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1833, + "t_index": 24, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1834, + "t_index": 36, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.3333740234375, + "t_index": 52, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1836.3333740234375, + "t_index": 64, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1834, + "t_index": 36, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.3333740234375, + "t_index": 52, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333325386047363, + "orbit": 0, + "fields": "comp,0.5,rect,0.5", + "cycle": 1835.6666259765625, + "t_index": 55, + "n": 0 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 2, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.3333740234375, + "t_index": 4, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.0743408203125, + "t_index": 12, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 2, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.3333740234375, + "t_index": 4, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.0743408203125, + "t_index": 12, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.1771240234375, + "t_index": 38, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.8494873046875, + "t_index": 34, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.6285400390625, + "t_index": 31, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.4686279296875, + "t_index": 29, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.4686279296875, + "t_index": 29, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.6285400390625, + "t_index": 31, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.8494873046875, + "t_index": 34, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.1771240234375, + "t_index": 38, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 2, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.3333740234375, + "t_index": 4, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.0743408203125, + "t_index": 12, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.4686279296875, + "t_index": 29, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.6285400390625, + "t_index": 31, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.8494873046875, + "t_index": 34, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.1771240234375, + "t_index": 38, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.0743408203125, + "t_index": 12, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.4686279296875, + "t_index": 29, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.6285400390625, + "t_index": 31, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.8494873046875, + "t_index": 34, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.1771240234375, + "t_index": 38, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 2, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.3333740234375, + "t_index": 4, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.0743408203125, + "t_index": 12, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.4686279296875, + "t_index": 29, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.6285400390625, + "t_index": 31, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.8494873046875, + "t_index": 34, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.1771240234375, + "t_index": 38, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 2, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.3333740234375, + "t_index": 4, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.0743408203125, + "t_index": 12, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.4686279296875, + "t_index": 29, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.6285400390625, + "t_index": 31, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.8494873046875, + "t_index": 34, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.1771240234375, + "t_index": 38, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 2, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.3333740234375, + "t_index": 4, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.0743408203125, + "t_index": 12, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.4686279296875, + "t_index": 29, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.6285400390625, + "t_index": 31, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.8494873046875, + "t_index": 34, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.1771240234375, + "t_index": 38, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 2, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.3333740234375, + "t_index": 4, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.0743408203125, + "t_index": 12, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.4686279296875, + "t_index": 29, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.6285400390625, + "t_index": 31, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.8494873046875, + "t_index": 34, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.1771240234375, + "t_index": 38, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 2, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.3333740234375, + "t_index": 4, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.0743408203125, + "t_index": 12, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.4686279296875, + "t_index": 29, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.6285400390625, + "t_index": 31, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.8494873046875, + "t_index": 34, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.1771240234375, + "t_index": 38, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 2, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.3333740234375, + "t_index": 4, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.0743408203125, + "t_index": 12, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.6285400390625, + "t_index": 31, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.1771240234375, + "t_index": 38, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 2, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.3333740234375, + "t_index": 4, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.0743408203125, + "t_index": 12, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.6285400390625, + "t_index": 31, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.8494873046875, + "t_index": 34, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.1771240234375, + "t_index": 38, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.33333349227905273, + "orbit": 2, + "fields": "comp,0.5,rect,0.5", + "cycle": 1831.3333740234375, + "t_index": 4, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.8494873046875, + "t_index": 34, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.1771240234375, + "t_index": 38, + "n": 2 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666674613952637, + "orbit": 3, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832, + "t_index": 12, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.6400146484375, + "t_index": 7, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.6400146484375, + "t_index": 7, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666674613952637, + "orbit": 3, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832, + "t_index": 12, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.6571044921875, + "t_index": 43, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.396240234375, + "t_index": 52, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.6571044921875, + "t_index": 43, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.396240234375, + "t_index": 52, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.4761962890625, + "t_index": 77, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.3447265625, + "t_index": 88, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.4761962890625, + "t_index": 77, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.3447265625, + "t_index": 88, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.4171142578125, + "t_index": 65, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.5791015625, + "t_index": 54, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.3314208984375, + "t_index": 27, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.1790771484375, + "t_index": 26, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.026611328125, + "t_index": 24, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.6400146484375, + "t_index": 7, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666674613952637, + "orbit": 3, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832, + "t_index": 12, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.026611328125, + "t_index": 24, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.1790771484375, + "t_index": 26, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.3314208984375, + "t_index": 27, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.857177734375, + "t_index": 34, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.6571044921875, + "t_index": 43, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.396240234375, + "t_index": 52, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.5791015625, + "t_index": 54, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.9371337890625, + "t_index": 59, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.6304931640625, + "t_index": 67, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.0648193359375, + "t_index": 72, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.9371337890625, + "t_index": 59, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.4171142578125, + "t_index": 65, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.6304931640625, + "t_index": 67, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.0648193359375, + "t_index": 72, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.603759765625, + "t_index": 91, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.2152099609375, + "t_index": 86, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.4761962890625, + "t_index": 77, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.56005859375, + "t_index": 78, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.2152099609375, + "t_index": 86, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.3447265625, + "t_index": 88, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.603759765625, + "t_index": 91, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.6400146484375, + "t_index": 7, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.8590087890625, + "t_index": 22, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666674613952637, + "orbit": 3, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832, + "t_index": 12, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.4476318359375, + "t_index": 17, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.8590087890625, + "t_index": 22, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.026611328125, + "t_index": 24, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.1790771484375, + "t_index": 26, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.3314208984375, + "t_index": 27, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.857177734375, + "t_index": 34, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.6571044921875, + "t_index": 43, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.396240234375, + "t_index": 52, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.5791015625, + "t_index": 54, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.9371337890625, + "t_index": 59, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.4171142578125, + "t_index": 65, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.6304931640625, + "t_index": 67, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.0648193359375, + "t_index": 72, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.4761962890625, + "t_index": 77, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.56005859375, + "t_index": 78, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.2152099609375, + "t_index": 86, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.3447265625, + "t_index": 88, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.603759765625, + "t_index": 91, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.6400146484375, + "t_index": 7, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666674613952637, + "orbit": 3, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832, + "t_index": 12, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.4476318359375, + "t_index": 17, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.8590087890625, + "t_index": 22, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.026611328125, + "t_index": 24, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.1790771484375, + "t_index": 26, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.3314208984375, + "t_index": 27, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.857177734375, + "t_index": 34, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.6571044921875, + "t_index": 43, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.396240234375, + "t_index": 52, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.5791015625, + "t_index": 54, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.9371337890625, + "t_index": 59, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.4171142578125, + "t_index": 65, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.6304931640625, + "t_index": 67, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.0648193359375, + "t_index": 72, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.4761962890625, + "t_index": 77, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.56005859375, + "t_index": 78, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.2152099609375, + "t_index": 86, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.3447265625, + "t_index": 88, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.603759765625, + "t_index": 91, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.6400146484375, + "t_index": 7, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666674613952637, + "orbit": 3, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832, + "t_index": 12, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.4476318359375, + "t_index": 17, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.8590087890625, + "t_index": 22, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.026611328125, + "t_index": 24, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.1790771484375, + "t_index": 26, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.3314208984375, + "t_index": 27, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.857177734375, + "t_index": 34, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.6571044921875, + "t_index": 43, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.396240234375, + "t_index": 52, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.5791015625, + "t_index": 54, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.9371337890625, + "t_index": 59, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.4171142578125, + "t_index": 65, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.6304931640625, + "t_index": 67, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.0648193359375, + "t_index": 72, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.4761962890625, + "t_index": 77, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.56005859375, + "t_index": 78, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.2152099609375, + "t_index": 86, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.3447265625, + "t_index": 88, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.603759765625, + "t_index": 91, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.6400146484375, + "t_index": 7, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666674613952637, + "orbit": 3, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832, + "t_index": 12, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.4476318359375, + "t_index": 17, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.8590087890625, + "t_index": 22, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.026611328125, + "t_index": 24, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.1790771484375, + "t_index": 26, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.3314208984375, + "t_index": 27, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.857177734375, + "t_index": 34, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.396240234375, + "t_index": 52, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.5791015625, + "t_index": 54, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.9371337890625, + "t_index": 59, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.4171142578125, + "t_index": 65, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.6304931640625, + "t_index": 67, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.0648193359375, + "t_index": 72, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.4761962890625, + "t_index": 77, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.56005859375, + "t_index": 78, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.2152099609375, + "t_index": 86, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.3447265625, + "t_index": 88, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.603759765625, + "t_index": 91, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.6400146484375, + "t_index": 7, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666674613952637, + "orbit": 3, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832, + "t_index": 12, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.4476318359375, + "t_index": 17, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.8590087890625, + "t_index": 22, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.026611328125, + "t_index": 24, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.1790771484375, + "t_index": 26, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.3314208984375, + "t_index": 27, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.857177734375, + "t_index": 34, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.6571044921875, + "t_index": 43, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.396240234375, + "t_index": 52, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.5791015625, + "t_index": 54, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.9371337890625, + "t_index": 59, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.4171142578125, + "t_index": 65, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.6304931640625, + "t_index": 67, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.0648193359375, + "t_index": 72, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.56005859375, + "t_index": 78, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.2152099609375, + "t_index": 86, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.3447265625, + "t_index": 88, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.603759765625, + "t_index": 91, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1831.6400146484375, + "t_index": 7, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666674613952637, + "orbit": 3, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832, + "t_index": 12, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.4476318359375, + "t_index": 17, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.8590087890625, + "t_index": 22, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.026611328125, + "t_index": 24, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.1790771484375, + "t_index": 26, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.3314208984375, + "t_index": 27, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.857177734375, + "t_index": 34, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.6571044921875, + "t_index": 43, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.396240234375, + "t_index": 52, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.5791015625, + "t_index": 54, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.9371337890625, + "t_index": 59, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.4171142578125, + "t_index": 65, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.6304931640625, + "t_index": 67, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.0648193359375, + "t_index": 72, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.4761962890625, + "t_index": 77, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.56005859375, + "t_index": 78, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.2152099609375, + "t_index": 86, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.3447265625, + "t_index": 88, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.603759765625, + "t_index": 91, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666674613952637, + "orbit": 3, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832, + "t_index": 12, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.4476318359375, + "t_index": 17, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.026611328125, + "t_index": 24, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.1790771484375, + "t_index": 26, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.3314208984375, + "t_index": 27, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.396240234375, + "t_index": 52, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.5791015625, + "t_index": 54, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.4171142578125, + "t_index": 65, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.6304931640625, + "t_index": 67, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.0648193359375, + "t_index": 72, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.4761962890625, + "t_index": 77, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1837.56005859375, + "t_index": 78, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.2152099609375, + "t_index": 86, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.3447265625, + "t_index": 88, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1832.4476318359375, + "t_index": 17, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.3314208984375, + "t_index": 27, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.6571044921875, + "t_index": 43, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.396240234375, + "t_index": 52, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.5791015625, + "t_index": 54, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1836.4171142578125, + "t_index": 65, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.3447265625, + "t_index": 88, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1838.603759765625, + "t_index": 91, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1833.857177734375, + "t_index": 34, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1834.6571044921875, + "t_index": 43, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.396240234375, + "t_index": 52, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1835.5791015625, + "t_index": 54, + "n": 3 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666650772094727, + "orbit": 4, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.1666259765625, + "t_index": 13, + "n": 4 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666650772094727, + "orbit": 4, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.1666259765625, + "t_index": 13, + "n": 4 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666650772094727, + "orbit": 4, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.1666259765625, + "t_index": 13, + "n": 4 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666650772094727, + "orbit": 4, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.1666259765625, + "t_index": 13, + "n": 4 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666650772094727, + "orbit": 4, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.1666259765625, + "t_index": 13, + "n": 4 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666650772094727, + "orbit": 4, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.1666259765625, + "t_index": 13, + "n": 4 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666650772094727, + "orbit": 4, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.1666259765625, + "t_index": 13, + "n": 4 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666650772094727, + "orbit": 4, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.1666259765625, + "t_index": 13, + "n": 4 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666650772094727, + "orbit": 4, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.1666259765625, + "t_index": 13, + "n": 4 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666650772094727, + "orbit": 4, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.1666259765625, + "t_index": 13, + "n": 4 + }, + { + "s": "gen2", + "cps": 1, + "delta": 0.16666650772094727, + "orbit": 4, + "fields": "comp,0.5,rect,0.5", + "cycle": 1832.1666259765625, + "t_index": 13, + "n": 4 + } + ], + "end": 8, + "resolution": 12, + "speed": 1 +} \ No newline at end of file diff --git a/server/processing/export/exp~~~uvg~~~134995348.json b/server/processing/export/exp~~~uvg~~~134995348.json new file mode 100755 index 0000000..9dc3b78 --- /dev/null +++ b/server/processing/export/exp~~~uvg~~~134995348.json @@ -0,0 +1,630 @@ +{ + "loop": 1, + "start": 0, + "messages": [ + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.0152380466461182, + "t_index": 0, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.0990476608276367, + "t_index": 1, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.167618989944458, + "t_index": 2, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.2590476274490356, + "t_index": 3, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.6628570556640625, + "t_index": 7, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 2.119999885559082, + "t_index": 13, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 2.7904763221740723, + "t_index": 21, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 3.8114287853240967, + "t_index": 33, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 5.236190319061279, + "t_index": 50, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.0990476608276367, + "t_index": 1, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.167618989944458, + "t_index": 2, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.2590476274490356, + "t_index": 3, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.6628570556640625, + "t_index": 7, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 2.119999885559082, + "t_index": 13, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 2.7904763221740723, + "t_index": 21, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.4038095474243164, + "t_index": 4, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.4419047832489014, + "t_index": 5, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.5028572082519531, + "t_index": 6, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 3.2323811054229736, + "t_index": 26, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 2.3333334922790527, + "t_index": 16, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.7923810482025146, + "t_index": 9, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.9828572273254395, + "t_index": 11, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.0990476608276367, + "t_index": 1, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.167618989944458, + "t_index": 2, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.2590476274490356, + "t_index": 3, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.4038095474243164, + "t_index": 4, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.4419047832489014, + "t_index": 5, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.5028572082519531, + "t_index": 6, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.6628570556640625, + "t_index": 7, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.7923810482025146, + "t_index": 9, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.9828572273254395, + "t_index": 11, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 2.119999885559082, + "t_index": 13, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 2.3333334922790527, + "t_index": 16, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 2.7904763221740723, + "t_index": 21, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 3.2323811054229736, + "t_index": 26, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 3.8114287853240967, + "t_index": 33, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 5.236190319061279, + "t_index": 50, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.0152380466461182, + "t_index": 0, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.0990476608276367, + "t_index": 1, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.167618989944458, + "t_index": 2, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.2590476274490356, + "t_index": 3, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.4038095474243164, + "t_index": 4, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.4419047832489014, + "t_index": 5, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.5028572082519531, + "t_index": 6, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.6628570556640625, + "t_index": 7, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.7923810482025146, + "t_index": 9, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.9828572273254395, + "t_index": 11, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 2.119999885559082, + "t_index": 13, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 2.3333334922790527, + "t_index": 16, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 2.7904763221740723, + "t_index": 21, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 3.2323811054229736, + "t_index": 26, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 3.8114287853240967, + "t_index": 33, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 6.8971428871154785, + "t_index": 70, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 8.84000015258789, + "t_index": 94, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 5.236190319061279, + "t_index": 50, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.0990476608276367, + "t_index": 1, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.167618989944458, + "t_index": 2, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.2590476274490356, + "t_index": 3, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.4038095474243164, + "t_index": 4, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.4419047832489014, + "t_index": 5, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.5028572082519531, + "t_index": 6, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.6628570556640625, + "t_index": 7, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.7923810482025146, + "t_index": 9, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 1.9828572273254395, + "t_index": 11, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 2.119999885559082, + "t_index": 13, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 2.3333334922790527, + "t_index": 16, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 2.7904763221740723, + "t_index": 21, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 3.2323811054229736, + "t_index": 26, + "n": 1 + }, + { + "s": "water", + "cps": 1, + "delta": 0, + "orbit": 0, + "cycle": 3.8114287853240967, + "t_index": 33, + "n": 1 + } + ], + "end": 8, + "resolution": 12, + "speed": 1 +} \ No newline at end of file diff --git a/server/processing/processing.pde b/server/processing/processing.pde new file mode 100755 index 0000000..97bfda5 --- /dev/null +++ b/server/processing/processing.pde @@ -0,0 +1,35 @@ +float prevTime = millis(); +float time = 0; +float deltaTime = 0; +float timeCoefficient = 1; + +PianoRoll canvas; + +void setup() { + size(1200, 600); + frameRate(60); + noSmooth(); + + //printArray(subset(PFont.list(), 200, 400)); + textFont(createFont("Courier New Bold", 12)); + + canvas = new PianoRoll(); + + initNetwork(); + initControls(); + + surface.setResizable(true); +} + +void draw() { + background(50); + deltaTime = millis() - prevTime; + + // App drawing + + prevTime = millis(); + + // title + String txt_fps = String.format("Siren Editor [fps %6.2f] [speed %6.2f]", frameRate, timeCoefficient); + surface.setTitle(txt_fps); +} \ No newline at end of file diff --git a/server/public/favicon.ico b/server/public/favicon.ico new file mode 100755 index 0000000..36947b3 Binary files /dev/null and b/server/public/favicon.ico differ diff --git a/server/public/index.html b/server/public/index.html new file mode 100755 index 0000000..3bcc920 --- /dev/null +++ b/server/public/index.html @@ -0,0 +1 @@ +!Siren
\ No newline at end of file diff --git a/server/public/static/media/play@3x.e3228f77.png b/server/public/static/media/play@3x.e3228f77.png new file mode 100755 index 0000000..66d34ac Binary files /dev/null and b/server/public/static/media/play@3x.e3228f77.png differ diff --git a/server/public/static/media/stop@3x.e5b9c1c2.png b/server/public/static/media/stop@3x.e5b9c1c2.png new file mode 100755 index 0000000..0c09a52 Binary files /dev/null and b/server/public/static/media/stop@3x.e5b9c1c2.png differ diff --git a/server/sync.hs b/server/sync.hs new file mode 100755 index 0000000..6511f9e --- /dev/null +++ b/server/sync.hs @@ -0,0 +1,17 @@ +import qualified Network.Socket as N +import Sound.OSC.FD +import Sound.Tidal.Tempo + +set_udp_opt k v (UDP s) = N.setSocketOption s k v +get_udp_opt k (UDP s) = N.getSocketOption s k + +main = do fd <- openUDP "127.0.0.1" 3002 + Main.set_udp_opt N.Broadcast 1 fd + clocked $ onTick fd + +tempo_n = 1 + +onTick fd tempo tick_n = sendOSC fd $ Message "/tick" [int32 tick_n, + int32 tempo_n, + float (cps tempo) + ] diff --git a/server/trig_roll.py b/server/trig_roll.py new file mode 100755 index 0000000..f1e22e5 --- /dev/null +++ b/server/trig_roll.py @@ -0,0 +1,144 @@ +## This script triggers pattern rolls on the sequencer of Siren. +## incoming data format: +## -- roll_name, roll_note, start, stop, speed, orbit, loopCount + +import sys, os, time, json, numpy as np + +from pythonosc import osc_message_builder +from pythonosc import udp_client +from pythonosc import osc_server +from pythonosc import dispatcher +from pythonosc.udp_client import SimpleUDPClient + +osc_udp_client = None +current_milli_time = lambda: int(round(time.time() * 1000)) +osc_udp_client = SimpleUDPClient("127.0.0.1", 57120) + +def icmap(value, istart, istop, ostart, ostop): + temp = int(ostart + (ostop - ostart) * ((value - istart) / (istop - istart))) + if temp >= ostop: + return ostop + elif temp <= ostart: + return ostart + else: + return temp + +def sendSCMessage(m): + cycle = "cycle" + delta = "delta" + cps = "cps" + n = "n" + s = "s" + orbit = "orbit" + + # TODO: + # Add all fields + + osc_udp_client.send_message("/play2", [cycle, m['cycle'], delta, m['delta'], cps, 1, s , m['s'], n, m['n'], orbit, m['orbit']]) + +def constructTimeline(roll): + timelength = roll['end']*roll['resolution'] + timeline = [None] * timelength + + for message in roll['messages']: + if timeline[message['t_index']] is None: + timeline[message['t_index']] = [message] + else: + timeline[message['t_index']].append(message) + + return timeline + +def loadJSON(name, number = 0): + saves = [filename for filename in os.listdir("./processing/export/") if name in filename and os.path.isdir(filename) == False] + if saves: + wrapped_index = divmod(int(number), len(saves))[1] + jsondata = json.load( open( ("./processing/export/{0}").format(saves[wrapped_index]) )) + return jsondata + +def main(unused_addr, unused_arg, message): + lines = message.split(",") + + #parameters + roll_name = lines[0] + roll_note = lines[1] + roll_start = lines[2] ## CONDITIONS? + roll_stop = lines[3] ## CONDITIONS? + roll_speed = float(lines[4]) + roll_loop = int(lines[5]) + + print(roll_name, roll_note, roll_start, roll_stop, roll_speed, roll_loop) + + if roll_speed == 0.0: + roll_speed = 1.0 + if roll_loop < 0: + roll_loop = 1 + + jsondata = loadJSON(roll_name, roll_note) + if jsondata is None: + print(current_milli_time(), "could not find, exiting...") + exit + else: + # 2dimensional timeline list + timeline = constructTimeline(jsondata) + + print('-> ' + roll_name+":"+roll_note+" started") + # time parameters + roll_length_in_ms = 1000*jsondata['end'] + loop_count = 0 + prev_time = current_milli_time() + delta_time = 0 + time = 0 if roll_speed > 0 else roll_length_in_ms + current_timestamp = -1 if roll_speed > 0 else jsondata['end']*jsondata['resolution']+1 + + print("Loop {0}/{1}".format(loop_count, roll_loop)) + while loop_count < roll_loop: + prev_time = current_milli_time() + time += roll_speed * delta_time + + timestamp_location = icmap(time, + 0, roll_length_in_ms, + 0, jsondata['end']*jsondata['resolution']-1) + + if ((roll_speed > 0 and timestamp_location > current_timestamp) or + (roll_speed < 0 and timestamp_location < current_timestamp)): + + current_timestamp = timestamp_location + + print(current_timestamp, len(timeline)) + if timeline[current_timestamp] is not None: + for message in timeline[current_timestamp]: + sendSCMessage(message) + + if time > roll_length_in_ms: + time -= roll_length_in_ms + current_timestamp = -1 + loop_count += 1 + print("Loop {0}/{1}".format(loop_count, roll_loop)) + if time < 0: + time += roll_length_in_ms + current_timestamp = jsondata['end']*jsondata['resolution'] + 1 + loop_count += 1 + print("Loop {0}/{1}".format(loop_count, roll_loop)) + + delta_time = current_milli_time() - prev_time + print('-> '+roll_name+":"+roll_note+" finished") + + + # TODO: + # Incorporate + # START + # STOP + # + LOOP + # + SPEED + + + +if __name__ == '__main__': + # main("sth", "sth", "nspy,2,0,1,-8.0,2,1") + dispatcher = dispatcher.Dispatcher() + dispatcher.map("/roll", main, "roll") + + server = osc_server.ThreadingOSCUDPServer( + ("127.0.0.1", 3009), dispatcher) + print("Serving on {}".format(server.server_address)) + server.serve_forever() \ No newline at end of file diff --git a/src/actions/index.js b/src/actions/index.js index 596d0af..c83b78b 100755 --- a/src/actions/index.js +++ b/src/actions/index.js @@ -5,8 +5,7 @@ import axios from 'axios'; import _ from 'lodash'; import Firebase from 'firebase'; import store from '../store'; -import { handleEnterHome } from '../routes' -import worker from './tworker.js' + Firebase.initializeApp({ apiKey: "AIzaSyD7XtMeL8wakGWpsK4Vbg7zdkPkLQzjaGI", @@ -14,113 +13,37 @@ Firebase.initializeApp({ databaseURL: "https://eseq-f5fe0.firebaseio.com" }); - const models = { - Accounts: { - dataSource: Firebase.database().ref("/accounts"), - model: { - email: 'String', - name: 'String', - uid: 'String', - } - }, - Patterns: { - dataSource: Firebase.database().ref("/patterns"), - model: { - name: 'String', - params: 'String', - pattern: 'String', - skey: 'String', - uid: 'String' - } - }, - Live: { - dataSource: Firebase.database().ref("/live"), - model: { - timer: 'Object', - values: 'Object' - } - }, - Matrices: { - dataSource: Firebase.database().ref("/matrices"), - model: { - name: 'String', - durations: 'Object', - values: 'Object', - transitions: 'Object', - patterns: 'Object', - sceneIndex: 'Integer', - storedGlobals: 'Object', - uid: 'String' - } - } + Accounts: { + dataSource: Firebase.database().ref("/accounts"), + model: { + email: 'String', + name: 'String', + uid: 'String', + layouts: 'Object' + } + }, + Matrices: { + dataSource: Firebase.database().ref("/matrices"), + model: { + name: 'String', + patterns: 'Object', + channels: 'Object', + sceneIndex: 'Integer', + storedGlobals: 'Object', + uid: 'String' + } + } } - +// eslint-disable-next-line String.prototype.replaceAt = function(index, character) { return this.substr(0, index) + character + this.substr(index+character.length); } -// -// var client = dgram.createSocket('udp4'); -// -// client.on('listening', function () { -// var address = client.address(); -// console.log('UDP Server listening on ' + address.address + ":" + address.port); -// }); -// -// client.on('message', function (message, remote) { -// -// console.log(remote.address + ':' + remote.port +' - ' + message); -// -// }); -// -// client.send(message, 0, message.length, PORT, HOST, function(err, bytes) { -// -// if (err) throw err; -// console.log('UDP message sent to ' + HOST +':'+ PORT); -// -// var PORT = 3002; -// var HOST = '127.0.0.1'; -// -// var client = dgram.createSocket('udp4'); -// -// client.on('listening', function () { -// var address = client.address(); -// console.log('UDP Server listening on ' + address.address + ":" + address.port); -// }); -// -// client.on('message', function (message, remote) { -// -// console.log(remote.address + ':' + remote.port +' - ' + message); -// -// }); -// -// -// export const incTimer = () => { -// return { type: 'INC_TIMER'} -// }; -// -// export const click = () => { -// return dispatch => { -// timer = setInterval(x, (duration / steps * 1000), dispatch); -// } -// } -// export const incClick = () => { -// return { type: 'INC_TIMER'} -// }; -// - - -export function sendZapier(data) { - const { url } = data; - delete data.url; - axios.post(url, JSON.stringify(data)) - .then(function (response) { - console.log(response); - }) - .catch(function (error) { - console.error(error); - }); -} +// eslint-disable-next-line +String.prototype.replaceAll = function(search, replacement) { + let target = this; + return target.replace(new RegExp(search, 'g'), replacement); +}; export function fetchModels() { return _.map(models, (e, key) => { return key.toLowerCase() }) @@ -156,7 +79,8 @@ export function fbauth() { uid: user.uid, name: user.displayName, email: user.email, - key: user.uid + key: user.uid, + layouts: user.layouts })) }) } @@ -183,14 +107,33 @@ export function fbfetch(model) { }) } } +export function fbfetchlayout(model) { + return dispatch => { + models[model].dataSource.ref.on('value', data => { + if (Firebase.auth().currentUser !== null) + { + const { uid } = Firebase.auth().currentUser; + const u = _.find(data.val(), (d) => d.uid === uid); + + if (u !== null && u !== undefined) { + // console.log('fbfetchlayout: ', Object.values(u.layouts.default_layout)); + dispatch({ + type: 'UPDATE_LAYOUT', + payload: _.filter(Object.values(u.layouts.default_layout), ['isVisible', true]) + }) + } + } + }) + } +} export function fbfetchscenes(model) { return dispatch => { models[model].dataSource.ref.orderByChild('sceneIndex').on('value', data => { - var temp = []; + let temp = []; if (Firebase.auth().currentUser !== null) { data.forEach(function(c){ - var u_id = Firebase.auth().currentUser.uid; + let u_id = Firebase.auth().currentUser.uid; if(c.val().uid === u_id) temp.push(c.val()); }) @@ -202,6 +145,7 @@ export function fbfetchscenes(model) { }) } } + export function fbcreate(model, data) { if (data['key']) { return models[model].dataSource.child(data['key']).update({...data}) @@ -218,75 +162,35 @@ export function fbcreatepatterninscene(model, data, s_key) { return newObj.update({ key: newObj.key }) } } -export function fbFetchLive (model){ - - return dispatch => { - models[model].dataSource.ref.on('value', data => { +export function fbcreatechannelinscene(model, data, s_key){ + if (data['key']) { + return models[model].dataSource.child(data['key']).update({...data}) + } else { + const newObj = models[model].dataSource.child(s_key).child("channels").push(data); - if(data.val().timer.notf === "start") { - store.dispatch(startTimer(data.val().timer.duration, data.val().timer.steps)); - } - else if(data.val().timer.notf === "pause"){ - store.dispatch(pauseTimer()); - } - else if(data.val().timer.notf === "stop"){ - store.dispatch(stopTimer()); - } + newObj.update({ key: newObj.key }) + return newObj.key - store.dispatch(fbLiveUpdate(data.val().values)); - }); } - -} - -export const fbLiveUpdate = (values) => { - function placeValue(row, col, item, container){ - if (container[parseInt(row)+1] === undefined) - container[parseInt(row)+1] = {}; - container[parseInt(row)+1][col] = item; - } - - _.forEach(values, function(rowValue, rowKey) { - _.forEach(rowValue, function(cell, colKey) { - placeValue(rowKey-1, colKey, cell, values); - }); - }); - - return dispatch => { - dispatch({ type: 'FETCH_LIVE_MAT', payload: values}); - }; -} - -export function fbLiveTimer(model, data) { - models[model].dataSource.child('timer').set(data); -} - -export function fbSyncMatrix (model,data){ - models[model].dataSource.child('timer').set({duration: data.duration, - steps: data.steps, - notf: "running"}); - return models[model].dataSource.child('values').update(data.values); } +// data = { matName, patterns, channels, sceneIndex: snd, uid, storedGlobals } export function fbcreateMatrix(model, data) { if (Firebase.auth().currentUser !== null) { - var datakey, sceneIndex, values, patterns, uid, transition, duration, storedGlobals; + let datakey, sceneIndex, patterns, channels, storedGlobals; models[model].dataSource.ref.once('value', dat => { - var u_id = Firebase.auth().currentUser.uid; + let u_id = Firebase.auth().currentUser.uid; if ( u_id !== null) { const obj = _.find(dat.val(), (d) => (d.matName === data.matName)); if(obj !== undefined && obj !== null && u_id === obj.uid){ datakey = obj.key; sceneIndex = obj.sceneIndex; - // transitions = obj.transition; - // duration = obj.duration; - // storedGlobals = obj.globals; - if (obj.transitions !== undefined) transition = obj.transitions; + if (obj.channels !== undefined) channels = obj.channels; if (obj.globals !== undefined) storedGlobals = obj.globals; if (obj.patterns !== undefined) patterns = obj.patterns; - uid = obj.uid; + u_id = obj.uid; } } }); @@ -294,8 +198,8 @@ export function fbcreateMatrix(model, data) { if(patterns === undefined) patterns = []; - if(transition === undefined) - transition = []; + if(channels === undefined) + channels = []; if(storedGlobals === undefined) storedGlobals = []; @@ -303,18 +207,30 @@ export function fbcreateMatrix(model, data) { if (datakey) { data.sceneIndex = sceneIndex; data.patterns = patterns; + data.channels = channels; data.globals = storedGlobals; return models[model].dataSource.child(datakey).update({...data}) - } else { + + } + else { if (data.patterns === undefined) data.patterns = []; - if (data.transitions === undefined) - data.transitions = []; + + channels = data.channels + data.channels = [] + if (data.globals === undefined) - data.storedGlobals = []; + data.storedGlobals = []; const newObj = models[model].dataSource.push(data); - return newObj.update({ key: newObj.key }) + newObj.update({ key: newObj.key }) + + _.each(channels, function(x) { + x.scene = data.matName + const newChn = models[model].dataSource.child(newObj.key).child('channels').push(x); + newChn.update({ key : newChn.key }) + }) + } } } @@ -329,8 +245,7 @@ export function fbupdatepatterninscene(model, data, s_key) { models[model].dataSource.child(s_key).child("patterns").child(data['key']).update({...data}) } export function fbupdateglobalsinscene(model, data, s_key) { - //-- - models[model].dataSource.child(s_key).child("storedGlobals").push(data) + models[model].dataSource.child(s_key).child("storedGlobals").update({...data}) } export function fbdelete(model, data) { models[model].dataSource.child(data['key']).remove(); @@ -342,6 +257,9 @@ export function fborder(model, data, key) { if(data.patterns === undefined) data.patterns = {}; + if(data.channels === undefined) + data.channels = {}; + models[model].dataSource.child(key).update({...data}) models[model].dataSource.orderByChild('sceneIndex'); } @@ -356,15 +274,15 @@ export function GitHubLogin() { Firebase.auth().getRedirectResult().then(result => { if (result.credential) { // This gives you a GitHub Access Token. You can use it to access the GitHub API. - var token = result.credential.accessToken; + // let token = result.credential.accessToken; } // The signed-in user info - var user = result.user; + // let user = result.user; }).catch(function(error) { - var errorCode = error.code; - var errorMessage = error.message; - var email = error.email; - var credential = error.credential; + // let errorCode = error.code; + // let errorMessage = error.message; + // let email = error.email; + // let credential = error.credential; dispatch({ type: FETCH_ACCOUNTS_ERROR, payload: error @@ -394,305 +312,320 @@ export function logout() { } } - -export const initMyTidal = (server) => { +// boot and start tidal +export const initTidalConsole = (server, expression) => { return dispatch => { - axios.get('http://' + server.replace('http:', '').replace('/', '').replace('https:', '') + '/tidal') + axios.post('http://' + server.replace('http:', '').replace('/', '').replace('https:', '') + '/tidal', {'b_config' :expression}) .then((response) => { - dispatch({type: 'FETCH_TIDAL', payload: response.data }) + dispatch({type: 'FETCH_TIDAL', payload: response }) + dispatch({type: 'CONFIG_TIDAL', payload: response }) }).catch(function (error) { console.error(error); }); } } + export const exitSC = (server) => { return dispatch => { axios.get('http://' + server.replace('http:', '').replace('/', '').replace('https:', '') + '/tidal') .then((response) => { - dispatch({type: 'FETCH_TIDAL', payload: response.data }) + dispatch({type: 'FETCH_TIDAL', payload: response }) }).catch(function (error) { console.error(error); }); } } -export const exitSC = (server) => { + +export const dCon = ( expression) => { + return dispatch => { + dispatch({type: 'DEBUG_TIDAL', payload: expression }) + }; +} +//SC BINDING +// export const dConSC = ( expression) => { +// return dispatch => { +// dispatch({type: 'DEBUG_SCCOMMAND', payload: expression }) +// }; +// } + +export const TidalTick = (server) => { return dispatch => { - axios.get('http://' + server.replace('http:', '').replace('/', '').replace('https:', '') + '/tidal') + axios.get('http://' + server.replace('http:', '').replace('/', '').replace('https:', '') + '/tidaltick') .then((response) => { dispatch({type: 'FETCH_TIDAL', payload: response.data }) }).catch(function (error) { - console.error(error); + console.log(error); }); } } -// export const TidalTick = (server) => { -// return dispatch => { -// axios.get('http://' + server.replace('http:', '').replace('/', '').replace('https:', '') + '/tidaltick') -// .then((response) => { -// dispatch({type: 'FETCH_TIDAL', payload: response.data }) -// }).catch(function (error) { -// console.log(error); -// }); -// } -// } -export const assignTimer = (timer,steps, _index) => { - var dum =timer.current + (_index - timer.current%steps); - return { - type: 'ASSIGN_TIMER', payload: timer.id , current : dum - }; -} - -String.prototype.replaceAll = function(search, replacement) { - var target = this; - return target.replace(new RegExp(search, 'g'), replacement); -}; - -////////////////// PARSER STARTS HERE ////////////////// -var math = require('mathjs'); -var patListBack = []; -export const sendPatterns = (server,vals, patterns =[], solo, transition, channels, timer,globalTransformations,globalCommands, storedPatterns) => { +export const setExecution = () => { return dispatch => { - const x = _.compact(_.map(vals,(v,k) => { - // gets parameters list - const getParameters = (v) => { - var param = []; - _.map(_.split(v, /[`]+/g), (p1, p2) => { - p1 = _.trim(p1); - - if(p1 !== "") param.push(p1); - }); - return param; - } - - const getMathExpr = (v) => { - var maths = []; - _.map(_.split(v, /[&]+/g), (p1, p2) => { - p1 = _.trim(p1); - - if(p1 !== "") maths.push(p1); - }); - return maths; - } - - // pattern name - const cellName = getParameters(v)[0]; - - // command of the pattern - const cmd = _.find(patterns, c => c.name === cellName); - - // CPS channel handling - if(_.indexOf(channels,k) === _.indexOf(channels,'cps')){ - var newCommand = cellName; - return [k + " " + newCommand, "sendOSC d_OSC $ Message \"tree\" [string \"command\", string \""+cellItem+"\"]"] ; - } - // other channels - else if(cmd !== undefined && cmd !== null && cmd !== "" && v !== ""){ - var cellItem = _.slice(getParameters(v), 1); - var newCommand = cmd.pattern; - - // Construct the parameter list from command - var parameters = _.concat( _.split(cmd.params, ','),'t'); - - // For each parameter in parameter list - _.forEach(parameters, function(value, i) { - // Temporal parameter - if(value === 't'){ - newCommand = _.replace(newCommand, new RegExp("`t`", "g"), timer.current); - } - // Random parameter - else if(_.indexOf(cellItem[i], '|') != -1 ) - { - cellItem[i] = cellItem[i].substring(1, _.indexOf(cellItem[i], ']')); - var bounds = _.split(cellItem[i], ','); - if(bounds[0] !== undefined && bounds[0] !== "" && - bounds[1] !== undefined && bounds[1] !== ""){ - bounds[0] = parseFloat(bounds[0]); - bounds[1] = parseFloat(bounds[1]); - cellItem[i] = _.random(_.min(bounds), _.max(bounds)); - newCommand = _.replace(newCommand, new RegExp("`"+value+"`", "g"), cellItem[i]); - } - } - // Value parameter - else { - newCommand = _.replace(newCommand, new RegExp("`"+value+"`", "g"), cellItem[i]); - } - }); - - // Math Parser - var re = /\&(.*?)\&/g; - _.forEach(_.words(newCommand, re), function(val, i){ - newCommand = _.replace(newCommand, val, _.trim(math.eval(_.trim(val,"&")),"[]")); - }) - // solo or not (obsolete) - var soloHolder = k; - var transitionHolder = "" ; - var _k = k; - if(_.indexOf(channels,_k) === _.indexOf(channels, 'cps')){ - transitionHolder = _k; - soloHolder = " "; - } - else { - if (transition[_.indexOf(channels,_k)] === "" || transition[_.indexOf(channels,_k)] === undefined ){ - soloHolder = k ; - transitionHolder = " $ "; - } - - else if(transition[_.indexOf(channels,_k)] !== undefined && transition[_.indexOf(channels,_k)] !== ""){ - transitionHolder = " " + transition[_.indexOf(channels,_k)]+ " $ "; - soloHolder = "t"+ (_.indexOf(channels,_k)+1); - } - - else if(solo[_.indexOf(channels,_k)] === true){ - soloHolder = "solo $ " + _k ; - transitionHolder = " $ "; - } - } - - if (_k === 'm1' || _k === 'm2' || _k === 'm3' || _k === 'm4' || _k === 'v1' || _k === 'u1'){ - - var storechan = _k + " $ "; - pattern = storechan+ newCommand; - storedPatterns[_.indexOf(channels,_k)] = ''; - storedPatterns[_.indexOf(channels,_k)] = pattern; - console.log(pattern); - return [pattern,"sendOSC d_OSC $ Message \"tree\" [string \"command\", string \""+cellItem+"\"]"] - - } - else { - var storechan = "d"+ (_.indexOf(channels,_k)+1) + " $ "; - var storepat= storechan+ newCommand; - //var orbit = " #orbit " + _.indexOf(channels,_k); - storepat = storepat; - storedPatterns[_.indexOf(channels,_k)] = ''; - storedPatterns[_.indexOf(channels,_k)] = storepat; - var pattern = soloHolder + transitionHolder +globalTransformations+ newCommand + " " + globalCommands; - if (_.indexOf(channels,_k) === _.indexOf(channels, 'd1')){ - newCommand = globalTransformations+ newCommand + " " + globalCommands - newCommand = newCommand.replaceAll(' s ', ' image '); - newCommand = newCommand.replaceAll('n ', 'npy '); - newCommand = newCommand.replaceAll('speed', 'pspeed'); - newCommand = newCommand.replaceAll('nudge', 'threshold'); - newCommand = newCommand.replaceAll('room', 'blur'); - newCommand = newCommand.replaceAll('end', 'median'); - newCommand = newCommand.replaceAll('coarse', 'edge'); - newCommand = newCommand.replaceAll('up', 'hough'); - newCommand = newCommand.replaceAll('gain', 'means'); - return [pattern, "v1 $ "+ newCommand] ; - } - else if (_.indexOf(channels,_k) === _.indexOf(channels, 'v1')){ - pattern = "v1 $ " + newCommand; - newCommand = newCommand.replaceAll('image', 's'); - newCommand = newCommand.replaceAll('npy', 'n'); - newCommand = newCommand.replaceAll('pspeed', 'speed'); - newCommand = newCommand.replaceAll('threshold', 'nudge'); - newCommand = newCommand.replaceAll('blur', 'room'); - newCommand = newCommand.replaceAll('median', 'end'); - newCommand = newCommand.replaceAll('edge', 'coarse'); - newCommand = newCommand.replaceAll('hough', 'up'); - - console.log(pattern, "d1 $ "+ newCommand); - return [pattern, "d1 $ "+ newCommand] ; - } - else { - return [pattern, "sendOSC d_OSC $ Message \"tree\" [string \"command\", string \""+cellItem+"\"]"] ; - } - } - } - else - return false; - })) - axios.post('http://' + server.replace('http:', '').replace('/', '').replace('https:', '') + '/patterns', { 'patterns': x }) - .then((response) => { - }).catch(function (error) { - console.error(error); - }); - } + dispatch({ type: 'EXECUTION_CLICK' }) + }; } export const continousPattern = (server, pattern) => { return dispatch => { const x = pattern; - axios.post('http://' + server.replace('http:', '').replace('/', '').replace('https:', '') + '/pattern', { 'pattern': [x,"sendOSC d_OSC $ Message \"tree\" [string \"command\", string \""+6+"\"]"] }) + axios.post('http://' + server.replace('http:', '').replace('/', '').replace('https:', '') + '/pattern', { 'pattern': [x] }) .then((response) => { }).catch(function (error) { console.error(error); }); } } -////////////////// PARSER ENDS HERE ////////////////// - - - -export const updateMatrix = (patterns, values, i, transition, duration, steps, channels) => { - function placeValue2D(row, col, item, container){ - if(item !== undefined){ - if (container[parseInt(row)+1] === undefined) - container[parseInt(row)+1] = {}; - container[parseInt(row)+1][col] = item; - } - } - function placeValue1D(index, item, container){ - if(item !== undefined) - container[parseInt(index)] = item; - else - container[parseInt(index)] = ''; - - // if (container[parseInt(index)] === undefined) - // container[parseInt(index)] = ''; - } - - _.forEach(values, function(rowValue, rowKey) { - _.forEach(rowValue, function(cell, colKey) { - placeValue2D(rowKey-1, colKey, '', values); - }); - }); - - _.forEach(i.values, function(rowValue, rowKey) { - _.forEach(rowValue, function(cell, colKey) { - placeValue2D(rowKey-1, colKey, cell, values); - }); - }); - - for (var i = 0; i < channels.length; i++) { - placeValue1D(i, transition[i], transition); - } - - _.forEach(duration, function(obj, index) { - store.dispatch(updateTimerduration(index,obj,steps)); - }); - - // TODO durations +export const seekTimer = (step) => { return dispatch => { - dispatch({ type: 'ADD_TIMER'}); + dispatch({ type: 'SEEK_CLICK', payload: step}); }; } - +export const updateMatrix = (item) => { + //reducer + return dispatch => { + dispatch({ type: 'UPDATE_CHANNEL', payload: item}); + }; +} +export const selectCell = (selectedcell) => { + //reducer + return dispatch => { + dispatch({ type: 'SELECT_CELL', payload: selectedcell }); + }; +} + +export const pasteCell = (vals) => { + //reducer + return dispatch => { + dispatch({ type: 'PASTE_CELL', payload: vals }); + }; +} +export const updateCell = (cell) => { + //reducer + return dispatch => { + dispatch({ type: 'REFINE_CELL', payload: cell }); + }; +} +export const bootCells = (cell) => { + //reducer + return dispatch => { + dispatch({ type: 'BOOT_CELL', payload: cell }); + }; +} +export const createCell = (cell) => { + //reducer + return dispatch => { + dispatch({ type: 'CREATE_CELL', payload: cell }); + }; +} export const sendScPattern = (server, expression) => { return dispatch => { + console.log(expression); if (!expression) return; axios.post('http://' + server.replace('http:', '').replace('/', '').replace('https:', '') + '/scpattern', { 'pattern': expression }) .then((response) => { + console.log("sendScPattern response", response); dispatch({ type: 'FETCH_SCCOMMAND', payload: response.data }) }).catch(function (error) { }); } } +export const saveScBootInfo = (message) => { + //reducer + return dispatch => { + dispatch({ type: 'MESSAGE_CLICK', payload: message }); + }; +} export const consoleSubmit = (server, expression) => { return dispatch => { axios.post('http://' + server.replace('http:', '').replace('/', '').replace('https:', '') + '/pattern', { 'pattern': [expression] }) .then((response) => { + dispatch({ type: 'DEBUG_TIDAL', payload: response.data }) }).catch(function (error) { console.error(error); }); } } + +export const sendPatterns = (server, channel, stepValue, scenePatterns, click, globalparams) => { + let math = require('mathjs'); + + // channel, pattern + let k = channel.name, v = stepValue; + + const getParameters = (v) => { + let param = []; + _.map(_.split(v, /[`]+/g), (p1, p2) => { + p1 = _.trim(p1); + + if(p1 !== "") param.push(p1); + }); + return param; + } + const processParameters = (parameters, newCommand, cellItem) => { + // For each parameter in parameter list + _.forEach(parameters, function(value, i) { + // Temporal parameter + if(value === 't'){ + newCommand = _.replace(newCommand, new RegExp("`t`", "g"), click.current); + } + // Random parameter + else if(_.indexOf(cellItem[i], '|') === 0 && _.lastIndexOf(cellItem[i], '|') === cellItem[i].length-1) + { + cellItem[i] = cellItem[i].substring(1, _.indexOf(cellItem[i], '|', 1)); + let bounds = _.split(cellItem[i], ','); + if(bounds[0] !== undefined && bounds[0] !== "" && + bounds[1] !== undefined && bounds[1] !== ""){ + bounds[0] = parseFloat(bounds[0]); + bounds[1] = parseFloat(bounds[1]); + newCommand = _.replace(newCommand, new RegExp("`"+value+"`", "g"), _.random(_.min(bounds), _.max(bounds))); + } + } + // Value parameter + else { + // Value is NOT provided in the gridcell + if (cellItem[i] === '' || cellItem[i] === undefined) { + // Look for the default value (e.g. "`x?slow 3`") + // eslint-disable-next-line + let re = new RegExp("`(("+value+"\?)[^`]+)`", "g"), match = re.exec(newCommand); + + // We have a default parameter ready + if (match[1] !== undefined && _.indexOf(match[1], '?') !== -1) { + const defaultValue = match[1].substring(_.indexOf(match[1], '?')+1); + newCommand = _.replace(newCommand, new RegExp("`("+value+")[^`]*`", "g"), defaultValue); + } + // We have nothing, using most general parameter i.e. 1 + else { + newCommand = _.replace(newCommand, new RegExp("`("+value+")[^`]*`", "g"), 1); + } + } + // Value IS provided in the gridcell + else { + newCommand = _.replace(newCommand, new RegExp("`("+value+")[^`]*`", "g"), cellItem[i]); + } + } + }); + return newCommand + } + + // pattern name + const cellName = getParameters(v)[0]; + if(channel.type === "PatternRoll") { + let name = _.split(cellName, ':'); + if (name[1] === undefined) name[1] = 0; + + let begin = 0, end = 1, speed = 1, loop = 1; + + let cellParams = _.slice(getParameters(v), 1); + _.each(cellParams, function(field) { + let f = _.split(field, ':'); + if(f[0] === 'l') loop = _.toInteger(f[1]); + else if(f[0] === 's') speed = _.toInteger(f[1]); + else if(f[0] === 'b') begin = _.toInteger(f[1]); + else if(f[0] === 'e') end = _.toInteger(f[1]); + }) + + console.log(name, begin, end, speed, loop); + return dispatch => { + var vsq = [name[0], name[1], begin, end, speed, loop, channel.cid]; + console.log("SENDSQ", vsq); + axios.post('http://localhost:3001/sq', { sq: vsq }) + .then((response) => { + console.log("# Response of pattern roll trig", response); + }).catch(function (error) { + console.error(error); + }); + } + } + else { + return dispatch => { + const getFinalPattern = () => { + // command of the pattern + const cmd = _.find(scenePatterns, c => c.name === cellName); + let newCommand; + + // CPS channel handling + if( k === 'cps'){ + newCommand = cellName; + return [ k + " " + newCommand ]; + } + // other channels + else if(cmd !== undefined && cmd !== null && cmd !== "" && v !== ""){ + let cellItem = _.slice(getParameters(v), 1); + newCommand = cmd.pattern; + + // Applies parameters + if(cmd.params !== '') + newCommand = processParameters(_.concat( _.split(cmd.params, ','),'t'), newCommand, cellItem); + else + newCommand = processParameters(['t'], newCommand, cellItem); + + // Math Parser + // eslint-disable-next-line + _.forEach(_.words(newCommand, /\&(.*?)\&/g), function(val, i){ + console.log(val); + newCommand = _.replace(newCommand, val, _.trim(math.eval(_.trim(val,"&")),"[]")); + }) + + // Prepare transition and solo + let transitionHolder, pattern; + if (channel.type === "Tidal" && channel.transition !== "" && channel.transition !== undefined ){ + let na = channel.name.substring(1,channel.name.length); + transitionHolder = "t"+ na + " " + channel.transition + " $ "; + } + else { + transitionHolder = k + " $ "; + } + + + if( channel.type === "SuperCollider"){ + dispatch({ type: 'UPDATE_SCCOMMAND', payload: newCommand }); + // + //console.log(newCommand); + } + else { + pattern = transitionHolder + newCommand; + } + + // stored patterns + globalparams.storedPatterns[channel.cid] = ''; + globalparams.storedPatterns[channel.cid] = pattern; + + // Apply global parameters + if (globalparams.globalChannels.includes(channel.cid.toString()) || globalparams.globalChannels.includes(0)){ + if(globalparams.globalCommands[0] === '#' || globalparams.globalCommands[1] === '+'||globalparams.globalCommands[1]=== '*'){ + pattern = transitionHolder + globalparams.globalTransformations + newCommand + globalparams.globalCommands; + } + else { + pattern = transitionHolder + globalparams.globalCommands + newCommand + globalparams.globalTransformations; + } + } + else { + pattern = transitionHolder + newCommand ; + } + + return [ pattern ]; + } + else + return false; + } + axios.post('http://' + server.replace('http:', '').replace('/', '').replace('https:', '') + '/pattern', { 'pattern': _.compact(getFinalPattern()) }) + .then((response) => { + dispatch({ type: 'DEBUG_TIDAL', payload: response.data }) + }).catch(function (error) { + console.error(error); + }); + } + } +} + + + export const sendGlobals = (server,storedPatterns,storedGlobals, vals,channels) => { return dispatch => { const getParameters = (v) => { - var param = []; + let param = []; _.map(_.split(v, /[`]+/g), (p1, p2) => { p1 = _.trim(p1); @@ -702,60 +635,58 @@ export const sendGlobals = (server,storedPatterns,storedGlobals, vals,channels) } const globalindex = getParameters(vals)[0]; + let pat = [],ch; if(globalindex !== undefined){ - var pat = [],ch; - // command of the pattern - var currentglobal = Object.values(storedGlobals[globalindex]); - var activeChannels = _.slice(getParameters(vals), 1); + // command of the pattern + let currentglobal = Object.values(storedGlobals[globalindex]); + let activeChannels = _.slice(getParameters(vals), 1); // Construct the active channel list from channel list - var tch = []; + let tch = []; activeChannels = _.split(activeChannels, ' '); - var b = new RegExp("^[A-Za-z0-9]+", "g"); + let b = new RegExp("^[A-Za-z0-9]+", "g"); _.forEach(activeChannels, function(chan, i) { tch.push (chan); - var stp=storedPatterns[chan-1]; + let stp=storedPatterns[chan-1]; if(stp !== undefined){ ch = stp.match(b)[0]; - ch = ch + ' $ '; + ch += ' $ '; stp = stp.substring(stp.indexOf('$')+1); - console.log(stp); - var pp = ch + currentglobal[1] + stp + currentglobal[0]; - console.log(pp); - pat.push(pp); + pat.push(ch + currentglobal[1] + stp + currentglobal[0]); } }); - // for (var j = 0; j < storedPatterns.length; j++) { - // pat.push(storedPatterns[j]); - // } - } + } axios.post('http://' + server.replace('http:', '').replace('/', '').replace('https:', '') + '/pattern', { 'pattern': pat }) .then((response) => { }).catch(function (error) { console.error(error); }); - - } - + } } export const consoleSubmitHistory = (server, expression, storedPatterns,channels) => { return dispatch => { - var b = new RegExp("^[A-Za-z0-9]+", "g"); - var ch = expression.match(b)[0]; - console.log(ch); - if (ch === 'm1' || ch === 'm2' || ch === 'm3' || ch === 'm4' || ch === 'v1' || ch === 'u1'){ - storedPatterns[_.indexOf(channels,ch)] = ''; - storedPatterns[_.indexOf(channels,ch)] = expression; + let b = new RegExp("^[A-Za-z0-9]+", "g"); + let chan = expression.match(b)[0]; + if ( expression === 'jou'){ + _.each(channels, function (ch, i) { + if(ch.type === 'Tidal' || ch.type === 'SCSynth' || ch.type === 'Audio'){ + storedPatterns[ch.cid] = ch.name + ' $ silence'; + } + }) } - else if ( expression === 'jou'){ - for (var i = 0; i < storedPatterns.length; i++) { - storedPatterns[i] = channels[i] + ' $ silence' ; - } - + else if ( expression === 'mjou'){ + _.each(channels, function (ch, i) { + if(ch.type === 'Tidal-MIDI' || ch.type === 'MIDI'){ + storedPatterns[ch.cid] = ch.name + ' $ silence'; + } + }) } else{ - storedPatterns[_.indexOf(channels,ch)] = ''; - storedPatterns[_.indexOf(channels,ch)] = expression; + _.each(channels, function (ch, i) { + if(chan === ch.name){ + storedPatterns[ch.cid] = expression; + } + }) } axios.post('http://' + server.replace('http:', '').replace('/', '').replace('https:', '') + '/pattern', { 'pattern': [expression] }) .then((response) => { @@ -765,13 +696,12 @@ export const consoleSubmitHistory = (server, expression, storedPatterns,channels } } - -export const globalUpdate = (t, c) => { +export const globalUpdate = (t, c, d) => { return { - type: 'UPDATE_GLOBAL', transform: t, command: c + type: 'UPDATE_GLOBAL', transform: t, command: c, channel:d } } -export const globalStore = (storedG) => { +export const globalStore = (storedG,storedPatterns) => { return { type: 'STORE_GLOBAL', storedGlobals: storedG } @@ -780,68 +710,113 @@ export const globalStore = (storedG) => { export const resetPattern = () => ({type: 'RESET_CC'}); export const fetchPattern = () => ({type: 'FETCH_CC'}); -var timer = []; -export const updateTimerduration = (_index,_duration,_steps) => { - if(_duration === "" || !isNaN(parseInt(_duration))) - return { - type: 'UPDATE_TIMER', payload: _index, duration : _duration +export const createChannel = (newc) => { + return { + type: 'CREATE_CHANNEL', payload: newc } +} +export const updateChannel = (item) => { + return { type: 'UPDATE_CHANNEL', payload: item } +} +export const stepChannel = (channel) => { + return { type: 'RESTEP_CELL', payload: channel} +} +export const deleteChannel = (key) => { + return { type: 'DELETE_CHANNEL', payload: key } +} + +export function forceUpdateLayout(windows, current_layout_length) { + // react-grid-layout only rerenders when number of layouts have changed. + // Add or remove a dummy layout to change the number of layouts, and force + // it to rerender itself + if(windows.length === current_layout_length){ + if(_.find(windows, function(o) { return o.i === 'dummy'; })){ + windows = _.reject(windows, ['i', 'dummy']); + } + else { + windows = _.concat(windows, {i: 'dummy', x: 11, y: 100, w: 5, h: 4, minW: 2, isVisible: false}); } + } + return dispatch => { + dispatch({ type: 'UPDATE_LAYOUT', payload: windows }); + } +} +export function updateLayout(windows) { + return dispatch => { + dispatch({ type: 'UPDATE_LAYOUT', payload: windows }); + } +} + +export function updateSeq(seqlist) { + return { type: 'UPDATE_SEQ', payload: seqlist}; } -var timerWorker= []; -export const createTimer = (_index,_duration, _steps) => { +export function chokeClick() { + return { type: 'TOGGLE_CLICK'}; +} - timerWorker[_index] = new Worker("./src/actions/tworker.js"); - timerWorker[_index].onmessage = function(e) { - if (e.data.type == "tick") { - store.dispatch(updtmr(e.data.id)); - timer[_index] = e.data.msg; - } - } - return { - type: 'CREATE_TIMER', payload: _index, duration : _duration + +export function startClick() { + return dispatch => { + dispatch({ type: 'INC_CLICK'}); + } +} + +export function resetClick() { + return dispatch => { + dispatch({ type: 'RESET_CLICK'}); } } -export const updtmr = (_index) => { +export function fbupdatechannelinscene(model, data, s_key) { + models[model].dataSource.child(s_key).child("channels").child(data['key']).update({...data}) +} - return { - type: 'INC_TIMER', payload: _index - } +export function fbdeletechannelinscene(model, s_key, c_key) { + models[model].dataSource.child(s_key).child("channels").child(c_key).remove(); + store.dispatch(deleteChannel(c_key)); } -var stopParam = []; -export const startIndividualTimer = (_index,_duration, _steps) => { - if(!stopParam[_index]){ - stopParam[_index] = true; - timerWorker[_index].postMessage({type : "start", id: _index, duration: _duration, steps: _steps, timer: timer[_index]}); +export function fbsavelayout(model, layout, uid, c_id) { + if ( uid !== undefined ) { + let temp_layouts = {}; + _.forEach(layout, function(o) { + temp_layouts[o.i] = o; + }) + models[model].dataSource.child(uid).child("layouts").child("customs").child(c_id).set(temp_layouts) } } -export const pauseIndividualTimer = (_index) => { - stopParam[_index] = false; - timerWorker[_index].postMessage({type : "pause", id: _index,timer: timer[_index]}); - return { - type: 'PAUSE_TIMER', payload: _index +export function fbdeletecustomlayout(model, uid, c_id) { + if ( uid !== undefined ) { + models[model].dataSource.child(uid).child("layouts").child("customs").child(c_id).remove(); } } -export const stopIndividualTimer = (_index) => { - stopParam[_index] = false; - timerWorker[_index].postMessage({type : "stop", id: _index, timer: timer[_index]}); - return { - type: 'STOP_TIMER', payload: _index + +export function fbupdatelayout(model, layout, uid) { + // console.log(layout, uid); + if ( uid !== undefined ) { + let temp_layouts = {}; + _.forEach(layout, function(o) { + temp_layouts[o.i] = o; + }) + models[model].dataSource.child(uid).child("layouts").child("default_layout").set(temp_layouts) } } -export function startClick() { - return dispatch => { - dispatch({ type: 'INC_CLICK'}); +export function fbsaveconfig(model, uid, config) { + if ( uid !== undefined ) { + models[model].dataSource.child(uid).child("config").update({...config}); } } -export function stopClick() { +export function startProcessing(server) { return dispatch => { - dispatch({ type: 'STOP_CLICK'}); + axios.post('http://' + server.replace('http:', '').replace('/', '').replace('https:', '') + '/processing') + .then((response) => { + // do sth with response + }).catch(function (error) { + console.error(error); + }); } } diff --git a/src/actions/tworker.js b/src/actions/tworker.js deleted file mode 100755 index a57c3f8..0000000 --- a/src/actions/tworker.js +++ /dev/null @@ -1,19 +0,0 @@ -self.onmessage=function(e){ - if (e.data.type == "start") { - console.log('t', t); - var interval= e.data.duration / e.data.steps * 1000; - var t = setInterval(function(){postMessage({type:"tick", id:e.data.id, msg: t});},interval) - } - else if (e.data.type == "update") { - var interval= e.data.duration / e.data.steps * 1000; - if (e.data.timer) { - clearInterval(e.data.timer); - var t=setInterval(function(){postMessage({type: "tick", id:e.data.id, msg:t});},interval) - } - } - else if (e.data.type == "stop" || e.data.type == "pause") { - clearInterval(e.data.timer); - e.data.timer=null; - - } -} diff --git a/src/assets/_rule.js b/src/assets/_rule.js index 5478afd..84c2caf 100755 --- a/src/assets/_rule.js +++ b/src/assets/_rule.js @@ -1,10 +1,10 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE - +/* eslint-disable */ (function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS + if (typeof exports === "object" && typeof module === "object") // CommonJS mod(require("../../node_modules/codemirror/lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD + else if (typeof define === "function" && define.amd) // AMD define(["../../node_modules/codemirror/lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); @@ -39,7 +39,7 @@ var ch = source.next(); if (specialRE.test(ch)) { - if (ch == '{' && source.eat('-')) { + if (ch === '{' && source.eat('-')) { var t = "comment"; if (source.eat('#')) t = "meta"; return switchState(source, setState, ncomment(t, 1)); @@ -47,7 +47,7 @@ return null; } - if (ch == '\'') { + if (ch === '\'') { if (source.eat('\\')) source.next(); // should handle other escapes here else @@ -59,18 +59,18 @@ } // console.log(ch); - if (ch == '&') { + if (ch === '&') { // console.log("mathState"); return switchState(source, setState, mathExpression); } - if (ch == '`') { + if (ch === '`') { // console.log("varState"); return switchState(source, setState, variableExpression); } - if (ch == '"') { + if (ch === '"') { // console.log("stringState"); return switchState(source, setState, stringLiteral); @@ -90,7 +90,7 @@ } if (digitRE.test(ch)) { - if (ch == '0') { + if (ch === '0') { if (source.eat(/[xX]/)) { source.eatWhile(hexitRE); // should require at least 1 return "integer"; @@ -115,7 +115,7 @@ } if (symbolRE.test(ch)) { - if (ch == '-' && source.eat(/-/)) { + if (ch === '-' && source.eat(/-/)) { source.eatWhile(/-/); if (!source.eat(symbolRE)) { source.skipToEnd(); @@ -131,18 +131,18 @@ } function ncomment(type, nest) { - if (nest == 0) { + if (nest === 0) { return normal(); } return function(source, setState) { var currNest = nest; while (!source.eol()) { var ch = source.next(); - if (ch == '{' && source.eat('-')) { + if (ch === '{' && source.eat('-')) { ++currNest; - } else if (ch == '-' && source.eat('}')) { + } else if (ch === '-' && source.eat('}')) { --currNest; - if (currNest == 0) { + if (currNest === 0) { setState(normal()); return type; } @@ -156,11 +156,11 @@ function stringLiteral(source, setState) { while (!source.eol()) { var ch = source.next(); - if (ch == '"') { + if (ch === '"') { setState(normal()); return "string"; } - if (ch == '\\') { + if (ch === '\\') { if (source.eol() || source.eat(whiteCharRE)) { setState(stringGap); return "string"; @@ -184,7 +184,7 @@ function mathExpression(source, setState) { while (!source.eol()) { var ch = source.next(); - if (ch == '&') { + if (ch === '&') { setState(normal()); return "mathexpression"; } @@ -196,7 +196,7 @@ function variableExpression(source, setState) { while (!source.eol()) { var ch = source.next(); - if (ch == '`') { + if (ch === '`') { setState(normal()); return "variableexpression"; } diff --git a/src/assets/logo.svg b/src/assets/logo.svg new file mode 100755 index 0000000..fb98ef0 --- /dev/null +++ b/src/assets/logo.svg @@ -0,0 +1 @@ +logo \ No newline at end of file diff --git a/src/components/App.js b/src/components/App.js index 6d868c3..aef4b37 100755 --- a/src/components/App.js +++ b/src/components/App.js @@ -1,15 +1,15 @@ -import React, { Component } from 'react'; -import MenuBar from './MenuBar.react' -import './App.css'; -import './_comp.css'; - -export default class App extends Component { - render() { - return ( -
- - {this.props.children} -
- ); - } -} +import React, { Component } from 'react'; +import MenuBar from './MenuBar.react' +import './style/App.css'; +import './style/_comp.css'; + +export default class App extends Component { + render() { + return ( +
+ + {this.props.children} +
+ ); + } +} diff --git a/src/components/Canvas.react.js b/src/components/Canvas.react.js new file mode 100755 index 0000000..4866c06 --- /dev/null +++ b/src/components/Canvas.react.js @@ -0,0 +1,226 @@ +import _ from 'lodash'; +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import store from '../store'; +import io from 'socket.io-client'; + +import './style/Home.css'; +import './style/Layout.css'; + +import P5Wrapper from 'react-p5-wrapper'; +import sketch from './sketches/tempo'; +// import vis_sketch from './sketches/tempo'; + +import GL from "gl-react"; +import GLReactDOM from "gl-react-dom"; +import { consoleSubmit, resetClick, sendScPattern, saveScBootInfo, startProcessing } from '../actions' + +class Canvas extends Component { + constructor(props) { + super(props) + this.state = { + socket_sc: io('http://localhost:3006/'), // Port 3005 is skipped because + trigger_msg: {}, // a HTC Vive process is using it + resolution: 12, + cycles: 8, + reload: false, + play: false, + content: 0, + maxContent: 3, // 0-vis, 1-shader1, 2-shader2 + isEditor: false + } + } + + componentDidMount() { + const ctx = this; + const { socket_sc } = ctx.state; + + socket_sc.on('connect', (reason) => { + console.log("connect: ", reason); + store.dispatch(saveScBootInfo({boot: 1, tidalMenu: true})); + }); + socket_sc.on('disconnect', (reason) => { + console.log("disconnect: ", reason); + store.dispatch(saveScBootInfo({boot: 0, tidalMenu: false})); + }); + socket_sc.on("/sclog", data => { + ctx.setState({trigger_msg: data.trigger}); + + // console.log("SCLog: ", data.trigger); + if(_.startsWith(data.trigger, 'SIREN')) { + store.dispatch(saveScBootInfo({boot: 1, tidalMenu: true})); + } + }) + } + + updateDimensions() { + const element = document.getElementById('canvasLayout'); + if(element && element !== null){ + const w = element.clientWidth; + const h = element.clientHeight; + + // -25 (header) -3 (borders) -24 (controls) -1 border + return {w: w, h: h-53}; + } + } + + render() { + const ctx = this; + + // SINGLE MESSAGE STRUCTURE + // {time, args} + + // STACK MESSAGE STRUCTURE + // 0: Array(2) + // 0: + // s: "hh" + // t: Array(1) + // 0: + // cycle: 902, + // delta: 0.5, + // time: 901.41357317311 + + let msg = ctx.state.trigger_msg; + // console.log(msg); + let time = msg['time'] !== undefined ? msg['time'] : 0; + let rate = Math.sin(time)/2; //msg['cycleInfo'] !== undefined ? _.toNumber(msg['cycleInfo']['delta']) : 0.5; + let depth = msg['cycleInfo'] !== undefined ? _.toNumber(msg['cycleInfo']['delta']) : 0.5; + + const shaders = GL.Shaders.create({ + blobby: { + frag: ` + precision highp float; + + uniform float time; + uniform vec2 resolution; + uniform float depth; + uniform float rate; + + #define N 16 + + void main( void ) { + vec2 v = (gl_FragCoord.xy-(resolution*0.5))/min(resolution.y,resolution.x)*10.0; + float t = time * 0.3,r=2.0; + for (int i=1;i + + ); + const Sinewave = GL.createComponent( + ({ time, resolution, colorMult, coeffx, coeffy, coeffz }) => + + ); + + // TODO: + // Listen to sketch window events to toggle `isEditor` + const handleClickProcessing = event => { + const ctx = this; + if(!ctx.state.isEditor) { + console.log("Interpreting Editor"); + store.dispatch(startProcessing("localhost:3001")); + ctx.setState({isEditor: true}); + } + } + const handleClickChange = event => { + ctx.setState({content: (ctx.state.content+1) % ctx.state.maxContent}); + } + + let dimensions = ctx.updateDimensions(); + let width = dimensions ? dimensions.w: 600; + let height = dimensions ? dimensions.h: 90; + const {Surface} = GLReactDOM; + return (
+
+ + +
Cycles: {ctx.setState({cycles: _.toInteger(e.target.value)})}}/>
+
Resolution: {ctx.setState({resolution: _.toInteger(e.target.value)})}}/>
+ +
+
+ {ctx.state.content === 0 && + } + {ctx.state.content === 1 && + + + } + {ctx.state.content === 2 && + + + } + +
+
); + } +} +export default connect(state => state)(Canvas); diff --git a/src/components/Cell.react.js b/src/components/Cell.react.js new file mode 100755 index 0000000..ca5ba2b --- /dev/null +++ b/src/components/Cell.react.js @@ -0,0 +1,110 @@ + +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import store from '../store'; +import _ from 'lodash'; + +import {sendPatterns, setExecution, fbupdatechannelinscene, updateCell} from '../actions'; + +class Cell extends Component { + constructor(props) { + super(props) + this.state = { + modelName : 'Cell', + value: '', + c_key:'', + tidalServerLink: 'localhost:3001', + s_key:'', + cid:'', + className:'GridItem', + index:'' + } + } + + componentWillMount = () => { + this.setState({value: this.props.item.vals[this.props.index], + cid: this.props.item.cid, + c_key:this.props.item.key, + index: this.props.index, + s_key: this.props.s_key}); + } + + submitKey = (event) => { + + const ctx = this; + const {tidalServerLink, value} = ctx.state; + const { click } = ctx.props; + const channel = ctx.props.item; + + if(event.keyCode === 13 && event.ctrlKey){ + let scenePatterns; + _.each(ctx.props.matrices, function(d){ + if(d.matName === ctx.props.active){ + scenePatterns = d.patterns; + } + }) + + let stepvalue = value; + if (stepvalue !== ""){ + store.dispatch(setExecution()); + store.dispatch(sendPatterns(tidalServerLink, channel, value, + scenePatterns, click, ctx.props.globalparams)); + ctx.executionCss(event) ; + } + else if (ctx.props.sccommand.scpat !== ""){ + ctx.sendScPattern(tidalServerLink,ctx.props.sccommand.scpat); + } + } + } + + executionCss(event, duration = 500) { + event.persist(); + event.target.className += ' Executed'; + _.delay(function(){ _.replace(event.target.className, ' Executed', ''); }, + duration); + } + + render() { + const ctx = this; + const setText = ({ target: { value }}) => { + + const c_cell = { cell_value: value, cid: ctx.state.cid, c_key: ctx.state.c_key, cell_index: ctx.state.index}; + store.dispatch(updateCell(c_cell)); + // const sceneKey = _.findKey(ctx.props.matrices, ['matName', ctx.props.active]); + const val = ctx.props.cell.vals; + const nc = { vals: val[ctx.state.cid], key: ctx.state.c_key }; + ctx.setState({value: value}); + fbupdatechannelinscene('Matrices', nc, ctx.state.s_key); + } + + const focusCell = ({ target: { value }}) => { + const ctx = this; + ctx.nameInput.focus(); + } + var className = ctx.state.className; + if(ctx.props.currentStep === ctx.state.index){ + className += ' active' + } + if(ctx.props.index % 2 === 0) { + className += ' even' + } + else { + className += ' odd' + } + if(_.indexOf(ctx.props.cell.selectedCells, ctx.state.cid+"_"+ctx.state.index) >= 0) { + className += ' selected'; + } + return
+