forked from johnnesky/beepbox
-
Notifications
You must be signed in to change notification settings - Fork 0
/
tasks.txt
445 lines (440 loc) · 37 KB
/
tasks.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
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
√ create tone
√ delete tone
√ adjust start/end of new tone
√ adjust pitch of new note
√ adjust start/end of existing tone
√ add note to tone for arpeggio
√ set scale constraint
√ allow deleting existing notes off the scale
√ set key
√ 3 channels
√ detect when the song stops and restart it. force stop the old SoundChannel for sanity.
√ separate song editing from Main.mxml, put in SongEditor.mxml
√ create Track.mxml, which shows the pattern number of each bar, the playhead
√ 8 patterns for lead, 4 for harmony and bass, assign with number keys
√ 16 bars
√ select channel with up and down arrows
√ select bar with left and right arrows
√ custom looping
√ pausing with space, skipping bars with []
√ tempo dropdown: fast, med, slow
√ save, load
√ beat count, part count
√ show the pitch letters: C, C#, D, etc
√ show ghosts of the notes in the other channels
√ waveform choices
√ bitcrushing the triangle wave
√ noise channel
√ Export to WAV
√ rearrange and hide panels to emphasize important features for beginners. flags for showing fifth, other channels, note names
√ illustrate loop area better
√ allow up to 8 patterns in all channels?
√ when you hover over a selected pattern/channel, instead of the box preview, show a triangle up or down depending on where your mouse is. the other triangle is hollowed out.
√ fix wrap around clipping bug on export
√ fix focus bug: spacebar reexports song!
√ The start of a tone can always snap to an existing tone end.
√ Be more lenient about starting at beats 2 and 3.
√ when bending pitch, multiply over each sample instead of adding.
√ copy length to default when editing length of notes.
√ sawtooth!
√ piano along left side to preview notes? replace "show letters"
√ instead of conditionally reseting the period, try period -= int(period). benchmark!
√ pressing [] shouldn't escape the loop
√ button for export, clean slate, undo/redo, pause
√ replace ChangeFragment with ChangeSong, preserve pattern objects for undo history
√ compress bar data: 2 bars per character.
√ compress tone shapes
√ compress/decompress notes. confirm drums work. empirically optimize prev note count.
√ decompress tone shapes
√ get a domain name!
√ put song in url fragment
√ to save on file size, get rid of that flex text field at the top.
√ put on website!
√ set up some basic html
√ new waves
√ source control
√ karplus strong filter + decay
√ separate main file for offline.
√ take focus from "save as wav" button after clicking it!
√ changing preferences doesn't need to be undoable but should update display.
√ save "preferences" to localSharedObject
√ pausing should actually stop SampleDataEvents
√ as3 lib usage example
√ fix wave drop down menu
√ create README
√ create public version number
√ reenable filter in one drop down menu
√ tremelo/vibrato choices
√ for chorus, have two periods at multiples of the main freq. jitter on arpeggio slices?
√ volume options per channel
√ add license to code
√ link to source in html
√ link to offline version
√ add copyright disclaimer to page
√ link to twitter
√ donation button
√ rename checkmark wave
√ fix piano initialize after mouse event error
√ tweak vibrato depth and speed
√ when tone ends reset period, fixes harp pops and union chorus phase
√ slow down decay soft
√ whole tone scale
√ increment format number, port settings from old version
√ center waves on average amplitude to avoid pops after lowpass
√ move the playhead graphic gradually toward the next position.
√ always fade out volume over last arpeggio
√ attack: hard, soft, slide. don't reset period when sliding!
√ octave scroll bar, with preference option to disable it
√ load old songs with octave offset, default pitch...
√ bring back the old constant volume option, and make it the default for songs loaded with the old format.
√ widen the window to allow the "envelope" label
√ copy paste patterns
√ put the edit buttons in one menu. undo, copy/paste, clean slate, etc
√ copy and paste keyboard commands
√ perform dynamic range compression, increase base volume
√ global volume control
√ drum volume drop down menu
√ clip rect on pattern editor
√ indicate recommended beats/bar 8 somehow
√ fifths chorus option
√ create pitch bend, triggered by vertical dragging.
√ when adding arpeggio to a pitch bend, offset the arpeggio note by the current interval.
√ don't create new arpeggios overlapping old arpeggios on pitch bends.
√ tweak hit detection on pitch bends so that it's a little tighter than a box
√ When the pitch bend changes the initial pitch, recalibrate all notes of the tone.
√ don't let pitch bends escape the normal pitch range, especially with arpeggios. check both new arpeggios and new pitch bends.
√ tweak rendering of pitch bends so that they don't become tiny threads.
√ volume pins
√ volume dragging doesn't seem to be relative to previous volume
√ dragging pitch bend off the side of the editor causes instability
√ copy the volume pin structure for future tones, on a per channel basis.
√ disable volume control when creating new tones with horizontal dragging.
√ reset default tone shape when cleaning slate
√ dragging horizontally should drag the pins, not just the tone endpoints.
√ correctly move pins when swingifying, etc.
√ convert pattern editor from mxml to a sprite
√ modal dialog for customizing song duration
√ able to access patterns over 9 with multiple keystrokes
√ deserialize grouped channel settings
√ make sure keyboard input is disabled in modal dialog
√ serialize pattern id, using as many bits as needed.
√ make sure that all possible pattern bitstrings fit within 4096 characters, or increase the limit.
√ make sure you can't copy patterns between drums and tonal instruments
√ when shrinking bar count, make sure to bound loop, barScrollPos, playhead, etc
√ use customized bar count, create GUI for scrolling bars somehow.
√ empty patterns get special 1-bit treatment
√ serialize pattern instruments
√ Benchmark synthesized vs precomputed noise. Precomputed would allow you to select non chip tune style noise.
√ rebalance drum volume range. bass is too quiet, cymbal too loud.
√ each drum wave gets volume scale
√ don't autoplay until URL fragment has been passed through
√ drums get custom lowpass based on change rate
√ can drums use the other envelope/slide options?
√ tones that fade out volume completely shouldn't slide to next tone
√ attack transitions that slide should let the decay filter smoothly rise again to better approximate strings/violin. also repeated notes shouldn't fade out automatically.
√ volume scaling from chorus effect: Synchronized waves are louder than waves that are almost but not quite the same frequency. Ratio: square root of two!
√ medium sustain filter, slower sharp filter...
√ make a non-editing embeddable player, in an iframe.
√ server RSA authentication
√ figure out song/playlist distinction in embedded players
√ figure out data format for published songs.
√ mouse is attracted to active note half a note above cursor, but not below cursor, even overrides active note at cursor to highlight note above.
√ upper boundary isn't working with drum portamento
√ retro drums really need more sharpness in upper range
√ oops, could press tab a few times to get keyboard focus away from prompt
√ generalize prompt functionality
√ preliminary publish prompt
√ fix piano pitch. still horribly broken!
√ twitter stream on the side
√ color-blind friendly colors
√ buttons to transpose up and down to the next valid note
√ dedicated silent 0 pattern
√ take focus away from master volume after clicking it
√ wav export intro, loop count, outro
√ disable intro and outro checkboxes when the loop encompasses the entire song
√ javascript mobile support!
√ fix those flex dropdowns so they stop throwing errors
√ Reverb
√ optimize those Math functions in Synth
√ make play and volume controls prettier
√ MIDI export
√ I broke safari export? (Did it work before? Apparently so? Either fix it or add warning)
√ Put beepbox in focus on page load.
√ Make the standalone version use js.
√ minify
√ Update the mobile instructions, "vibrate switch" isn't a thing anymore.
√ use the viewBox size thing to make the svg volume icon scalable.
√ update flash version to include bowed chorus and reverb.
√ embed: display notes scaled down to fill timeline. Only need to render it when hash changed.
√ draw lines at bars and octaves
√ when you click the link to the full editor, pause the embed player and open in new window.
√ volume control
√ make maximum size of volume slider and play button proportional to iframe size.
√ allow dragging embedded playhead.
√ make sure there's only one beep box player playing simultaneously. make a random guid on startup. When clicked play, set it to a variable in sessionStorage or localStorage. periodically check to make sure that it's still set to that, otherwise pause.
√ loop control
√ rename note to pitch, tone to note.
√ octave scroll dragging should just be one History change, and it would be nice if dragging sliders didn't generate a bunch of undo history events. Ooh, let's do it for transpose too.
√ merge undo history with browser history.
√ Use hashchanged instead of animation frame to compare hash values.
√ Use pushstate to set hash in url, and include a "state" object indicating whether you can undo.
√ On page load, replace state saying "this is the start of history".
√ If the hash was entered manually, there will be no state. Replace state to indicate undo is possible.
√ When using undo, check if state says we can undo, and if so, use history.back().
√ Remove undo() and redo() methods in ChangeHistory.
√ Stop tracking Changes in ChangeHistory.
√ Reuse the same Song object.
√ For "prospective" changes, if recentChange is different, remember start state and push new state.
√ For "prospective" changes, if recentChange is the same, replace state or undo if reverted.
√ Mark undoable changes in the type system.
√ How much of ChangeHistory and individual Changes can I delete?
√ Delay setting hash until animation frame
√ Use charCodes instead of new strings in base64 stuff.
√ optimize song.toString using charCodes. rename song.toString to song.toBase64String.
√ rename "_on" to "_when". rename attack to envelope.
√ when undoing changes selected bar, track editor should scroll to display it.
√ If there's a drum note at the second-to-top slot, I can't add on to the top slot. Also, the whole snap-to-nearby-note-pitch thing makes less sense for drums anyway.
√ octave scroll bar shouldn't show white highlight when mouseover if current channel is drums.
√ Let "back" and "escape" closed modal dialogs/prompts.
√ copy and paste across tabs? (local storage?)
√ drum noise waves should be static, and generated on demand. (when play() is called, and at start of synth callback, check all drum instruments.) ensureDrumWavesExist()
√ "custom/harmonize" chorus setting. lock first chorus voice to first pitch, the second voice arpeggios remaining pitches.
√ move waves into Music structure.
√ the "period" variables are the wrong name for what they mean. In Song, rename "instruments" to "instrumentCount", and other similar properties.
√ add sixths and eighths rhythms.
√ custom number of channels, up to 6 melodic and 2 drums.
√ change song size prompt
√ import base64, export base64, import json, export json, export midi
√ check all those places where we check whether the channel is 3 to see if it is supposed to be drums.
√ in pattern editor, show all drum channels if appropriate preference is on.
√ track editor scaling
√ track colors based on channel type
√ _defaultPinChannels was broken.
√ move Music to top, rename to Config.
√ drumFilter shouldn't have hardcoded dependence on drum wave index.
√ adjust json import to be backwards compatible with old names: romani, binary
√ when exporting to midi with custom harmony, use correct simultaneous notes.
√ new drum waves! :D (Thanks modded beepbox!)
√ the play button should also have move playhead buttons next to it.
√ responsive design layout. Okay, put play/edit/options/export on a horizontal line under loop editor, song settings below on left, and instrument settings below on right.
√ max-height of pattern editor (and piano/scrollbar) should be less than 100vh.
√ the method for cycling patterns on a bar is inadequate on touchscreen... use select menu? also update instructions in index.html for changing patterns.
√ highlight note edge extensions on touch
√ midi channel export names should be in Config.
√ random infinite loops when opening new song?
√ when pattern is 0, show other channels anyway over black pattern editor.
√ faster tempos
√ layout was messed up if browser default font size is set to large.
√ add a "clean slate"/"new song" button with a little dog-eared page icon.
√ while I'm at it, the edit menu should have a pencil icon and the prefs should have a gear or wrench.
√ rename barpattern to pattern, bareditor to patterneditor, attack to envelope...
√ tempo slider could use tooltip for BPM
√ add auto-follow and auto-play preferences. (I guess autoplay is only on computers? but defaults to true?)
√ restructured song/channel/pattern/instrument js representation.
√ when you click the wave menu then use arrow keys to select drums the editor shouldn't lose focus.
√ phase modulation:
√ interface to select type of channel.
√ modulation sliders, ratio selectors, envelop selectors.
√ make the piano share most of the instrument code with the notes, including arpeggio and operator frequencies... not that you can test that yet.
√ use custom pitches for each modulator if available
√ use "filterTime" for modulator decays
√ determine start and end operator envelopes.
√ rename old envelope to transition
√ separate phase for each operator, allow overriding fundamental frequency for each oscillator with notes.
√ algorithms, feedback!
√ when there are multiple carriers, use a little chorus offset
√ adjust the total volume based on number of carriers
√ forward/backward compatible instrument url
√ operator envelope shapes
√ put a little number in front of every operator row.
√ JSON
√ update midi instrument export too.
√ dragging sliders back and forth rapidly caused spurious undoing!
√ geeze, I really don't like how undoing affects scrolling. is there anything I can do about that? Yes! (except on IE.)
√ more flare speeds?
√ wave filter with a higher cutoff, maybe none. "sustain full" or "none" depending on where I insert it in the list, may need new url version. can probably drop the word "sustain"? (if so, don't forget to remember it for json parsing!)
√ rename sustain to steady, or just leave it off and say "medium" etc. Maybe rename "sharp" to "bright" or something.
√ for chip chorus, save a multiplication for one of the deltas, use ratio for other.
√ scale channel#ChorusSign appropriately so that both wave signals have the correct volume for their pitch. Also the negative sign shouldn't be hardcoded, should be in Config.
√ When increasing number of instruments, copy last existing instrument.
√ reuse song channel objects beyond the first four when re-parsing a song url. Maybe don't reset instruments when reloading songs, to temporarily preserve settings for other instrument types. (but when loading older songs, newer instrument properties should have default values... okay here's the deal: reset the instruments when you get to the instrument type command, resetting only settings relevant to the instrument. However, for song data formats before six, reset all instruments immediately, because they don't have type commands... also drums? ugh this is a mess!)
√ add a little "?" next to "Type" when in FM mode, brings up a popup explaining how to use it, link to a song showcasing some ideas to get you started.
√ while we're at it, custom harmony could use a "?" hint. Anything else?
√ the instructions in index.html need some work.
√ seamless transitions sound poppy. maybe seamless transitions should always fade out if the next note is null AND the note ends before the end of the bar. (Since we don't know yet whether the next bar continues the note.)
√ pitch bends mixed with arpeggios don’t properly check min/max bounds
√ put little numbers on the notes in the pattern editor when in FM mode and there's more than one pitch.
√ dim oscillator envelope when volume/modulation is zero.
√ loop could be dragged past ends of song, goes negative...
√ couldn't sandwich note between two existing adjacent notes.
√ Impasaurus said I made the retro drum sound more "periodic", whoops! Seems like the playhead keeps resetting to zero if there are gaps between drums... fixed!
√ Restructured synthesizer, now each tone is computed in separate passes and reverb is applied after all tones. Much cleaner, and surprisingly still fast. If not all channels are in use, even faster!
√ chorus
√ resonant filter with envelope
√ Added resonance filters to fm/drums.
√ get rid of Config.volumeNames
√ Optimized wave phase and lookup table math slightly. Gave drum tones a random phase on reset, and reset drum tones during rests like the rest of the instruments, so that filters are also reset.
√ copy/paste instruments! (Pasting either patterns or instruments should be grayed out if not compatible?)
√ channel color lookups should wrap around.
√ In mobile layout, the new/edit/prefs/export menus can fit into the left column above song settings.
√ Bake the LFO effects into the pitch bend and volume envelope, like operator envelope.
√ Divide each beat into a standard 24 note stops and 48 arpeggio/volume/vibrato stops.
√ Allow mixing rhythms.
√ Dragging notes while autofollow switches bars could cause notes to overlap.
√ vibrato shaky
√ Target ES6 and use uglify-es.
√ Optionally force scale changes to apply to existing notes.
√ 0.1% of all songs use effect tremolo. Replace it with filter tremolo, which is more useful.
√ fadeout transition: crossfade, fadeout, pad.
√ Add more fractional pulse waves, 1/3 and 1/6, and also moved and renamed plateau to rounded.
√ menu select title option should have "hidden" attribute, along with selected and disabled.
√ Attack/onset time should be measured in seconds. Fadeout can stay relative to tempo though. Removed constraint that transition cannot be longer than half of note duration, and allowed released tones to continue fading in.
√ Added another transition and more pulse widths, renamed transitions.
√ live input tones should track time since note started for delayed vibrato, envelopes, etc, and release active tones if pitch changes.
√ If held & released tones exceeds 8 tones per channel, the oldest ones should fade out fast.
√ Polyphony, as a new option in a new menu called "chords". Other options: "arpeggio" and "custom interval".
√ Use a single midi channel per beepbox channel. Stack notes unless using arpeggio. Don't try to apply "chip interval".
√ Import midi files! (except not drums yet)
√ Import midi non-melodic instruments as noise channels (but still no drumsets).
√ Use interfaces for structured Config data.
√ Empty bars at the end of a song were discarded in the midi export/import process. Fixed!
√ Combine new, export, and import JSON into a File menu.
√ An edit option to autodetect scale and key from existing notes. Add up all notes, biased by pitch, downbeats, duration, and maybe even perceived volume, and find the highest root/fifth pair for key.
√ Made beats-per-bar management way more flexible. Can stretch notes to fit new bar size, or overflow notes across bars.
√ Pull out the bar count choice from the song limits prompt, allow splicing at the beginning or end of the song.
√ Import midi drumsets using a map from drum "pitch" to noise shape.
√ Polyphonic drums.
√ "strum" chords, polyphonic and tones are staggered in time.
√ Fixed chorus aliasing with linear interpolation.
√ Added polyBLEPs on the basic waves, add an extra sample on the end of waves for interpolation based on frequency. Whoops, nevermind, pre-integrating and then differentiating is way more effective at anti-aliasing waves that are higher resolution than the sampling rate.
√ Instrument preset menu. Hides instrument settings by default, but that can be disabled with preferences.
√ Midi instrument presets. Then I could plausibly import midi files! And maybe during export I could figure out which preset matches the instrument most closely and choose the corresponding midi instrument.
√ Renamed pluck to twang.
√ Added midi subharmonic octaves to some presets for better import/export.
√ Spectrum instruments! :D
√ Better compressor/limiter.
√ Better filter volume.
√ Fixed zero length note bug.
√ Fixed mobile-layout pattern number select off-by-one bug.
√ Drumsets! :D
√ Prompts: remembers last choice, enter key confirms choice, added icons to buttons, focuses input on open.
√ Harmonics instruments!
√ Midi import: include partial channels when possible.
√ Grouped presets by type.
√ Pulse width modulation! :D
√ Random instrument generator! :D
√ Cleaned up html/svg generating code slightly.
√ Added descriptions for each of the instrument settings.
√ Added edit option to move all notes sideways.
√ Added edit options to force/quantize notes to scale and rhythm.
√ Freehand rhythm.
√ New songs get random instruments and reset playhead to start.
√ The display name of the editor should be inside Config, so that it's easy to mod without having to dive into the pseudo html.
√ The "new", "import", and "random" options should reset the playhead, selected bar/channel, and track scroll bar.
√ Added fine tempo control.
√ PWA, web app manifest for home screen.
√ Share and Copy URL options added to File Menu.
√ Offsite song player with HTML embed code.
√ Added service worker to cache resources for offline use.
√ Replace 0 pattern with positive pattern number when attempting to draw on it.
√ Default patterns to 0 after first four bars.
√ Song player timeline zoom mode.
√ Rectangular box selection in track editor for copying and pasting patterns.
√ New commands to insert/delete bars.
√ New commands select all and duplicate pattern, changed several existing commands to apply to the current box selection.
√ Panning/stereo
MAJOR REMAINING FEATURES:
- tutorial + music theory primer
- audio worklet thread
- live input when song is paused
- live keyboard performance. (make sure piano can play while song is paused?)
- MIDI live input, live output?
- remember recent songs
- distortion? (how would it affect polyphonic channels?)
- "inspire me" random song generator.
- link shortener
- export mp3/ogg and audio buffer
- translation
TODO:
- Why do prompts sometimes not go away until you move the mouse after importing a song? hmm maybe the problem is the delay between the user action and the navigation action crosses some safety threshold...
- Song settings icons: piano keys for scale, tuning fork for key, metronome for tempo, isometric cube-shaped empty room with tiny door/windows on walls and thicker border emphasizing the floor for reverb, classic eighth or sixteenth note triplet symbol for rhythm. for the reverb cube, use 3 point perspective, use thin lines for the corners, use more foreshortening on the floor than the ceiling to show the camera is near the floor, make the floor solid color, add vaulted arch ceiling? honestly I don't have much fidelity to work with...
- Export prompt wav file export should tell the synth what sample rate to use instead of assuming 44100. const sampleRate: number = 44100; // synth.samplesPerSecond?
- If the page loses and regains focus, re-read preferences and update the interface? In case another tab changed preferences.
- Maybe make several tabs at the bottom for instructions, about, twitter, mastadon, etc, and save which tab was selected when reloading.
- New pref: in paused mode, when editing a note, play it out loud.
- Add some kind of warning if an error is thrown, it may prevent saving progress.
- Make all colors controlled by CSS. Come up with themes.
- Is there space between the instrument volume slider and label for a toggleable speaker/mute icon?
- New file command: export channels as wavs. (Maybe this should just be a checkbox in the export dialog?)
- If I paste a pattern with the wrong number of beats, (or too many beats?) just stretch it?
- The JSON export should include the scale flags, not just the name.
- The piano key display accidental naming convention needs work. "C#" is a fine name for a minor scale but misnames F# as Gb, but the same key in major scale should be "Db" and the names of all the black keys should be flats instead of sharps.
- The purple loop should have arrows at the ends to imply cyclical motion.
- built-in link shortener?
- Feature-detect audio worklets, use toString() to get synth code (and FFT, Deque) for worklet, maybe use pooling for Note, Pattern, Channel, Instrument to deal with frequently regenerating song from string when user edits in main thread.
- Live input tones should still play when song is paused.
- Live input tones should handle slide mode better.
- recording performances via keyboard or even midi... If you record over an existing pattern, do you erase it? Does it depend on whether you actually perform any notes during that pattern?
- Eventually, maybe even stop forcing the user to manually choose pattern counts, and just autopopulate patterns as needed. And also provide mobile-style context buttons above selected bar to facilitate sharing patterns across bars, sort of a paste-shared vs paste-unique, and selecting a range of bars, looping the selection over more bars... Basically making it easier to use on mobile and without needing to remember numbers.
- random song generator!?
- remember recent songs in local shared object.
- add a tutorial + music theory primer. exercise restraint choosing pitches, develop a rhythm first, explore intervals/pitch relationships. It would be cool to have mini beepbox editors with preloaded songs demonstrating concepts, with play, reset, clear, and "open in full editor" options. Mostly it would focus on the pattern editor, but may have one-off additions like a tempo slider to demonstrate tempo.
- Oh shoot, if I hide the title options in the edit/prefs menus, mac chrome puts a checkmark next to the first displayed option instead, which confuses matters because I use checkmarks to indicate toggling prefs options. :(
- Edit options to remove specific channels.
- Edit options for compacting and concatenating songs. I'm increasingly interested in the idea of allowing multiple songs, called sections, to be appended to each other. The song settings would apply to whichever section contains the currently selected pattern. But maybe this is just a hack, and it wouldn't make it any easier to gradually transition volume or tempo or stagger instrument changes. Being able to change reverb might be interesting. A more immediately plausible option is the ability to combine songs. I'm imagining a dialog box where you can paste in song urls and it concatenates the songs. you may need to select the beats per bar from a menu populated by the songs if they're not all the same, and the other songs would just get stretched? Use the validation/simplification to skip duplicate/unused patterns and also duplicate/unused instruments to avoid filling up all the slots quickly. Not sure how to handle different song keys, maybe a checkbox to transpose all songs to the first song's key.
- asynchronous export. worker thread?
- is it possible to get pitch slides and seamless transitions to detect notes across bars?
- a way to pre-generate a javascript sound buffer.
- in firefox, after selecting options, spacebar both reopens options and toggles play. Same problem with arrow keys, and even ctrl+brackets to change tabs. Apparently this is a known firefox bug. https://bugzilla.mozilla.org/show_bug.cgi?id=1019630
- polyphonic fm midi export when there are multiple carriers. careful of overlapping note on/off events combined with slides...
- It's probably okay if "parts" and "arpeggios" don't transition at exact sample boundaries, rather than fractional sample points. Maybe still keep beats aligned to sample boundaries, but you can have more precise BPM tempos by loosening up the alignment.
- maybe command+S should do something useful?
- wav export quality: CD (44100) vs Video (48000) standards, 1x, downsampled from 2x to 1x, downsampled from 4x to 2x. How does this affect FM feedback and noise volume?
- maybe sum adjacent fm synth samples (at half volume) to cancel out inaudible feedback artifacts? for the carrier wave(s), try that integral thing to reduce the aliasing... or is that not really the problem here? (fortunately the integral of a sine wave is just an offset sinewave!) The FM feedback has been bugging me because it has a tendency to alternate between high and low values every other output sample. This is probably (?) inaudible, but is nevertheless an artifact. I could probably mitigate it by adding each FM sample to the previous sample before outputting (and cutting the volume in half to compensate). Does this help with more complicated structures? Note that this won't fix the audible FM aliasing, I'm not sure if there's anything besides super sampling that would fix that.
- The parts of computeTone inside "if (pitches != null)" could actually be in the synth function instead! I guess bits that are shared between instrument types could be in helper functions.
- divert www traffic to beepbox.co. Okay wow this is a lot more complicated than it ought to be... You can only get load balancing on most available web servers by using CNAME records to repeat the request with a different domain whose DNS records are managed by the web server provider, which will choose an appropriate IP address for your location. For naked domains, your dns records can only provide static hardcoded IP addresses, (assuming you don't rapidly manage the ip addresses yourself via the user interface!) which can be cycled to distribute the load but generally isn't smart enough to actually detect server availability. :/
- export mp3 and ogg?
- snap to tone edges from other channels, to help making NES style harmonies.
- translation/localization
- Bring beepbox and openscores coding styles closer together. See html functions, Synth-vs-SongPlayer
- Improve naming/documentation/api so it's clear how replaceState and prospectiveChange would interact if used together. prospectiveChange is only used for keeping track of oldValue while dragging to determine if a recorded change ultimately isNoop() and should be commmitted. replaceState is used when a change is overwriting the previously committed change, like transposing notes. However, prospective change erases information about previously *committed* change, making it unclear if replaceState should be used. Additionally, if multiple inputs are setting prospectiveChange simultaneously, it's unclear what the correct oldValue is and thus whether either change isNoop(). (I considered just committing prospective changes when a competing input is used, but that could result in frequent, useless commits while dragging two inputs simultaneously.)
- document synth api
PLAYLIST EDITOR:
- button to add more songs to list extracted from urls
- update embed player to show all songs
- song rearranging
- song loop count
- song fade-in/out
- example songs on the website. Mario overworld? Tetris is basically public domain...
- when starting at a bar where all tones are at the end of the bar, go ahead and skip the beginning of the bar, up to maybe one beat before the first tone.
- put songs in browser history before/after pasting new songs.
- offsite album/playlist player, with scrolling notes. hashbang urls, bot indexable.
- custom cover art, color schemes in playlists and embed player.
MAYBE:
- Can I use WebRTC to enable real-time collaboration? (How would I handle parallel edits since I got rid of Change history? Maybe record inputs like a video game somehow and use rewinding?)
- Social media cards? Sadly only Twitter seems to support embedded javascript in an iframe, and even at that I'd need a server able to handle song links without hashmarks.
- Make a page with a recording of my voice explaining how sound works, along with some musical samples. Visualize the audio in several different ways, including timespace amplitude, timespace spectrogram, and frequency-synced amplitude to easily follow the shapes of semi-periodic waves. Make a script that checks the progress of the audio track and transitions between the visualizations as appropriate. Make a few non-live slides comparing different sounds and frequencies and showing how the periodic waves are composed out of sums of sine waves.
- Should I add echo and/or flanger as a delay effect? Should Echo have feedback? Can you configure the echo delay length? (If no feedback, you could configure the delay length by changing how far into the future to write the samples.) Also flanger. Maybe just have one LFO controlling flanger, like how there's one LFO for vibrato. But maybe flanger's not worth it, especially when there's already the old chorus setting which is similar.
- when importing json, console.log stuff that doesn't parse correctly?
- Custom scale designer. There are six rows, one for each role (e.g. second, third, seventh... excluding root which is required), with checkboxes to enable each. Next to the checkbox is a menu to choose whether the role is "high second", "low second" or both. The options for the third are "major third :)" and "minor third :(" or both. The fifth has no menu, and the options for the fourth are "fourth", "tritone D:", and both. Maybe instead of checkboxes just have "none" or "off" in the menu. There's a visualization of the scale as pitches, to the right of the menus, sharing the same rows. You can also click the pitches on the scale to toggle them, and the checkboxes and menu update accordingly. There's also a visualization of the available major and minor chords with roman numerals, a column for each available chord highlighting the associate pitches. There's also a circular visualization of the circle of fifths, also with highlighted keys at the roots of chords, color-coded the same as the roman numeral visualization. Ooh, and a button to rotate through the available "modes" of the scale. And a menu at the top to use an existing scale as a template.
- maybe noise waves should be a separate property from chip waves?
- Record the "type" of channels (separately from instruments). Can be pitch or drum. Use instead of getChannelIsDrum. When exporting base64, write the pitch channels first even if they were somehow rearranged, but JSON could theoretically have channels in any order.
- maybe drums can have their own phase modulation mode, with different fractions for frequency? can modulator pitches bend at different rates? maybe the "envelopes" are basically the same except instead of controlling modulation they control pitch?
- can I improve the interaction for volume envelope dragging and pitch dragging? illustrate volume envelope dragging to make it less confusing.
- I could parse the algorithm name, pull out the arrows and parens, rotate them 90 degrees and put them between the numbers. That's... diabolical. Wait that doesn't work for a single example: 1<3 2<4 because the numbers are out of order! >:( (What about feedback arrows?)
- Guitar distortion applying to some channels? new song setting: distortion, nonlinear mixing of channels... can't handle a range of volumes?
- on mobile, should move the new/edit/prefs/export/import etc buttons to the bottom, just above beepbox 2.X, but keep the play/volume controls between the track editor and the song/instrument settings.
- If adding new note and mouse drags at least two beats closer to start than previous max, then enter precise mode where you can have any length. If flipping to backwards or <= doc.parts, reset out of precise mode.
- Get in touch with ludum dare about linking to beepbox: http://www.ludumdare.com/compo/tools/
- get in touch with http://youcanmakevideogames.com/resources/music
- multitouch?
- replace piano/drums canvas with svg
- on firefox and linux chrome, select drop downs use same background color as select element, it's a bit too bright when focused.
- export fade in/out checkboxes
- circle of fifths display
- Dim the column occupied by a tone to communicate mono voice?
- visual feedback when a note is played
- when hovering at the same pitch as a tone in an adjacent part, and you're really close to it, and you drag horizontally, go ahead and drag that adjacent tone instead of creating a new one.
- phoneme filter option, imitate vowels and voiced consonants with IIR filters, fall back on noise channel for S, T, CH, SH, etc.
- preload some common tone shapes into the recentShape list. increment format number.
- Make a bunch of asserts, that the tones don't overlap, that the pins have the same duration as the tones, that the pins are in order, etc. And trace out the arguments to every change constructor and maybe even trace out the entire bar document data after every step.