feat: adsr documentation
This commit is contained in:
60
docs/ADSR.md
Normal file
60
docs/ADSR.md
Normal file
@@ -0,0 +1,60 @@
|
||||
Certainly! Here's an example of generating an ADSR (Attack, Decay, Sustain, Release) envelope in Python:
|
||||
|
||||
```python
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
# Parameters
|
||||
sample_rate = 44100 # Sample rate in Hz
|
||||
duration = 5 # Duration of the envelope in seconds
|
||||
|
||||
# Time values
|
||||
num_samples = int(duration * sample_rate)
|
||||
time = np.arange(num_samples) / sample_rate
|
||||
|
||||
# ADSR parameters
|
||||
attack_time = 0.5 # Attack time in seconds
|
||||
decay_time = 0.3 # Decay time in seconds
|
||||
sustain_level = 0.6 # Sustain level (0 to 1)
|
||||
release_time = 1.0 # Release time in seconds
|
||||
|
||||
# Generate the ADSR envelope
|
||||
envelope = np.zeros(num_samples)
|
||||
attack_samples = int(attack_time * sample_rate)
|
||||
decay_samples = int(decay_time * sample_rate)
|
||||
release_samples = int(release_time * sample_rate)
|
||||
|
||||
# Attack phase
|
||||
envelope[:attack_samples] = np.linspace(0, 1, num=attack_samples)
|
||||
|
||||
# Decay phase
|
||||
decay_slope = (1 - sustain_level) / decay_samples
|
||||
envelope[attack_samples:attack_samples + decay_samples] = np.linspace(1, sustain_level, num=decay_samples) - decay_slope * np.arange(decay_samples)
|
||||
|
||||
# Sustain phase
|
||||
envelope[attack_samples + decay_samples:-release_samples] = sustain_level
|
||||
|
||||
# Release phase
|
||||
release_slope = sustain_level / release_samples
|
||||
envelope[-release_samples:] = sustain_level - release_slope * np.arange(release_samples)
|
||||
|
||||
# Normalize the envelope
|
||||
envelope /= np.max(envelope)
|
||||
|
||||
# Plot the envelope
|
||||
plt.plot(time, envelope)
|
||||
plt.xlabel('Time (s)')
|
||||
plt.ylabel('Amplitude')
|
||||
plt.title('ADSR Envelope')
|
||||
plt.show()
|
||||
```
|
||||
|
||||
In this example, we specify the sample rate and duration of the envelope. We define the ADSR parameters: attack time, decay time, sustain level, and release time.
|
||||
|
||||
We create an array to store the envelope values and initialize it with zeros. We calculate the number of samples for each phase based on the sample rate and duration.
|
||||
|
||||
We then calculate the envelope values for each phase. The attack phase increases linearly from 0 to 1. The decay phase decreases linearly from 1 to the sustain level. The sustain phase maintains a constant value equal to the sustain level. The release phase decreases linearly from the sustain level to 0.
|
||||
|
||||
After generating the envelope, we normalize it to ensure the maximum value is 1. Finally, we plot the envelope using Matplotlib.
|
||||
|
||||
You can modify the ADSR parameters to create different envelope shapes or experiment with adding modulation to create more dynamic and expressive sounds.
|
||||
Reference in New Issue
Block a user