Simplesequencer / Game of Life (Ofelia / Emscripten)
https://puredatagui.handmadeproductions.de/ doesn't work…
unreachable code after return statement
EmscriptenExample.js:8288:4
unreachable code after return statement
EmscriptenExample.js:8412:4
undefined puredatagui.handmadeproductions.de:41:33
printErr https://puredatagui.handmadeproductions.de/:41
abort https://puredatagui.handmadeproductions.de/EmscriptenExample.js:858
_abort https://puredatagui.handmadeproductions.de/EmscriptenExample.js:5283
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:124923
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:6889037
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:6889238
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:858086
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:766433
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:1044857
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:1488944
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:795390
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:193441
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:2719626
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:3663705
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:2876770
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:4943251
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:4467908
_main https://puredatagui.handmadeproductions.de/EmscriptenExample.js:9696
callMain https://puredatagui.handmadeproductions.de/EmscriptenExample.js:10600
doRun https://puredatagui.handmadeproductions.de/EmscriptenExample.js:10640
run https://puredatagui.handmadeproductions.de/EmscriptenExample.js:10649
exception thrown: RuntimeError: abort(undefined). Build with -s ASSERTIONS=1 for more info.,abort@https://puredatagui.handmadeproductions.de/EmscriptenExample.js:862:13
_abort@https://puredatagui.handmadeproductions.de/EmscriptenExample.js:5283:5
@https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[497]:0x1e7fb
@https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[12138]:0x691e4d
@https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[12139]:0x691f16
@https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[2153]:0xd17e6
@https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[1931]:0xbb1e1
@https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[2449]:0xff179
@https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[3427]:0x16b830
@https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[1989]:0xc22fe
@https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[655]:0x2f3a1
@https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[6070]:0x297f8a
@https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[9295]:0x37e759
@https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[6933]:0x2be562
@https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[10347]:0x4b6d93
@https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[9921]:0x442cc4
Module._main@https://puredatagui.handmadeproductions.de/EmscriptenExample.js:9696:60
callMain@https://puredatagui.handmadeproductions.de/EmscriptenExample.js:10600:32
doRun@https://puredatagui.handmadeproductions.de/EmscriptenExample.js:10640:21
run/<@https://puredatagui.handmadeproductions.de/EmscriptenExample.js:10649:13
puredatagui.handmadeproductions.de:41:33
printErr https://puredatagui.handmadeproductions.de/:41
callMain https://puredatagui.handmadeproductions.de/EmscriptenExample.js:10613
doRun https://puredatagui.handmadeproductions.de/EmscriptenExample.js:10640
run https://puredatagui.handmadeproductions.de/EmscriptenExample.js:10649
Uncaught RuntimeError: abort(undefined). Build with -s ASSERTIONS=1 for more info.
abort https://puredatagui.handmadeproductions.de/EmscriptenExample.js:862
_abort https://puredatagui.handmadeproductions.de/EmscriptenExample.js:5283
_main https://puredatagui.handmadeproductions.de/EmscriptenExample.js:9696
callMain https://puredatagui.handmadeproductions.de/EmscriptenExample.js:10600
doRun https://puredatagui.handmadeproductions.de/EmscriptenExample.js:10640
run https://puredatagui.handmadeproductions.de/EmscriptenExample.js:10649
EmscriptenExample.js:862:13
abort https://puredatagui.handmadeproductions.de/EmscriptenExample.js:862
_abort https://puredatagui.handmadeproductions.de/EmscriptenExample.js:5283
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:124923
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:6889037
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:6889238
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:858086
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:766433
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:1044857
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:1488944
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:795390
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:193441
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:2719626
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:3663705
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:2876770
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:4943251
<anonyme> https://puredatagui.handmadeproductions.de/EmscriptenExample.wasm:4467908
_main https://puredatagui.handmadeproductions.de/EmscriptenExample.js:9696
callMain https://puredatagui.handmadeproductions.de/EmscriptenExample.js:10600
doRun https://puredatagui.handmadeproductions.de/EmscriptenExample.js:10640
run https://puredatagui.handmadeproductions.de/EmscriptenExample.js:10649
Simplesequencer / Game of Life (Ofelia / Emscripten)
Hi,
with Firefox 88.0.1, Ubuntu 21.04 it loads and then Exception thrown, see JavaScript console:
unreachable code after return statement
EmscriptenExample.js:8289:4
unreachable code after return statement
EmscriptenExample.js:8413:4
undefined gameoflife.handmadeproductions.de:41:33
printErr https://gameoflife.handmadeproductions.de/:41
abort https://gameoflife.handmadeproductions.de/EmscriptenExample.js:859
_abort https://gameoflife.handmadeproductions.de/EmscriptenExample.js:5284
<anonyme> https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:124923
<anonyme> https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:6889037
<anonyme> https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:6889238
<anonyme> https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:858086
<anonyme> https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:766433
<anonyme> https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:1044857
<anonyme> https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:1488944
<anonyme> https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:795390
<anonyme> https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:193441
<anonyme> https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:2719626
<anonyme> https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:3663705
<anonyme> https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:2876770
<anonyme> https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:4943251
<anonyme> https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:4467908
_main https://gameoflife.handmadeproductions.de/EmscriptenExample.js:9697
callMain https://gameoflife.handmadeproductions.de/EmscriptenExample.js:10601
doRun https://gameoflife.handmadeproductions.de/EmscriptenExample.js:10641
run https://gameoflife.handmadeproductions.de/EmscriptenExample.js:10650
(Asynchrone : setTimeout handler)
run https://gameoflife.handmadeproductions.de/EmscriptenExample.js:10646
runCaller https://gameoflife.handmadeproductions.de/EmscriptenExample.js:10591
removeRunDependency https://gameoflife.handmadeproductions.de/EmscriptenExample.js:848
receiveInstance https://gameoflife.handmadeproductions.de/EmscriptenExample.js:920
receiveInstantiatedSource https://gameoflife.handmadeproductions.de/EmscriptenExample.js:924
(Asynchrone : promise callback)
instantiateAsync https://gameoflife.handmadeproductions.de/EmscriptenExample.js:940
(Asynchrone : promise callback)
instantiateAsync https://gameoflife.handmadeproductions.de/EmscriptenExample.js:938
createWasm https://gameoflife.handmadeproductions.de/EmscriptenExample.js:959
<anonyme> https://gameoflife.handmadeproductions.de/EmscriptenExample.js:9687
exception thrown: RuntimeError: abort(undefined). Build with -s ASSERTIONS=1 for more info.,abort@https://gameoflife.handmadeproductions.de/EmscriptenExample.js:863:13
_abort@https://gameoflife.handmadeproductions.de/EmscriptenExample.js:5284:5
@https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[497]:0x1e7fb
@https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[12138]:0x691e4d
@https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[12139]:0x691f16
@https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[2153]:0xd17e6
@https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[1931]:0xbb1e1
@https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[2449]:0xff179
@https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[3427]:0x16b830
@https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[1989]:0xc22fe
@https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[655]:0x2f3a1
@https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[6070]:0x297f8a
@https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[9295]:0x37e759
@https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[6933]:0x2be562
@https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[10347]:0x4b6d93
@https://gameoflife.handmadeproductions.de/EmscriptenExample.wasm:wasm-function[9921]:0x442cc4
Module._main@https://gameoflife.handmadeproductions.de/EmscriptenExample.js:9697:60
callMain@https://gameoflife.handmadeproductions.de/EmscriptenExample.js:10601:32
doRun@https://gameoflife.handmadeproductions.de/EmscriptenExample.js:10641:21
run/<@https://gameoflife.handmadeproductions.de/EmscriptenExample.js:10650:13
setTimeout handler*run@https://gameoflife.handmadeproductions.de/EmscriptenExample.js:10646:19
runCaller@https://gameoflife.handmadeproductions.de/EmscriptenExample.js:10591:9
removeRunDependency@https://gameoflife.handmadeproductions.de/EmscriptenExample.js:848:13
receiveInstance@https://gameoflife.handmadeproductions.de/EmscriptenExample.js:920:28
receiveInstantiatedSource@https://gameoflife.handmadeproductions.de/EmscriptenExample.js:924:24
promise callback*instantiateAsync/<@https://gameoflife.handmadeproductions.de/EmscriptenExample.js:940:31
promise callback*instantiateAsync@https://gameoflife.handmadeproductions.de/EmscriptenExample.js:938:16
createWasm@https://gameoflife.handmadeproductions.de/EmscriptenExample.js:959:5
@https://gameoflife.handmadeproductions.de/EmscriptenExample.js:9687:11
gameoflife.handmadeproductions.de:41:33
printErr https://gameoflife.handmadeproductions.de/:41
callMain https://gameoflife.handmadeproductions.de/EmscriptenExample.js:10614
doRun https://gameoflife.handmadeproductions.de/EmscriptenExample.js:10641
run https://gameoflife.handmadeproductions.de/EmscriptenExample.js:10650
(Asynchrone : setTimeout handler)
run https://gameoflife.handmadeproductions.de/EmscriptenExample.js:10646
runCaller https://gameoflife.handmadeproductions.de/EmscriptenExample.js:10591
removeRunDependency https://gameoflife.handmadeproductions.de/EmscriptenExample.js:848
receiveInstance https://gameoflife.handmadeproductions.de/EmscriptenExample.js:920
receiveInstantiatedSource https://gameoflife.handmadeproductions.de/EmscriptenExample.js:924
(Asynchrone : promise callback)
instantiateAsync https://gameoflife.handmadeproductions.de/EmscriptenExample.js:940
(Asynchrone : promise callback)
instantiateAsync https://gameoflife.handmadeproductions.de/EmscriptenExample.js:938
createWasm https://gameoflife.handmadeproductions.de/EmscriptenExample.js:959
<anonyme> https://gameoflife.handmadeproductions.de/EmscriptenExample.js:9687
Uncaught RuntimeError: abort(undefined). Build with -s ASSERTIONS=1 for more info.
abort https://gameoflife.handmadeproductions.de/EmscriptenExample.js:863
_abort https://gameoflife.handmadeproductions.de/EmscriptenExample.js:5284
_main https://gameoflife.handmadeproductions.de/EmscriptenExample.js:9697
callMain https://gameoflife.handmadeproductions.de/EmscriptenExample.js:10601
doRun https://gameoflife.handmadeproductions.de/EmscriptenExample.js:10641
run https://gameoflife.handmadeproductions.de/EmscriptenExample.js:10650
setTimeout handler*run https://gameoflife.handmadeproductions.de/EmscriptenExample.js:10646
runCaller https://gameoflife.handmadeproductions.de/EmscriptenExample.js:10591
removeRunDependency https://gameoflife.handmadeproductions.de/EmscriptenExample.js:848
receiveInstance https://gameoflife.handmadeproductions.de/EmscriptenExample.js:920
receiveInstantiatedSource https://gameoflife.handmadeproductions.de/EmscriptenExample.js:924
promise callback*instantiateAsync/< https://gameoflife.handmadeproductions.de/EmscriptenExample.js:940
promise callback*instantiateAsync https://gameoflife.handmadeproductions.de/EmscriptenExample.js:938
createWasm https://gameoflife.handmadeproductions.de/EmscriptenExample.js:959
<anonymous> https://gameoflife.handmadeproductions.de/EmscriptenExample.js:9687
EmscriptenExample.js:863:13
Just Another (Drum) Sequencer...SortOf, codename: Virgo
Just Another (Drum) Sequencer...SortOf, codename: Virgo
REQUIRES: zexy, moonlib, tof (as of Pd 0.50.2, all of which are in deken) and hcs (which comes by default with Pd 0.50.2 and is in deken (for extended))
Special Features
- Unique playhead per row; each with their own metro (beat)
- Up to 8 Volume states-per-beat (by clicking multiple times on the bang; where an rms=1 is divide among the states (2 states:0=rms=0(black), 1=rms=1(red); 3 states:rms=[0|0.5|1])
- Design approach: using creation arguments to alias abstractions, so subsequently they are referred to by their creation arguments, ex. in [KITS sample] sample is referred to as [$1]; which is how they are listed below)
(notes: what I learned experimenting with this design approach, I will share as a separate post. Currently, it does not include cut-copy-paste (of regions of the pattern)). I good way to start trying it out is clicking the "R" to get a random kit and a random pattern).
virgo:[virgo/PROJECT KITS PATTERNS]
- PROJECT[KITS PATTERNS]
- $1:[KITS sample]
- GUI
- K: openpanel to load a previously saved *.txt (text object) kit of samples; on loadbang the default.txt kit is loaded
- S: save the current set of samples to the most recently opened *.txt (kit) preset
- SA: saveas a *.txt of the current set of samples
- D: foldererpanel a sample directory to load the first (alphabetically) 16 samples into the 16 slots
- RD: load a random kit from the [text samples] object where the samples where previously loaded via the "SAMPLES" bang on the right
- U: undo; return to the previously opened or saved *.txt kit, so not the previously randomized
- MASTER: master gain
- (recorder~: of the total audio~ out)
- record
- ||: pause; either recording or play;
- play: output is combined with the sequencer output just before MASTER out to [dac~]
- SAMPLES: folderpanel to load a (recursive) directory of samples for generating random kits
- ABSTRACTIONS
- $1: sample
- bang: openpanel to locate and load a sample for a track
- canvas: filename of the opened sample; filenames are indexed in alignment with track indices in the PATTERNS section
- $1: sample
- GUI
- $2:[PATTERNS row]
- GUI
- P: openpanel to load a previously saved *.txt (pattern) preset file; on loadbang the default.txt pattern is loaded; the preset file includes the beat, pattern, and effect settings for the row
- S: save the current pattern to the most recently opened pattern .txt
- SA: save as (self-explanatory)
- states: the number of possible states [2..8] of each beat;
- %: weight; chance of a beat being randomized; not chance of what it will result in; ex. 100% implies all beats are randomized ; random beats result in a value)gain) between 1 and states-1
- PLAY(reset): play the pattern from "start" or on stop reset all playheads to start
- start: which beat to start the playheads on
- length: how many beats to play [+/-32]; if negative the playheads will play in reverse/from right to left
- bpm: beats-per-minute
- rate: to change the rate of play (ie metro times) by the listed factor for all playheads
- R: randomize the total pattern (incl period and beats, but not the effect settings; beats of 1/32 are not included in the possibilities)
- CL: clear, set all beats to "0", i.e. off
- U: undo random; return to the previously opened or saved preset, ie. not the previous random one
- M: mute all tracks; the playheads continue moving but audio does not come out of any track
- ||:pause all playheads; play will resume from that location when un-paused
- per: period; if 0=randomizes the period, >0 sets the period to be used for all beats
- Edit Mode
- Check the [E] to enter edit mode (to cut, copy, or paste selected regions of the pattern)
- Entering edit mode will pause the playing of the pattern
- Play, if doing so beforehand, will resume on leavng edit mode
- The top-left most beat of the pattern grid will be selected when first entering edit mode
- Single-click a beat to select the top-left corner of the region you wish to cut or copy
- Double-click a beat to select the bottom-right corner
- You may not double-click a beat "less than" the single-clicked (top-left) beat and vice-versa
- Click [CL] to clear your selection (i.e. start over)
- The selected region will turn to dark colors
- If only one beat is selected it will be the only one darkened
- Click the operation (bang) you wish to perform, either cut [CU] or copy [CP]
- Then, hold down the CTRL key and click the top-left corner of where you want to paste the region
- The clicked cell will turn white
- And click [P] to paste the region
- Cut and copied regions may both be pasted multiple times
- The difference being, cutting sets the values (gains) for the originating region to "0"
- Click [UN] to undo either the cut, copy, or paste operation
- Undoing cut will return the gains from 0s to their original value
- Check the [E] to enter edit mode (to cut, copy, or paste selected regions of the pattern)
- (effect settings applied to all tracks)
- co: vcf-cutoff
- Q: vcf-q
- del: delay-time
- fb: delay-feedback
- dist: distortion
- reverb
- gn: gain
- ABSTRACTIONS
- $1: [row (idx) b8] (()=a property not an abstraction)
- GUI
- (index): aligns with the track number in the KITS section
- R: randomize the row; same as above, but for the row
- C: clear the row, i.e. set all beats to 0
- U: undo the randomize; return to the originally opened one, ie. not the previous random one
- M: mute the row, so no audio plays, but the playhead continues to play
- S: solo the row
- (beat): unit of the beat(period); implying metro length (as calculated with the various other parameters);1/32,1/16,1/8, etc.
- (pattern): the pattern for the row; single-click on a beat from 0 to 8 times to increment the gain of that beat as a fraction of 1 rms, where resulting rms=value/states; black is rms=0; if all beats for a row =0 (are black) then the switch for that track is turned off; double-click it to decrement it
- (effects-per-row): same as above, but per-row, ex. first column is vcf-cutoff, second is vcf-q, etc.
- ABSTRACTIONS
- $1: b8 (properties:row column)
- 8-state bang: black, red, orange, yellow, green, light-blue, blue, purple; representing a fraction of rms(gain) for the beat
- $1: b8 (properties:row column)
- GUI
- $1: [row (idx) b8] (()=a property not an abstraction)
- GUI
- $1:[KITS sample]
Credits: The included drum samples are from: https://www.musicradar.com/news/sampleradar-494-free-essential-drum-kit-samples
p.s. Though I began working on cut-copy-paste, it began to pose a Huge challenge, so backed off, in order to query the community as to 1) its utility in the current state (w/o that) and 2) just how important including it really is.
p.p.s. Please, report any inconsistencies (between the instructions as listed and what it does) and/or bugs you may find, and I will try to get an update posted as soon as enough of those have collect.
Love and Peace through sharing,
Scott
Batch - Processing audio faster than realtime
@whale-av So I should reread the entire manual on each release? I suppose I could run diff on the old and new manual on each release, but then I also need to copy the old manual to a safe location so it does not get overwritten on the new install. I really wish they would start a new changelog.
Edit; no need to diff the manual, can just check the doc folder on github and see if any have been updated. That is not so bad and I can live with it. And x5 is the release notes, I guess I forgot that.
I don't think this would work as a busy wait, I triggered a [metro 100] incrementing a counter into a print to the start bang in your help file, it printed out 0 to 200 immediately and then waited until the fast-forward was finished and resumed counting at 200 ever 100ms. But I also do not understand the busy wait.
Edit: if the metro is started by the bang that sends [fast-forward 0( instead of the one that starts the process, it does seem to busy wait as I understand it, the counter does 0 and then nothing until it is finished and resumes at 1 counting at 100ms intervals. All I did in the previous test was fast forward the counter
CPU usage of idle patches, tabread4~?
Hi zigmhount!
This is a copy paste of a message I (hopefully) sent via chat as well:
I figured I’d tell you a bit more about my patch so we can see if there’s overlap. Switch is definitely an overlap. I’m not using a metronome at all on mine. The inspiration was two loopers I love: the line 6 DL4 and the EHX 45000. It’s going to be 4 foot switches. Record, play, previous and next. Record and play function the way they do in the DL4. Record to start a new loop, record again to set length and start overdubbing or play to simply set length and start looping. From there record works like overdub on/ off toggle and play stop or restarts the loop. Previous and next are where it gets interesting.
There’s a 7 segment display (meaning a 1 digit number read out) that tells you what loop you’re “focused” on. It starts on 0. You can’t change focus until you have a loop going. Once you do, prev or next change focus. If you change focus while recording, it closes the loop you’re on and starts playing it, then immediately starts recording the next loop. The next loop though can be as long as you want. However, silence gets added to the end of the loop when you are done so that it matches up with a multiple of “loop 0”
In other words, loop 0, acts as a measure length and all other loops are set to a multiple of that measure length.
But...they can start anywhere you want. To the person playing the looper, it will feel like individual loops are all overdubs of the first loop, just at any length you want. I don’t know if I’m explaining this so well, but the point is, you don’t have to worry about timing or a metronome with this. You don’t have to wait for the beginning of measures to start or end loops. Once you have the timing of the first loop down there’s no waiting... you start recording and playing whenever you want as long as you want t and if it’s in time when you play it it will be i the recording.
So far I have recording and overdubbing down on loop 0 WITHOUT CLICKS. this took a lot of work and messing. Sounds like you are struggling with that now. Hardware is important yes.
I’m running it on a rasberry pi 4b 4 gig memory but with a pi sound audio interface. It’s more expensive than the pi but the latency and sound quality are GREAT. I also wanted to make the hardware all independent eventually and have the whole thing fit i it’s own box. The foot pedals run on an arduino that talks through comport to the pi and pure data.
In pure data I’m timing the loops and recording them via tabwrite. I’m then playing them with tabplay with a 0 $1 message box where 0 is start and $1 is the length, rounded to block size, of the recording. I record and play the same arrays for each loop at the same time while overdubbing, but delay the recording so it’s a few blocks back from the tabplay. The delay on the recording seemed to help elimate clocks as well. So did using tabplay instead of tabread 4. I think the phasor is CPU expensive or something. I don’t know. When I start / stop recording I use a line ramp on the volume going into the recording of 5 msecs. This is also necessary to eliminate clicks. Also, I had to stop resizing or clearing arrays as both cause clicks. Now I just overwrite what I need and don’t read from what I didn’t overwrite (If that makes sense).
If you are getting clicking I would try upping block size, buffer size and just delaying the actual recording (delay the audio in the same amount) giving the computer time to think avoids drop outs. Also you don’t want monitoring if you can avoid it. I don’t know if you are using a mic or what.
Hopefully some of this made sense.
Struggling hard
@Toostupefiant Definitely learn to use arrays, in particular, [tabwrite] and [tabread}. Make 2 arrays, one to save the segment start indexes and one to hold their lengths. Next, decide what the minimum and maximum length of each segment should be, in number of samples. With these numbers at hand, you can use [random] to generate a random segment length. When you load the sound file, save its length to use for comparison later.
Now, to construct a random partitioning of your sound file, start at start index 0 (i.e. the beginning of your sound file) and generate a random length. That defines your first segment, segment #0, but it also tells you what the next start index is, for segment #1. Save each start and length generated this way in your two arrays. Repeat until you've reached or gone past the end of the sound file. Keep track of the number of segments you generate because you'll need that for when you play them back at random. Pick a number less than or equal to the number of segments, look up its start in the start array and its length in the length array. Pass them to whatever you use for playback.
If you can manage that, then you'll probably want to protect against uselessly short last segments. That's a matter of looking at how much is left after each step of segment definition, and making some adjustment if it's less than your max + min segment length. I'm being vague about the adjustment because it just depends what compromise you want, e.g. you could just decide to ignore the last segment.
enzien heavy java script example
i tried to run the examples: https://github.com/enzienaudio/examples/tree/master/javascript
http://libpd.handmadeproductions.de/
http://libpd2.handmadeproductions.de/
the chip example works fine, but the sampleplayer gives me this error message when i start to play the sample:
warning: a problem occurred in builtin C++ name demangling; build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling
42samplePlayerLib.min.js:24639 Uncaught abort() at Error
at jsStackTrace (http://libpd2.handmadeproductions.de/js/samplePlayerLib.min.js:1351:13)
at stackTrace (http://libpd2.handmadeproductions.de/js/samplePlayerLib.min.js:1368:22)
at Object.abort (http://libpd2.handmadeproductions.de/js/samplePlayerLib.min.js:24633:44)
at _abort (http://libpd2.handmadeproductions.de/js/samplePlayerLib.min.js:1923:22)
at _malloc (http://libpd2.handmadeproductions.de/js/samplePlayerLib.min.js:19069:9)
at __ZL26mq_getOrCreateNodeFromPoolP14HvMessageQueue [mq_getOrCreateNodeFromPool(HvMessageQueue?*)] (http://libpd2.handmadeproductions.de/js/samplePlayerLib.min.js:13201:10)
at _mq_addMessageByTimestamp (http://libpd2.handmadeproductions.de/js/samplePlayerLib.min.js:12830:8)
at Array.__ZN18Heavy_samplePlayer26scheduleMessageForReceiverEjP9HvMessage [Heavy_samplePlayer::scheduleMessageForReceiver(unsigned int, HvMessage?*)] (http://libpd2.handmadeproductions.de/js/samplePlayerLib.min.js:6949:4)
at Array.__ZN18Heavy_samplePlayer7processEPPfS1_i [Heavy_samplePlayer::process?S(float**)] (http://libpd2.handmadeproductions.de/js/samplePlayerLib.min.js:7425:33)
at Array.__ZN18Heavy_samplePlayer13processInlineEPfS0_i [Heavy_samplePlayer::processInline?S(float*)] (http://libpd2.handmadeproductions.de/js/samplePlayerLib.min.js:7877:41)
Was it possible for anybody to run the second example or knows how to fix the error?
[pix_share_read] and [pix_share_write] under windows
@whale-av, here is a log running pd with -lib Gem -verbose.
tried both 32bit and 64bit pd 0.48-1...
tried ./Gem.m_i386 and failed
tried ./Gem.dll and failed
tried ./Gem/Gem.m_i386 and failed
tried ./Gem/Gem.dll and failed
tried ./Gem.pd and failed
tried ./Gem.pat and failed
tried ./Gem/Gem.pd and failed
tried C:/Users/Raphael Isdant/Documents/Pd/externals/Gem.m_i386 and failed
tried C:/Users/Raphael Isdant/Documents/Pd/externals/Gem.dll and failed
tried C:/Users/Raphael Isdant/Documents/Pd/externals/Gem/Gem.m_i386 and failed
tried C:/Users/Raphael Isdant/Documents/Pd/externals/Gem/Gem.dll and failed
tried C:/Users/Raphael Isdant/Documents/Pd/externals/Gem.pd and failed
tried C:/Users/Raphael Isdant/Documents/Pd/externals/Gem.pat and failed
tried C:/Users/Raphael Isdant/Documents/Pd/externals/Gem/Gem.pd and failed
tried C:/Users/Raphael Isdant/AppData/Roaming/Pd/Gem.m_i386 and failed
tried C:/Users/Raphael Isdant/AppData/Roaming/Pd/Gem.dll and failed
tried C:/Users/Raphael Isdant/AppData/Roaming/Pd/Gem/Gem.m_i386 and failed
tried C:/Users/Raphael Isdant/AppData/Roaming/Pd/Gem/Gem.dll and failed
tried C:/Users/Raphael Isdant/AppData/Roaming/Pd/Gem.pd and failed
tried C:/Users/Raphael Isdant/AppData/Roaming/Pd/Gem.pat and failed
tried C:/Users/Raphael Isdant/AppData/Roaming/Pd/Gem/Gem.pd and failed
tried C:/Program Files/Common Files/Pd/Gem.m_i386 and failed
tried C:/Program Files/Common Files/Pd/Gem.dll and failed
tried C:/Program Files/Common Files/Pd/Gem/Gem.m_i386 and failed
tried C:/Program Files/Common Files/Pd/Gem/Gem.dll and failed
tried C:/Program Files/Common Files/Pd/Gem.pd and failed
tried C:/Program Files/Common Files/Pd/Gem.pat and failed
tried C:/Program Files/Common Files/Pd/Gem/Gem.pd and failed
tried D:/pd-0.48-1.windows.64bit/extra/Gem.m_i386 and failed
tried D:/pd-0.48-1.windows.64bit/extra/Gem.dll and failed
tried D:/pd-0.48-1.windows.64bit/extra/Gem/Gem.m_i386 and failed
tried D:/pd-0.48-1.windows.64bit/extra/Gem/Gem.dll and succeeded
D:\\pd-0.48-1.windows.64bit\\extra\\Gem\\Gem.dll: couldn't load
tried D:/pd-0.48-1.windows.64bit/extra/Gem.pd and failed
tried D:/pd-0.48-1.windows.64bit/extra/Gem.pat and failed
tried D:/pd-0.48-1.windows.64bit/extra/Gem/Gem.pd and failed
tried D:/pd-0.48-1.windows.64bit/doc/5.reference/Gem.m_i386 and failed
tried D:/pd-0.48-1.windows.64bit/doc/5.reference/Gem.dll and failed
tried D:/pd-0.48-1.windows.64bit/doc/5.reference/Gem/Gem.m_i386 and failed
tried D:/pd-0.48-1.windows.64bit/doc/5.reference/Gem/Gem.dll and failed
tried D:/pd-0.48-1.windows.64bit/doc/5.reference/Gem.pd and failed
tried D:/pd-0.48-1.windows.64bit/doc/5.reference/Gem.pat and failed
tried D:/pd-0.48-1.windows.64bit/doc/5.reference/Gem/Gem.pd and failed
Gem: can't load library```
MAKE RIGHT SAMPLE LOCATOR WORK REGARDLESS OF SAMPLE RATE
@willgerwat Sorry to be so slow..... it was dinner time....
No, it's not the samplerate. It's the sample size that changes with each recording. [soundfiler] outputs the total number of samples.
So as the faders are all 0-1..... and the array has been resized to equal the samplesize......
Start point = left limit fader value x samplesize
End point = right limit fader value x samplesize
Samplerate will always be 44100 if Pd is set to that.
The phasor ramps from 0 to 1...... and is set to do so in the time that is required to play the range of samples.
So it's frequency is samplerate / (end point - start point) (e.g. ramp every 2sec for 88200 samples between the points....... 0.5Hz) if you want it to play at the correct speed.
Vary that frequency if you want to change the playback speed.
When it is at zero, you want it to output the starting sample number......
..... and when it is at 1 you want the endpoint sample number.
So the output of [phasor~] is multiplied by the "playback length" and then the Start point is added.
So (phasor output x (end point - start point) ) + start point........ is sent to tabread~
I hope that is easy to understand (and correct....... )
This might work........ bspoke.pd ..... or at least get you part way.......
I have not dived into your glitch patch yet to understand what it does..... how it works........... but that math should apply regardless.
David.
Purr Data 2.5.0
Some report after testing Purr Data compiled for Win64.
-
I have a strange bug related to MIDI device. I'll have to check if it exists in PD vanilla 32 bit. I have the same bug in PD vanilla for 64bit compiled by Lucas. I don't think it is a multiclient midi driver issue. But i'll check it better. BTW if i choose a MIDI device and apply so it goes saved for the next start of Purr Data..well Purr Data doesn't start anymore and i have to clean the prefs via regedit because it seems that a command line pd.exe -nomidi does not work for Purr Data as it does with Vanilla
-
zexy library does not work even if the .dll externals files are compiled. I have to check the build log because i remember there were some red warnings about specific zexy externals. So every zexy help file i tried shows red outlined externals because the zexy stuff can't be instantiated.
-
there are minor naming errors in some help files that i guess are in the official Purr Data 32bit release (i.e. linearpan~ in pan lib should be linear_pan~
-
timestretch~ just crash Purr Data and the program quits.
-
moocow folder is empty
-
pixelTango does not work but i guess it has something to do with Gem externals dependencies
-
SMLib help file is not present
-
pmpd loads but does not seem to work
-
Gem and fluidsynth~ don't compile for win64 target (so as you know i removed those from the building process)