-
Notifications
You must be signed in to change notification settings - Fork 0
/
design-notes.txt
229 lines (199 loc) · 6.69 KB
/
design-notes.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
General
-------
* Firefox compatibility
Sequencer
---------
URGENT
* copyParameter and swapParameters should work between two columns (or the same column) of a pattern rather than (limited to) within a phrase (+turn into generators)
option to alter LINE_TIME changes inside expand(), compact() and copyAndCompact
* Phrase.transpose needs to transpose phrases not currently transposed
* Handle when a pattern with nested phrases is expanded or compacted: Add a PHRASE_SPEED parameter?
* Let PHRASE_TRANSPOSE work when rows are not aligned
* Old chord should continue playing for a bit when using DELAY_TICKS
* Bug when glissando and glide are used together
* Review direct access to Change.value in playback routine
* Support nested phrases in the master column
* Allow columns to move at different tempos
(Second kind of loop: column loop?)
* Columns that exhaust their rows before another column completes start looping
- Can designate one column to loop x times before moving onto the next pattern (otherwise the pattern ends when the longest column completes once (including normal loop parameters))
- If the same phrase is on the same channel in two consecutive patterns then have the option to continue playing without restarting ("free running", offset ignored) as a phrase property
Phrase:
* loop on/off (Reuse LOOP parameter, any non-zero value)
* LOOP & BREAK parameters inside a phrase should be independent
* loop start point (Reuse LOOP parameter)
- "free running" on/off (implement using an undefined offset?)
* Song playback shouldn't all be scheduled at once
Actually a whole pattern should be scheduled at once so ChangeType.EXPONENTIAL works
NEXT FEATURES
Method to split/join patterns
Method to quantize to every x lines (also reduce delays for x<1, set to 0 otherwise)
If notes are triggered more than once or twice per quantum then quantize them to the 1/3, 1/2 & 2/3 waypoints or not at all (noteParameters)
Quantize the durations also
How to handle pattern/column delay?
Method to quantize relative to another track
Method to randomize/humanize
Add PHRASE_VELOCITY parameter (dynamics)
Song Loop From
Freeze/Unfreeze phrase (render to buffer for better performance)
UNDESIGNED
Area for scratch, unused patterns and/or phrases
Edit function to reverse a sequence of rows
Initial song parameters for Channel 1,... Channel N
MAYBES
Phrase/pattern forwards/backwards (step 1, -1, maybe more) (how to counter messing up fades?)
Changes that alternate/randomize between a fixed range of options on each pass
Probability / Aleatoric / Chance / Indeterminate music
Earle Brown, Twenty-Five Pages
Terry Riley, In C
Witold Lutosławski
Graphic notation: https://en.wikipedia.org/wiki/Graphic_notation_(music)
Sequencer UI
------------
ability to drag entire graph up or down, etc.
ability to select multiple graph nodes
Documentation
-------------
Make Wiki complete and up to date
MIDI/Input
----------
New modes:
unison
combinations with phrase trigger in lower octaves
Metronome UI
UI
--
Bug: when MAX_WAVEFORM is changed while noise is active (fix during the rewrite)
Sampler
-------
UI:
allow inserting exact number of samples of silence
show clipping
pencil tool (with cubic interpolation)
Context menu: undo, redo | cut*, copy*, paste, paste mixed, trim* (to selection) | select all | set as loop (or set as loop start + set as loop end)
* = not visible when there's no selection
Pan without shift key, select with shift key
Page down
Shift+Ctrl+left/right should snap to zero crossing, loop points, start and end + Snap using mouse mode
Trim to selection
Scroll bar not visible on mobile -> Draw a custom one
playback separately OR on a track
UI for Parameter.OFFSET? ruler and snap
samples need names
method to create a sample by crossfading one sample into another
Check Number.MAX_VALUE is being applied consistently
editing stereo sample channels separately
Time stretching
Add custom offset/beat slice positions
(e.g. see https://www.renoise.com/blog/Slice%20Markers%20Explained)
MOD2Sample (advanced)
Synth
-----
* Glissando + glide simultaneously
Choice of sample release action (fade or end loop)
Reverb
UI Rewrite
Choice of New Note Action
(release, cut, continue until gate closed or cut, duplicate notes of the same instrument always cut)
Instruments
Velocity & Pitch Automations
Add "Noise Type 2" to UI
Changes for 1 line vs changes over a pattern vs ongoing results?
Allow choosing sampled notes by time as well as by pitch (for percussion)?
Glide / Arpeggio
-----
Glide amount (a time or a rate)
Glide mode (time or rate)
Handle gate triggered previously but not yet closed
Noise
-----
Noise through filter as a modulation source
Low Priority
------------
Parse smpl and inst chunks of a WAV file.
Parse more than one sample per IFF file + envelope chunks, etc.
Make modals local to the component (Sampler, Synth...) (https://webkul.com/blog/how-to-display-a-bootstrap-modal-inside-a-div/)
Insert silence modal: String should be fixed length, overtype entry, spinners increment current column
------
LFO modulating decay, etc.
LFO rate modulated by an envelope
LFO rate modulated by an LFO
LFO amount modulated by an LFO
**Pulse width modulated by an envelope**
--------
--------
Method Phrase/Column Pattern Song
clone X X
fromArray/fromObj X X
clear X X
copy X X x
equals X X
expand X X
compact X x
copyAndCompact X
fill X
transpose X
play X X x
---------
merge (all, commands, notes)X x
overwrite (all, commands, notes)X x
insert (all, commands, notes)X x x
insertEmpty X x
remove X x x
pause x
goto x
Method Sample Instrument
clone x
reverse f,t x
pingPong x x
amplitude f,t x
removeOffset x x
normalize f,t x
amplify f,t x
chord x x
findZero x
copy f,t
remove f,t
insert x
insertSilence x
mix x
separateStereo x x
mixToMono x x
------------------------------
* BPM
* Groove
Broken Chord
*Number of Notes
Chord Pattern
* Glissando
* Number of Triggers
Legato
Retrigger Volume
events = lcm(numberOfNotes, numberOfTriggers)
(multiply by an integer if needed to be at least as many as the glissando)
ticks = events / noteValue (in sixteenths)
(multiply by an integer if needed to be at least 1)
totalTicks = noteValue * ticks
retrigger = totalTicks / numberOfTriggers if numberOfTriggers > 0
0 otherwise
chordSpeed = totalTicks / numberOfNotes
glideTime = glidePercentage if there are chords
glidePercentage * noteValue otherwise
------------------------------
Sample
------
slices
Slice
-----
startOffset
endOffset
duration
triggerNote
gain
SamplePlayer / SlicePlayer
--------------------------
bufferNode
-duration (remove, move into start() method)
samplePeriod
gain
*start()