Envion v3.9 — Algorithmic Envelope Sequencer for Pure Data
Hi everyone,
I’d like to share with you Envion v3.9, an envelope-first ecosystem for experimental sound and musique concrète, fully developed in Pure Data.
Website & Documentation: https://www.peamarte.it/env/envion_v3.6.html

Why Envion?
What makes Envion interesting is not only the tool itself, but also the extensive documentation that comes with it. Inside you’ll find:
- A detailed explanation of the envelope system at the core of Envion
- How the terne (triplets) structure works — duration, amplitude, offset — to build complex articulations
- Example patches and ready-to-use presets, so you can immediately start experimenting
Key Idea
Envion is designed to make a single sample behave like thousands of sonic variations:
Each trigger reshapes its time-stretch and temporal envelope,
creating living, ever-changing gestures.
Open Source
Everything is open source — forks and pull requests are more than welcome!
I hope you’ll find it useful and inspiring. Feedback, questions, and collaborations are very welcome.
Best,
Emiliano
DAW alignment
Dear Forum,
EDITED
I tried a bit on [playhead] in plugdata in a plugin and ableton link [abl-link~] in standalone mode.
The difference is that both objects work either in the DAW or only outside the DAW. What is a good approach to start out time aligning pd to every spot of the DAW (or vice versa), IF possible at all?
In some videos I sometimes see a 64 element [hradio] representing 16th of a section, I guess, that are switched once finished. Besides I am thinking about a continuous counter marking bar numbers to trigger any patch kind of [% 4] a 4/4 time signature. But I am not too experienced here and understanding larger sequencer setups.
What is good?
Thank you very much!!
Audiolab is now available on deken!
Version 0.70 is now available on deken.
I added some simple but convenient objects:
pp.amp~ a simple signal multiplier
pp.adsr~ adsr/adr envelope generator
pp.xfade~ signal crossfader
pp.shiftlfo~ a LFO that can generate irregular rhythmic patterns
pp.dynamics~ now has an option to enable feedback compression
Some parameter sliders are now colored light orange in the GUI. This indicates that the slider does not cover the full range of the parameter and is intended to encourage experimenting with values that are above or below the range of the slider.
fixed some minor bugs.
Happy patching!
Automating vline~ envelope from a waveform (envelope as wavetable
Hi everyone,
I'm working on a system to automatically generate a vline~ message list starting from a custom envelope shape stored in an array, originally extracted from a .wav file.
I want to build a dynamic vline~ list like this: 0, 1 93.753, 1 0 187.506
But instead of typing values manually, I'd like to generate it automatically based on the shape of an envelope loaded from a waveform (array).
I already convert the array index to milliseconds using: [expr ($f1 / 44100) * 1000]
And I can manually draw or extract the envelope into an array — but I’m struggling to automate the construction of the vline~ list so it correctly represents:
- attacks
- holds
- releases
- plateaus (ecc)
at the moment i Load a .wav file containing an envelope shape, Store it into an array. Detect meaningful breakpoints (e.g. slope changes, thresholds) and Use those to automatically create a proper vline~ sequence.
here the patch and one env wav file
impose-envelope-wavetable-analog.pd
strike-1_6.wav
Is there a way to extract breakpoints or slope changes from an array to build a proper vline~ message?
Has anyone implemented something similar (using an envelope from a .wav as a wavetable)?
Would “wavetable envelope” be a good term for this? Is there a better one in Pd terminology?
Thanks in advance if anyone has ideas or guidance.
Even partial thoughts or pointers would help a lot!
I almost forgot: At the moment, I’m using GPT to convert the vline~ list into the format 0, 1 93.753, 1 0 187.506 (just an example), starting from a total duration in milliseconds — in this case, 2176 ms. This naturally results in very complex lists, like something along these lines:
0, 1 100, 0.6 400 100, 0.3 2000 500, 0.15 3000 2500, 0 10491 5500
I’d really like to find a way to resolve this and automate the process, but since I’m still a beginner, I wonder if I’m just making things unnecessarily complicated?
Emiliano
Audiolab is now available on deken!
Sorry for not posting for some ... 2 years. Just a reminder that this project is still alive and slowly but surely evolving.
I pushed an update to deken today, v0.61. New stuff since version 0.4 include:
pp.fft-profile~ - esoteric spectral denoiser/vocoder
pp.loop.rec~ pp.loop.play~ - a pair of abstractions to record and play loops, but also useful for pitch shifting/reverse delays
pp.grainrev~ - a granular reverb, very cool
pp.phiverb~ - a good sounding reverb
many bugfixes and some new examples.
Make sure to use the latest version of pd (pd-0.55 at the time of posting).
In plugdata most objects should work but needs more testing.
@jewelzcotard sorry for the late reply, anyway if you moved the speakers in the gui, you can save with msg [save 1( to the rightmost inlet of pp.spat8~ and save the patch. A msg [recall 1( to the same inlet will load your settings.
Happy patching and make some noise!
Limiting amplitude on an LFO
most people make the error and use signalrate objects for their datarate LFOs - you seem to do it the other way round.
i would forget metro and use phasor~ as accumulator, and then all you need is a bit of arithmetics plus you can sum (mix) or multiply (AM, RM) layers of LFOs to get all kind of simple and complex waveforms.
for example cosine: _ *0.75 _ %1. _ cos
saw: _ *2. _ -1.
saw down: _ *-2. _ +1,
square: _ >=0.5 _ *2. _ -1.
tri is a bit more work, in pd i would use expr~
then sum : (a+b)/2
am : a(b)
rm : a((2b)-1)
plot-graph - a way to display waveforms
Here I've uploaded plot graph as an abstraction plus two other abstractions to assist in its usage make-plot and cursor-drive
plot-graph creation: plot-graph unique-name size-x size-y;
Address the settings with messages to in-unique-name (eg [s in-$0-channel-L] or connect a control-rate wire to top left corner;
make-plot creation: make-plot array-name plot-resolution;
eg [make-plot $0-left-channel 200]
make-plot is used to take the audio file size given by soundfiler and divide that by the x resolution of the plot-graph window, read the array in chunks of the min max amplitudes to plot the waveform.
cursor-drive creation: [cursor-drive x resolution] eg [cursor-drive 200] drives the play cursor if active
For best results I found it best to keep the resolution to half the window size, say 200 window 100 resolution
SETTINGS. for plot-graph
size float float (can be set as a creation arg);
min float (y value <= 0 for peaks -1 to 0);
max float (y values>= 0 for peaks 0 to 1);
index float (x value 0 to resolution cur float (x position for cursor 0 to resolution);
cur-vis float (hide/show cursor 0 or 1);
min-vis float (hide/show min plot 0 or 1);
max-vis float (hide/show max plot 0 or 1);
colour float float float float float float;
where:-;
float 1 = back colour (0 to 999 struct colours);
float 2 = border colour (0 to 999 struct colours);
float 3 = plot colour (0 to 999 struct colours);
float 4 = cursor colour (0 to 999 struct colours);
float 5 = plot thickness (1 to 5ish);
float 6 = border thickness (0 to 30ish);
plot-fill float (hide/show fill 0 or 1)
fill-col float float (0 to 999 thickness 0 to 5)
For an animated plot with fill try the following in the plot-graph-help
load audio file
click 100 resolution
click look here for more
scale x using the number-box to 200
toggle off min-vis and cursor-vis
click play (and loop if a small file)
in the more page
toggle scope plot
toggle fill plot
adjust normalise
play with the colours
plot-graph.pd and plot-graph-help.pd are read only to prevent overwriting the defaults, change this if you wish
Have fun
Cheers
Balwyn
plot-graph.zip
The picture is reduced to 70%

Recursion
Hi all,
in this patch I would like to do 5000 iterations of a recursive function.
I used the objects [metro], [counter] and [moses]. Is this the correct way to do this?
In particular, I would like it to be done as quickly as possible.
Thanks for any advice.
Note: 0.7 is the initial value, 3.798 is the constant "a" . Both values are entered automatically before running the iterations.

recursive.pd
a.
Midi Rotary Knob Direction Patch/Algorythm?
Hey everybody,
Sorry, for a lot of text. But the bold text at the bottom is my main question. The rest will help you to get a better understanding of my situation.
you helped me so much, with my last question here (the Faders are working dope now):
https://forum.pdpatchrepo.info/topic/13849/how-to-smoothe-out-arrays/25
I am doing a Steinberg Houston to Mackie Control emulation at the moment, to use my controller with other DAWs than Cubase/Nuendo. Will upload it to the internet community, when I am finished for the handful of people that maybe are also using this controller.
I made good progress:

I got the Faders and the normal knobs to work. And the display puts out information. But it is with bugs, because the LCD Screen of the Houston has 40 characters for one line and the Mackie Universal Pro has 56 Characters. So i did a list algorithm, which deletes spaces of the mackie message until the message fits on the 40 character line. Maybe there is a method wich will work better but this subject eats too much time for me at the moment and it works rough okay. One defenitely get's some helpful information on the screen from the DAW.
The Faders and Rotary Knobs and normal knobs are the most important of this controller I guess. The Faders are working fine as I mentioned above, but there is a problem with the rotary knobs, wich I can't handle alone and hope you can help me. 
The problem is, that the Mackie Controller send simple clicks to the DAW. If you are turning a rotary knob, it sends out a number of midi messages:
If you turn it right, it sends midi messages wich contains the value 1 and if you turn it down it sends messages wich are containing the value 65.
"When the VPots are rotated rapidly, a message equal to the number of clicks is sent."
BUT the Houston controller instead is sending values like it's faders with 15 (MSB) and 128(LSB) values. AND it is updating the rotary limit by itself. So if I turn a rotary, it will update it's LEDs and stops sending midi messages when it reaches the maximum or minimum value. So, I did this patch as a momentary state:
The DAW sends 11 values for the Houston LEDs. 11 is max and 1 is min. This is good, I send this values to my houston controller and can update the rotary values and LEDs.
With this updated values from the DAW, I can force my rotary knobs, that they don't stop to send values, because they are set to the values, which the DAW sends, every time I turn a knob. With this method I got it to work to imitate a Mackie Rotary knob. Everytime the Houston Rotary value changes, it sends Mackie "midi click values" according to the amount of midi value changes of the houston.
BUT the problem is, that this is working only in one direction. Now my main question:
How can I make pure Data know, if I am turning my knob in the left direction or in the right direction? There is also the problem, which I mentioned above, that I set the momentary value everytime, I move the rotary, so that I get a unlimited amount of possible rotary move "clicks". Also the midi values which the houston sends arent perfect smooth. It works fine, but it isn't like that, that if you move a rotary in one direction, every value one by another is perfectly lower or higher.
I think I maybe need a algorythm, which looks if the values in a time period are getting higher or lower and then send out bangs on two seperate outlets. For example the left outlet for lower values and the right outlet for higher values. And it should also detect, if I move the rotary fast or slow. So a constant smoothing or clocked bang is also not an option. This is defenitely to complicated for me. I have no idea and what I tried didn't worked.
Would be super cool, if you could help me out again. 
Start, stop and restart a midi file
@atux said:
@whale-av said:
@atux You need to look at the help file for [seq].
[...]
There is also a message [goto(
[...]
.using |pause( and |continue( it work fine.
Instead using |goto( for now nothing happens. For example the file lasts 90 sec, I put as argument 20000 ms: it should start from t = 20s, but nothing happens.
Now I understand why using [seq] nothing happens with [goto 20000( ....the argument must be in * seconds * and not in * milliseconds *... 
So to start at t=20 seconds, it must be put [goto 20(.
Now the "goto" in the patch should work.
I have a question: I'm trying to figure out if the message argument [goto( can be used as a variable, in order to handle it numerically, for example by scrolling a number box, anyone have any ideas to do this?
Thanks
a




