Content-Length: 480054 | pFad | http://github.com/adafruit/circuitpython/pull/9776/commits/16575fc0efd9b235463d100f6b68f440a13b4ca5

78 audiofilters: Add Distortion effect and implement LFO ticking by relic-se · Pull Request #9776 · adafruit/circuitpython · GitHub
Skip to content

audiofilters: Add Distortion effect and implement LFO ticking #9776

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 31 commits into from
Jan 23, 2025
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
16575fc
Added `Distortion` and `DistortionMode` classes to `audiofilters` mod…
relic-se Oct 23, 2024
46ebae1
Remove separate DistortionMode code files.
relic-se Oct 31, 2024
3a16daf
Remove `audiofilters.DistortionMode.ATAN`
relic-se Oct 31, 2024
1008dd5
Simplify `audiofilters.DistortionMode.LOFI` sample processing with bi…
relic-se Oct 31, 2024
37b6b70
Fix error with null sample handling in `audiofilters.Distortion`.
relic-se Nov 4, 2024
064c3f3
Merge branch 'adafruit:main' into audiofilters_distortion
relic-se Nov 13, 2024
a7060f0
Merge branch 'adafruit:main' into audiofilters_distortion
relic-se Nov 27, 2024
6481b4e
Merge branch 'adafruit:main' into audiofilters_distortion
relic-se Dec 10, 2024
31c9095
Implement `synthio_block_slot_get_limited`.
relic-se Dec 10, 2024
155f197
Convert default float values from null checks to MP_ROM_INT.
relic-se Dec 10, 2024
89f2ae1
Remove unnecessary kwarg setters.
relic-se Dec 10, 2024
5c981f0
Use `MICROPY_FLOAT_CONST` and `MICROPY_FLOAT_C_FUN` within floating p…
relic-se Dec 10, 2024
222ce2c
Apply similar updates to audiofilters.Filter and audiodelays.Echo: MI…
relic-se Dec 10, 2024
0410d22
Added `soft_clip` property to toggle between hard clipping (default) …
relic-se Dec 11, 2024
57022f9
Implemented soft clipping and continued optimization of distortion al…
relic-se Dec 11, 2024
48ca21d
Add Distortion to unix port and make type conversions explicit.
relic-se Dec 11, 2024
4257c62
Variable number of samples within `shared_bindings_synthio_lfo_tick`.
relic-se Dec 12, 2024
0e64e1c
Implement block ticking within audio effects.
relic-se Dec 12, 2024
5fbbeed
Call `shared_bindings_synthio_lfo_tick` on audioeffects in `SYNTHIO_M…
relic-se Dec 12, 2024
e18e5b2
Merge branch 'adafruit:main' into audiofilters_distortion
relic-se Jan 17, 2025
cef94d7
Remove unnecessary deinit check.
relic-se Jan 17, 2025
b796f0d
Only calculate lofi bit mask when necessary.
relic-se Jan 17, 2025
84f8e31
Update `shared_bindings_synthio_lfo_tick` within `audiomixer` to use …
relic-se Jan 17, 2025
d84cdbc
Update Distortion class docstring.
relic-se Jan 17, 2025
8c40c56
Move `shared_bindings_synthio_lfo_tick` to avoid error if using unsig…
relic-se Jan 17, 2025
05db339
Remove truncation of `delay_ms` within buffer processing loop.
relic-se Jan 17, 2025
ec5b1e8
Add `mix_down_sample` to echo output.
relic-se Jan 17, 2025
48f272e
Fix build errors.
relic-se Jan 17, 2025
99b4fae
Remove unnecessary copies of `mix_down_sample`.
relic-se Jan 17, 2025
e049337
Allow variable mix down sample scale.
relic-se Jan 18, 2025
815f829
Merge branch 'adafruit:main' into audiofilters_distortion
relic-se Jan 23, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Added Distortion and DistortionMode classes to audiofilters mod…
…ule based on Godot's AudioEffectDistortion class.
  • Loading branch information
relic-se committed Oct 23, 2024
commit 16575fc0efd9b235463d100f6b68f440a13b4ca5
2 changes: 2 additions & 0 deletions py/circuitpy_defns.mk
Original file line number Diff line number Diff line change
Expand Up @@ -570,6 +570,7 @@ $(filter $(SRC_PATTERNS), \
_bleio/ScanEntry.c \
_eve/__init__.c \
__future__/__init__.c \
audiofilters/DistortionMode.c \
camera/ImageFormat.c \
canio/Match.c \
codeop/__init__.c \
Expand Down Expand Up @@ -626,6 +627,7 @@ SRC_SHARED_MODULE_ALL = \
audiodelays/Echo.c \
audiodelays/__init__.c \
audiofilters/Filter.c \
audiofilters/Distortion.c \
audiofilters/__init__.c \
audioio/__init__.c \
audiomixer/Mixer.c \
Expand Down
362 changes: 362 additions & 0 deletions shared-bindings/audiofilters/Distortion.c

Large diffs are not rendered by default.

44 changes: 44 additions & 0 deletions shared-bindings/audiofilters/Distortion.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// This file is part of the CircuitPython project: https://circuitpython.org
//
// SPDX-FileCopyrightText: Copyright (c) 2024 Cooper Dalrymple
//
// SPDX-License-Identifier: MIT

#pragma once

#include "shared-bindings/audiofilters/DistortionMode.h"
#include "shared-module/audiofilters/Distortion.h"

extern const mp_obj_type_t audiofilters_distortion_type;

void common_hal_audiofilters_distortion_construct(audiofilters_distortion_obj_t *self,
mp_obj_t drive, mp_obj_t pre_gain, mp_obj_t post_gain,
audiofilters_distortion_mode_t mode, mp_obj_t mix,
uint32_t buffer_size, uint8_t bits_per_sample, bool samples_signed,
uint8_t channel_count, uint32_t sample_rate);

void common_hal_audiofilters_distortion_deinit(audiofilters_distortion_obj_t *self);
bool common_hal_audiofilters_distortion_deinited(audiofilters_distortion_obj_t *self);

uint32_t common_hal_audiofilters_distortion_get_sample_rate(audiofilters_distortion_obj_t *self);
uint8_t common_hal_audiofilters_distortion_get_channel_count(audiofilters_distortion_obj_t *self);
uint8_t common_hal_audiofilters_distortion_get_bits_per_sample(audiofilters_distortion_obj_t *self);

mp_obj_t common_hal_audiofilters_distortion_get_drive(audiofilters_distortion_obj_t *self);
void common_hal_audiofilters_distortion_set_drive(audiofilters_distortion_obj_t *self, mp_obj_t arg);

mp_obj_t common_hal_audiofilters_distortion_get_pre_gain(audiofilters_distortion_obj_t *self);
void common_hal_audiofilters_distortion_set_pre_gain(audiofilters_distortion_obj_t *self, mp_obj_t arg);

mp_obj_t common_hal_audiofilters_distortion_get_post_gain(audiofilters_distortion_obj_t *self);
void common_hal_audiofilters_distortion_set_post_gain(audiofilters_distortion_obj_t *self, mp_obj_t arg);

audiofilters_distortion_mode_t common_hal_audiofilters_distortion_get_mode(audiofilters_distortion_obj_t *self);
void common_hal_audiofilters_distortion_set_mode(audiofilters_distortion_obj_t *self, audiofilters_distortion_mode_t mode);

mp_obj_t common_hal_audiofilters_distortion_get_mix(audiofilters_distortion_obj_t *self);
void common_hal_audiofilters_distortion_set_mix(audiofilters_distortion_obj_t *self, mp_obj_t arg);

bool common_hal_audiofilters_distortion_get_playing(audiofilters_distortion_obj_t *self);
void common_hal_audiofilters_distortion_play(audiofilters_distortion_obj_t *self, mp_obj_t sample, bool loop);
void common_hal_audiofilters_distortion_stop(audiofilters_distortion_obj_t *self);
50 changes: 50 additions & 0 deletions shared-bindings/audiofilters/DistortionMode.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// This file is part of the CircuitPython project: https://circuitpython.org
//
// SPDX-FileCopyrightText: Copyright (c) 2024 Cooper Dalrymple
//
// SPDX-License-Identifier: MIT

#include "py/enum.h"

#include "shared-bindings/audiofilters/DistortionMode.h"

MAKE_ENUM_VALUE(audiofilters_distortion_mode_type, distortion_mode, CLIP, DISTORTION_MODE_CLIP);
MAKE_ENUM_VALUE(audiofilters_distortion_mode_type, distortion_mode, ATAN, DISTORTION_MODE_ATAN);
MAKE_ENUM_VALUE(audiofilters_distortion_mode_type, distortion_mode, LOFI, DISTORTION_MODE_LOFI);
MAKE_ENUM_VALUE(audiofilters_distortion_mode_type, distortion_mode, OVERDRIVE, DISTORTION_MODE_OVERDRIVE);
MAKE_ENUM_VALUE(audiofilters_distortion_mode_type, distortion_mode, WAVESHAPE, DISTORTION_MODE_WAVESHAPE);

//| class DistortionMode:
//| """The method of distortion used by the `audiofilters.Distortion` effect."""
//|
//| CLIP: DistortionMode
//| """Digital distortion effect which cuts off peaks at the top and bottom of the waveform."""
//|
//| ATAN: DistortionMode
//| """"""
//|
//| LOFI: DistortionMode
//| """Low-resolution digital distortion effect (bit depth reduction). You can use it to emulate the sound of early digital audio devices."""
//|
//| OVERDRIVE: DistortionMode
//| """Emulates the warm distortion produced by a field effect transistor, which is commonly used in solid-state musical instrument amplifiers. The `audiofilters.Distortion.drive` property has no effect in this mode."""
//|
//| WAVESHAPE: DistortionMode
//| """Waveshaper distortions are used mainly by electronic musicians to achieve an extra-abrasive sound."""
//|
MAKE_ENUM_MAP(audiofilters_distortion_mode) {
MAKE_ENUM_MAP_ENTRY(distortion_mode, CLIP),
MAKE_ENUM_MAP_ENTRY(distortion_mode, ATAN),
MAKE_ENUM_MAP_ENTRY(distortion_mode, LOFI),
MAKE_ENUM_MAP_ENTRY(distortion_mode, OVERDRIVE),
MAKE_ENUM_MAP_ENTRY(distortion_mode, WAVESHAPE),
};
static MP_DEFINE_CONST_DICT(audiofilters_distortion_mode_locals_dict, audiofilters_distortion_mode_locals_table);

MAKE_PRINTER(audiofilters, audiofilters_distortion_mode);

MAKE_ENUM_TYPE(audiofilters, DistortionMode, audiofilters_distortion_mode);

audiofilters_distortion_mode_t validate_distortion_mode(mp_obj_t obj, qstr arg_name) {
return cp_enum_value(&audiofilters_distortion_mode_type, obj, arg_name);
}
22 changes: 22 additions & 0 deletions shared-bindings/audiofilters/DistortionMode.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// This file is part of the CircuitPython project: https://circuitpython.org
//
// SPDX-FileCopyrightText: Copyright (c) 2024 Cooper Dalrymple
//
// SPDX-License-Identifier: MIT

#pragma once

#include "py/enum.h"

typedef enum audiofilters_distortion_mode_e {
DISTORTION_MODE_CLIP,
DISTORTION_MODE_ATAN,
DISTORTION_MODE_LOFI,
DISTORTION_MODE_OVERDRIVE,
DISTORTION_MODE_WAVESHAPE,
} audiofilters_distortion_mode_t;

extern const cp_enum_obj_t distortion_mode_CLIP_obj;
extern const mp_obj_type_t audiofilters_distortion_mode_type;

extern audiofilters_distortion_mode_t validate_distortion_mode(mp_obj_t obj, qstr arg_name);
6 changes: 6 additions & 0 deletions shared-bindings/audiofilters/__init__.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
#include "py/runtime.h"

#include "shared-bindings/audiofilters/__init__.h"
#include "shared-bindings/audiofilters/DistortionMode.h"
#include "shared-bindings/audiofilters/Distortion.h"
#include "shared-bindings/audiofilters/Filter.h"

//| """Support for audio filter effects
Expand All @@ -21,6 +23,10 @@
static const mp_rom_map_elem_t audiofilters_module_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_audiofilters) },
{ MP_ROM_QSTR(MP_QSTR_Filter), MP_ROM_PTR(&audiofilters_filter_type) },
{ MP_ROM_QSTR(MP_QSTR_Distortion), MP_ROM_PTR(&audiofilters_distortion_type) },

// Enum-like Classes.
{ MP_ROM_QSTR(MP_QSTR_DistortionMode), MP_ROM_PTR(&audiofilters_distortion_mode_type) },
};

static MP_DEFINE_CONST_DICT(audiofilters_module_globals, audiofilters_module_globals_table);
Expand Down
Loading








ApplySandwichStrip

pFad - (p)hone/(F)rame/(a)nonymizer/(d)eclutterfier!      Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

Fetched URL: http://github.com/adafruit/circuitpython/pull/9776/commits/16575fc0efd9b235463d100f6b68f440a13b4ca5

Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy