kautenja / potatochips Goto Github PK
View Code? Open in Web Editor NEWEurorack modules based on programmable sound chip emulation.
License: Other
Eurorack modules based on programmable sound chip emulation.
License: Other
The Atari 2600 had only 2 voices, making it difficult to play chords. A solution that is popular is to use a fast appegio to produce a chord-like effect.
Since there are only two voices on the Atari, it's difficult to play chords. But you can use fast arpeggios to give the effect of playing chords on only one voice. You just step through each note of the chord quickly which gives the essence of the chord. Typically I do a note per step in my music driver. I have tried running arpeggios at a note per frame (60 per second) but it sounds bad when it gets that fast. You introduce 60Hz noise at that speed.
A module that provides this functionality (with some bonus stuff) would be useful for distorting and lightly mangling VOCT signals.
Using a sine wave as the default wave in all the wavetables means the wavetable knob is useless when first placing the module. It seems better to default each waveform to a different basic shape: sine, ramp up, ramp down, pulse, triangle.
The Paula is the sound chip on the Amiga personal computer that produces audio from a 512KB bank of sample data. An existing project, WinUAE, emulates the Amiga PC in C++, and may have portions of DSP code that can be ported over into a VCV module, either as a sound generator (sample player), or complex audio effect (downsampling, quantization, and other eccentricities due to hardware or software bugs in the chip).
I'd like to encourage you to make the change.
I miss your modules in Rack V2 library.
Best regards, Andras
A module that provides access to the Konami SCC emulator would be cool.
a knob for controlling the base frequency in addition to the VOCT input for each of the 6 voices could be useful
i'm maintaining armv7l (32bit) and aarch64 (64bit) builds of vcvrack and the open source plugins at https://github.com/hexdump0815/vcvrack-dockerbuild-v1 - when i build the PotatoChips plugin it compiles fine on armv7l but when i start rack i get "undefined symbol _ZN15WaveTableEditorIaE11ColorBorderE" and the plugin will not load - the same build works fine on aarch64 and x86-64 ... i guess this is a armv7l specific problem and not really a problem of your plugin, but maybe you have an idea where it might come from ... could it be a 32 vs 64 bit issue maybe? any help would be welcome as i'm not that familiar with the c++ details
build and run the latest version of your plugin on armv7l
it works
not needed
already given in the initial description
Polyphony would be a good add, though #7 will need to be resolved first; the current code will not scale very nicely.
road map:
Sample rates with a decimal component, e.g., 44.1kHz, 88.2kHz, etc., cause the pitch of the oscillators to detune from the standard tuning. Sample rates with no decimal component, e.g., 48kHz, 96kHz, etc., appear to function as intended.
It would be cool to add module that emulates OPM chip (which was in Yamaha CX5M/II MSX computer, Sharp X68000, Sega System 16 and some others). It is a 4-operator FM chip, similar to YM2612 (OPN2), but more 'primitive' in a way, more raw sounding. It can produce some very interesting vintage digital synth sounds (here is example video). There are some excellent open source libraries (NukedOPM, an implementation from MAME), which can be used to implement module. YM2151 parameters are mostly the same as in Boss Fight module, so not much to change :)
Several modules can be made from the S-SMP emulations for different uses:
Links:
Because the num channels parameter changes the base frequency of all channels, the frequency label on the knob becomes inconsistent for all channels other than 1. The current version of rack does not support changing configParam values on the fly without hacks that could break with any build: https://community.vcvrack.com/t/is-possible-to-change-configparam-values-on-the-fly/4635
Some of the chips may support reseting the phase of an oscillator. Can this be used to introduce a sync function?
can performance be improved? Code from Famitracker may be worth looking at. The DSP foundation is still the Blargg BlipBuffer code, but the chip emulations are different and have a more music friendly API. There are also emulations of the remaining NES chips in the Famitracker codebase.
all the oscillator modules in this plugin feature several output ports. A simple way to achieve a mix-out (for treating the chip like a single voice) is to implement a basic mixer as an expander module. This module would contain a single output port that sums the outputs from the neighboring chip module.
16-bit mode is implemented in the POKEY back-end, but isn't producing results that are useful or make sense. The hardware documentation of this feature is sparse to begin with, but my understanding is that it essentially enables a 16-bit frequency by sharing frequency registers between neighboring oscillators (1+2, 3+4). The panel logic to turn the feature on is in place, but currently disabled until the back-end issues are resolved.
When loading a patch with certain modules, an impulse is emitted on patch load
Steps to reproduce the behavior:
this occurs for most oscillators in a similar configuration as 2A03
The oscillator is quiet on initialization if an empty cable is connected to the volume / amplifier level input.
The pitch of the 106 oscillator increases when the sampling rate increases.
All the chips feature a "reset" function.
A module that provides access to the NEC TurboGrafx16 would be sweet.
I'd love to use Algomorph in conjunction with the operators of a 2612 (or 2413), but their individual FM (phase) inputs and audio outputs are inaccessible.
It would be really neat to have a module something like the Bogaudio FM-OP, but containing an oscillator of one of these classic Yamaha FM chips. My thinking is that maybe the module could work by emulating two 2612/2413 operators, with the phase of one of them (the modulator) hijacked to be driven by external audio input rather than the chip's internal sine table. Ideally the other (carrier) operator would also have access to feedback. Like FM-OP, this theoretical module could also contain a built-in emulated 2612/2413 amplitude envelope.
I don't have any experience coding anything DSP or emulation related (besides noodling with the RAM in RackNES and the audio routing & cross-fading in Algomorph), so while I've taken a brief look into the 2612 code in this repository I'm not sure how feasible this module would actually be. What do you think?
Sometimes the triggers to YM2612-based modules in SSG mode fail.
Steps to reproduce the behavior:
Retriggering in SSG mode should always behave like an LFO with hard reset. Sometimes this fails and a one-shot note leaks through using the envelope generator settings.
Patch file
{
"version": "1.dev.476a49b",
"modules": [
{
"id": 1,
"plugin": "Core",
"version": "1.1.6",
"model": "AudioInterface",
"params": [],
"leftModuleId": 154,
"data": {
"audio": {
"driver": 1,
"deviceName": "default",
"offset": 0,
"maxChannels": 8,
"sampleRate": 44100,
"blockSize": 512
}
},
"pos": [
57,
0
]
},
{
"id": 2,
"plugin": "Fundamental",
"version": "1.4.0",
"model": "VCMixer",
"params": [
{
"id": 0,
"value": 1.0
},
{
"id": 1,
"value": 1.0
},
{
"id": 2,
"value": 1.0
},
{
"id": 3,
"value": 1.0
},
{
"id": 4,
"value": 1.0
}
],
"leftModuleId": 142,
"rightModuleId": 150,
"pos": [
24,
0
]
},
{
"id": 5,
"plugin": "Core",
"version": "1.1.6",
"model": "MIDIToCVInterface",
"params": [],
"rightModuleId": 142,
"data": {
"channels": 4,
"polyMode": 0,
"clockDivision": 24,
"lastPitch": 8192,
"lastMod": 0,
"midi": {
"driver": -11,
"deviceName": "QWERTY keyboard (US)",
"channel": -1
}
},
"pos": [
0,
0
]
},
{
"id": 142,
"plugin": "KautenjaDSP-PotatoChips",
"version": "1.10.1",
"model": "MiniBoss",
"params": [
{
"id": 0,
"value": 15.0
},
{
"id": 1,
"value": 100.0
},
{
"id": 2,
"value": 31.0
},
{
"id": 3,
"value": 5.0
},
{
"id": 4,
"value": 7.0
},
{
"id": 5,
"value": 0.0
},
{
"id": 6,
"value": 1.0
},
{
"id": 7,
"value": 0.0
},
{
"id": 8,
"value": -1.18500173
},
{
"id": 9,
"value": 0.0
},
{
"id": 10,
"value": 0.0
},
{
"id": 11,
"value": 0.0
},
{
"id": 12,
"value": 0.0
},
{
"id": 13,
"value": 1.0
},
{
"id": 14,
"value": 3.0
},
{
"id": 15,
"value": 127.0
}
],
"leftModuleId": 5,
"rightModuleId": 2,
"data": {
"prevent_clicks": true
},
"pos": [
8,
0
]
},
{
"id": 150,
"plugin": "Bogaudio",
"version": "1.1.35",
"model": "Bogaudio-VU",
"params": [],
"leftModuleId": 2,
"rightModuleId": 154,
"data": {},
"pos": [
34,
0
]
},
{
"id": 154,
"plugin": "Bogaudio",
"version": "1.1.35",
"model": "Bogaudio-Analyzer",
"params": [
{
"id": 0,
"value": 0.0
},
{
"id": 1,
"value": 0.385500133
},
{
"id": 2,
"value": 1.0
},
{
"id": 3,
"value": 0.0
},
{
"id": 4,
"value": 1.0
},
{
"id": 5,
"value": 0.0
}
],
"leftModuleId": 150,
"rightModuleId": 1,
"data": {
"frequency_plot": "log",
"amplitude_plot": "decibels_140"
},
"pos": [
37,
0
]
},
{
"id": 156,
"plugin": "KautenjaDSP",
"version": "1.0.0",
"model": "Oscilloscope",
"params": [
{
"id": 0,
"value": 0.0
},
{
"id": 1,
"value": 0.0
},
{
"id": 2,
"value": 0.0
},
{
"id": 3,
"value": 0.0
},
{
"id": 4,
"value": 14.0
},
{
"id": 5,
"value": 0.0
},
{
"id": 6,
"value": 0.0
},
{
"id": 7,
"value": 0.0
}
],
"data": {
"lissajous": 0,
"external": 0
},
"pos": [
0,
1
]
}
],
"cables": [
{
"id": 1408,
"outputModuleId": 2,
"outputId": 1,
"inputModuleId": 1,
"inputId": 0,
"color": "#0986ad"
},
{
"id": 1317,
"outputModuleId": 2,
"outputId": 1,
"inputModuleId": 150,
"inputId": 0,
"color": "#0986ad"
},
{
"id": 1316,
"outputModuleId": 150,
"outputId": 0,
"inputModuleId": 154,
"inputId": 0,
"color": "#0986ad"
},
{
"id": 1428,
"outputModuleId": 2,
"outputId": 1,
"inputModuleId": 1,
"inputId": 1,
"color": "#0986ad"
},
{
"id": 1429,
"outputModuleId": 5,
"outputId": 1,
"inputModuleId": 142,
"inputId": 6,
"color": "#c9b70e"
},
{
"id": 1430,
"outputModuleId": 5,
"outputId": 6,
"inputModuleId": 142,
"inputId": 7,
"color": "#c9b70e"
},
{
"id": 1431,
"outputModuleId": 5,
"outputId": 0,
"inputModuleId": 142,
"inputId": 8,
"color": "#c9b70e"
},
{
"id": 1432,
"outputModuleId": 142,
"outputId": 0,
"inputModuleId": 2,
"inputId": 1,
"color": "#0986ad"
},
{
"id": 1434,
"outputModuleId": 2,
"outputId": 2,
"inputModuleId": 154,
"inputId": 1,
"color": "#c91847"
},
{
"id": 1320,
"outputModuleId": 154,
"outputId": 0,
"inputModuleId": 156,
"inputId": 0,
"color": "#0986ad"
},
{
"id": 1470,
"outputModuleId": 142,
"outputId": 0,
"inputModuleId": 142,
"inputId": 9,
"color": "#0986ad"
}
]
}
It would be nice to have the option of soft clipping input signals when they are too hot. The current default behavior is to hard clip the input signal.
supporting polyphony would be nice.
[KautenjaDSP-PotatoChips] Validating plugin.json...FAILED
[KautenjaDSP-PotatoChips] Issues found in `plugin.json`:
S_SMP: invalid module tags: Echo
-- Valid tags are defined in https://raw.githubusercontent.com/VCVRack/Rack/v1/src/tag.cpp
Normalled inputs โ e.g., for VOCT, Volume, etc. โ can help reduce the number of patch cables needed
It would be nice to commit wavetable edits to the undo history and allow edits to be undone on request.
It would be nice to have a hard sync feature on MiniBoss.
all the oscillator modules in this plugin utilize a low-pass equalization algorithm. A simple way to achieve parameterization over this component is to implement a basic EQ as an expander module. This module would contain the parameters of the blip_eq_t
object with CV inputs.
there is a lot of duplicate code that can be reduced to global functions.
getAudioOut
onSampleRateChange
Current serial processing of engines for polyphonic cases causes over-usage of computational resources.
In some cases, replacing serial loops over polyphonic channels with vectorized code can improve the performance for polyphonic use cases.
VCV specific solutions can be implemented using rack::simd
. More generic implementations can be forged using a linear algebra and vectorization framework like Eigen.
APU code has been pulled from blargg's libraries for the chips below:
There is a special mode where channel 3 allows individual frequencies for each operator that is not currently implemented on the panel. The logic does exist in the engine, but the class will need updated to allow addressing the extra frequency registers.
Many of these chips contain simple 4 or 5 bit amplifiers modeled directly from hardware. It may be cool to build an amplifiers module that integrates all the amplifiers models into a single amplifier for use with other oscillators.
In many cases, debug assertions can be replace with exceptions in runtime code with no cost (assuming they never throw). In particular, errors can be thrown when:
This isn't useful for VCV Rack, but is useful when using the dsp
code as a library in other projects. It's also more readable and clear.
A module that provides access to the Yamaha YM2413 emulator would be awesome.
evaluate which blip quality levels are best for the VCV Rack context
spamming the LFSR trigger input causes the noise generator to 0 out and stop working after a point.
Steps to reproduce the behavior:
noise generator should always produce noise (up to the amplifier at least)
An ability to right-click the waveform editor and insert basic waveforms would be nice:
It starts at about 25% and quickly goes all the way up to 95-97%
Steps to reproduce the behavior:
A clear and concise description of what you expected to happen.
Mac os 10.5.5 macbook pro 16"
Add any other context about the problem here.
Some of the oscillator voices on 2612 are initialized in a state that produces noise when there should be none.
Steps to reproduce the behavior:
Voices do not produce undue noise (without being parameterized to be noisy), i.e., the default patch should always sound the same, but sometimes a voice has noise in it.
2612 sounds different at different sample rates.
Steps to reproduce the behavior:
The notes should sound the same in terms of frequency between all sample rates.
A way to visualize the envelope for each operator like is done by ChipsynthMD would be cool.
Some oscillators are being initialized perfectly out of phase such they cancel each other out and produce silence.
Steps to reproduce the behavior:
All oscillators should initialize in phase and stay in phase (assuming they are tuned to the same frequency)
Pretty self explanatory. The performance from 2612 at the moment is absolute garbage. Compared to the TercerBrazo module, it's clocking in at 25.0% (5.6us) vs 1.1% (0.23us). It's playable, but consumes a lot of valuable space that other modules will need. This needs to be addressed.
The frequency knob in high-frequency mode (Ch 1 and 3) has a large portion of range that does nothing. The frequency also reaches the inaudible range at some portions and becomes silent. This is intended functionality of the chip, but can be confusing to the end-user when a channel stops making noise for unknown reasons. The frequency should be capped such that it always makes noise. When the high-frequency mode is engaged, the calculation of frequency from the parameter knob will need to be updated to provide a more appropriate range of control.
Presets are fun for s-smp(echo). They would be fun for a few other complex modules:
Right now, the 2612 emulation in the Boss Fight and Mini Boss modules miss out on some subtle sound quirks like the ladder effect in the original 2612. Nuked-OPN2 is a highly accurate emulation core that accurately models such quirks. I'm not sure if its possible to integrate it into this codebase, but if possible, that would be really cool.
The FME7 has a noise generator like the AY-3-8910 that is not currently implemented in the module.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.