--- Post open-sourcing (to prioritise)
- Improve test coverage
- Add doxygen-style comments
- Decuple UI from Engine (THE SPLIT)
- Introduce mocks for AudioContext & Web Audio APIs
--- Refactoring
- Rename ComboBox component to something better (SearchBox? PanelCreator? PanelSelector?)
- Extract everything that can be extracted from panel factories
--- System integration
- Main menu' commands
- new
- save
- save as
- open
- import (loads file without wiping workarea)
- Ask for confirmation before replacing current document in "new" and "open" actions
- Ask for confirmation before overriding an existing file in "save as" action
- Settings page
- Plugin system
- Add lateral scrolling to toolbar to be able to reach out-of-screen items
- Main-thread service framework to avoid squashing everything into electron.js
--- Engine
-
THE SPLIT: Separate the execution code (the engine) from the rendering code (the react frontend)
- Create a separate API daemon that can receive and process requests from the Electron app
- Modify UI to work with API
- Integrate CLI with API
- The engine should take a representation of the network and a representation of the current state and store them
- Once the state is set, it can be updated at any time
- The engine can be queried for the next step, in which case it should execute one iteration and respond with the updated state
- The engine should carry out any side effect
- Make a CLI that can use the engine daemon to run a network in an headless way
- Add types of connectors that can only transmit when in play
- Transform all panel types to work on the engine
-
Stepper-type panels or endpoints or connections, still not sure which
-
Explicitly handle the "null/undefined" value in a more organic way
-
Needs more orthogonality: possibility to set both inputs and outputs from execute or onPulse, etc
-
Actual panels
- VIDEO: Extract frame
- VIDEO: Resize
- VIDEO: Create from images
- IMAGE: Image group
- FLOW: Timeline (place events on a timeline and on play it will start triggering Pulses on the various eps
- Web Audio nodes (experimental)
- FFT/IFFT?
- Mic input
- Save audio
- Panner
- Channel Merger
- Channel Splitter
- Filter
- Convolver
- Gain
- Integrate SamplePlay into SampleLoad
- AudioOut: sink to which to connect sound producers
- SampleLoad: load a sample
- SamplePlay: config of a sample (loop etc)
- Oscillator: play a frequency
- P5.js integration
- IMAGE: Transform (4 points)
- IMAGE: Threshold
- Add features to manipulate channels
- 3d and vector graphics integration?
- Three.js integration
- Add turbulence input to generators
- TILES: Tile
- IMAGE: Path
- IMAGE: Shape / Polygon
- IMAGE: Polyline
- IMAGE: FFT / IFFT
- IMAGE: Pixelate
- IMAGE: Mix?
- IMAGE: Crop
- IMAGE: Move
- HASHES: Hash functions
- Md5
- Sha1
- ALGEBRA: Unify scalar and dot product in a single panel
- SOURCE: Glob
- FLOW: For: (from:Value + to:Value + step:Value + Pulse -> Pulse + Pulse + Value) expose index variable and emit "execute" every loop until "exit"
- ?????: (Value + Value -> Value) Date formatter according to pattern and separator
- INPUTS: File info
- Envelope visualizer (multi-input pin with value for each? Not sure)
- TEXTURES: Noise generators
- Gaussian noise
- Simplex noise (take w/h + seed)
- Anisotropic noise
- ADJUSTMENTS
- Posterize
- Contrast
- Brightness
- Saturation
- Hue
- Lighten
- Darken
- Fade
- TEXTURES: Add different types of generators
- IMAGE: Stripes
- IMAGE: Checkers
- IMAGE: Rings
- IMAGE: Unary Operators
- [~] IMAGE: Canny
- IMAGE: Invert colors
- IMAGE: FlipX
- IMAGE: FlipY
- IMAGE: Grey
- IMAGE: Sepia
- IMAGE: Blend Modes
- Dissolve
- Darker Color
- Lighter Color
- Hue
- Saturation
- Color
- Luminosity
- Darken
- Multiply
- Color Burn
- Linear Burn
- Lighten
- Screen
- Color Dodge
- Linear Dodge
- Overlay
- Soft Light
- Vivid Light
- Hard Light
- Linear Light
- Pin Light
- Hard Mix
- Difference
- Exclusion
- Subtract
- Divide
- Stdin/Stdout/Stderr
- Stdin
- Stderr?
- Stdout
- Operations with Arrays/Collections? How? What about objects? They are certainly needed for api calls etc
- Basic Array panel (List)
- Add Pop, Shift, Unshift pins
- Merge
- Intersection
- Unique (Distinct)
- Basic Object panel (Dictionary)
- Basic Array panel (List)
- Color ramp
- IMAGE: ImageSave
- IMAGE: Heightmap
- TEXTURES: Gradient
- Linear Gradient
- Circular Gradient
- Hex2HSL introduce tinycolor
- TEXTURES: Add angle to patterns
- TEXTURES: Linear Gradient
- INPUTS: Gradient Picker
- Introduce tinycolor in components with hex input
- IMAGE: Resize
- IMAGE: Combine Channels
- IMAGE: Replace Dilate and Erode with Morphology Operators
- Dilate
- Erode
- Open
- Close
- Black Hat
- Top Hat
- IMAGE: Text
- IMAGE: Erode
- IMAGE: Dilate
- IMAGE: CopyImage
- IMAGE: Rescale
- IMAGE: Create Empty Image (take w/h + background color, default transparent)
- IMAGE: Get Channel
- IMAGE: Rotate
- IMAGE: Gaussian blur
- IMAGE: imageView must have checkered background
- IMAGE: imageView wrong panel size on first image load
- IMAGE: Convolution
- INPUT: Folder path
- Add explicit support for different object types
- Represent Matrices in TextView
- Represent Matrices in DisplayLogger
- Represent Matrices in FileLogger
- ALGEBRA: Matrix summation
- ALGEBRA: Normalize matrix
- ALGEBRA: Matrix multiplication
- ALGEBRA: Matrix
- INPUT: time selector
- INPUT: date selector
- SET: item by item array
- FLOW: All: (multiple Pulses -> single Pulse) waits for a pulse on each of the inputs and then sends a pulse through the output
- TRANSFORMS: Date/time to Timestamp
- TRANSFORMS: Timestamp to Date/time
- ALGEBRA: Threshold: (Value -> Value) sets outputs (High, Equal, Low) to true depending on whether first input is <=> than second
- INPUT: Toggle: (UI -> Value) set output to true or false depending on toggle
- BASIC: Counter: (Pulse -> Value) count pulses (also has a Reset pin)
- BASIC: Memory: (Pulse + Value -> Value) store content of value input when it receives a pulse
- INPUT: Button: (UI -> Pulse) send a pulse when user presses button
- FLOW: If: (Value -> Pulse) send pulse along Then or Else branches based on value of expression
- FLOW: Delta: (Value -> Pulse) send a pulse when input changes
- OUTPUT: Semaphore: (Value -> UI) turn on a led if the value is non-null, red or green depending on truthy value
- OUTPUT: Logfile: (Value + Pulse -> OS) append message to file
- INPUT: Deviator: (Value + Value -> Value) The output to 1 of N inputs based on the value of another input
- FLOW: Delay: (Pulse -> X secs -> Pulse)
- EVENTS: Clock: (every X secs -> Pulse)
- INPUT: Color Picker
- INPUT: Knob with inputs for min, max, and step
- INPUT: Range with inputs for min, max, and step
- OUTPUT: Logger: (a more complex mix of Display and LogFile that keeps N lines of text and adds a new line upon receiving a Pulse)
- OUTPUT: Led: Similar to Semaphore but with color input
- SOURCES: (Pulse -> Value) Fetch Current Date
- SOURCES: (Pulse -> Value) Fetch Current Time
- SOURCES: (Pulse -> Value) Fetch Random number between 0 and 1
- SOURCES: (Pulse -> Value) Fetch Current timestamp
- SOURCES: Text file, line by line
- FLOW: Gate (pass transistor)
- OUTPUTS: Color view
- EVENTS: Emit on file change
- EVENTS: Socket: socket listener, together with CLI tool to connect and send messages
- EVENTS: Accumulator
-
Can we introduce jimp as well? Is it interoperable with image-js? what would it add?
-
Introduce Pulse-type signals
-
Introduce Sources panel palette
-- UI
- Grouped panels should be surrounded by an outline
- Grouped panels can be hidden and replaced by a placeholder?
- Change editable property to become "editor" and change it from boolean to text where you specify the type of editor
- Choose which eps to make editable
- Make the context menu and combo box coordinates window-sensitive
- Make width of collapsed panel a constant (currently the magic number 120)
- Make magic numbers become constants
- Make endpoint section in the panels collapsible
- Editable eps' names have dotted underlining when connected
- Editable eps should close on enter
- Add scale input ep (editable) to range panel
- Add scale input ep (editable) to knob panel
- Pulling a connection from an endpoint to the workarea opens Panel search
- Panel search is constrained by the initial endpoint being an input or output endpoint
- Panel search is constrained by signal and type of the initial endpoint
- Make selected panels get closer or farther away by rolling the scroller
- Add tags to all panels
- Double clicking on the workarea opens Panel search
- Autofocus search box
- Implement Panel Search box
- [~] Move all visual state from panels to panelCoords
- width and height, minWidth and minHeight
- resizer
- Review css of ep inline editor
- Setting default values for primitive endpoints inline
- Double clicking on title of panel to collapse a panel completely
- Make Connector component require coordinates rather than elements, so that the logic can be made more flexible
- Expose signal of endpoint throught color
- Introduce white halo around focused panel
- Lock children (and/or Lock parents?) of a panel OR lock selected panels so they always move together
- Unlock a panel that had been locked with others
- Expose type of endpoint throught symbols/letters
- Expose type of endpoint in tooltip
- Make background of text input panel darker
- Introduce window manager
--- Bugs / Performance
-
select exclusive seems to select anything that is to the left of the selected area if the panel is vertically included
-
Review all components and apply change guards (don't process if inputs have not changed)
-
Introduce ndarray module in matrices etc.
-
State management seems to be the main bottleneck, general simplification of the state management seems to be necessary
- Try transforming the "tuning" variables into local component state variables, so that they only redraw the component
- Try reducing actual panel state to a single "redraw" property to be set to a random value when we want to update the component, the rest of the state can stay in a non-state array
-
Maintain and use endpoint offsets relative to panel position (only rely on screen state when updating the offsets)
-
Dilate and Erode block the UI while being applied?
-
Disallow Value-type signals from creating feedback loops
-
Sanitize topic input to listener (how?)
-
Stalls when trying to rewind file source from EOF signal without a delay
-
Values don't seem to propagate correctly when creating a panel from an endpoint
-
Window resize causes slowdown and stalling --- PROBABLY FIXED
-
Only render panels in view
-
Consider ways of reducing number of connections shown (bounding box overlapping view?)
-
Connectors losing contact with panels
-
Stopping clock connected to dice makes dice output go undefined
-
Deletion of panels must affect also panelCoords
-
Save-files should include position of viewport
-
Crash when deleting multiple panels
-
Crash when I pause with the Controls button
-
WatchFile panel should remove and replace watcher behind the scenes when file name changes, just like the Listener panel does
--- QA
- Fix issue with tests
- Improve test coverage
--- Context menu
- Disconnect panel -> removes all connections
- Duplicate panel -> creates an clone of the panel
- Find origin -> moves view to --middle of the graph-- NO: it moves you back to [0, 0]
- "Delete panel" becomes "Delete panels" when used on selected panel
- Group/Ungroup panels: grouped panels move together
--- NOTES
-
If possible decouple UI panels from Pulse-activated panels
-
When having a UI panel that also has Pulse-type inputs pins, the two avenues of activation may end up overwriting each other's outputs causing bugs