@@ -11,8 +11,8 @@ Before writing a single line of code, most features and bug fixes require | |||||
Instead, there are many other areas where contributions are much appreciated. | Instead, there are many other areas where contributions are much appreciated. | ||||
- Dependencies of Rack. Especially [nanovg](https://github.com/memononen/nanovg)'s performance, [rtaudio](https://github.com/thestk/rtaudio)/[rtmidi](https://github.com/thestk/rtmidi)'s stability and compatibility, and maybe even touch support in [GLFW](https://github.com/glfw/glfw). You would be helping many more projects than just Rack. | - Dependencies of Rack. Especially [nanovg](https://github.com/memononen/nanovg)'s performance, [rtaudio](https://github.com/thestk/rtaudio)/[rtmidi](https://github.com/thestk/rtmidi)'s stability and compatibility, and maybe even touch support in [GLFW](https://github.com/glfw/glfw). You would be helping many more projects than just Rack. | ||||
- your own or others' Rack [plugins](PluginDevelopmentTutorial.md) | |||||
- Maintaining the VCV community plugin database. Volunteer at https://github.com/VCVRack/community/issues/248. | |||||
- Your own Rack [plugin](PluginDevelopmentTutorial.md) | |||||
- Maintaining the Rack plugin ecosystem by [curating](https://github.com/VCVRack/community/issues/352), [updating](https://github.com/VCVRack/community/issues/269), and [reviewing](https://github.com/VCVRack/community/issues/354) plugins | |||||
- Edits to the [VCV Rack manual](https://github.com/VCVRack/manual). | - Edits to the [VCV Rack manual](https://github.com/VCVRack/manual). | ||||
I will consider your contribution to Rack if you first open a [GitHub issue](https://github.com/VCVRack/Rack/issues) with a detailed design proposal, which may create an open discussion before the change is implemented. | I will consider your contribution to Rack if you first open a [GitHub issue](https://github.com/VCVRack/Rack/issues) with a detailed design proposal, which may create an open discussion before the change is implemented. | ||||
@@ -1,19 +1,19 @@ | |||||
# Core | # Core | ||||
*Core* modules are how Rack interfaces with your computer's audio drivers, external audio interface devices, physical and virtual MIDI devices, and (through *Bridge*) other DAWs. | |||||
*Core* modules are a part of the overall Rack program, and thus do not appear in the [Plugin Manager](https://vcvrack.com/plugins.html). | |||||
## Modules | |||||
1. [Audio](Core.md#audio) | |||||
2. [MIDI Interfaces](Core.md#midi-Interfaces) | |||||
- a. [MIDI-1](Core.md#midi-1) | |||||
- b. [MIDI-4](Core.md#midi-4) | |||||
- c. [MIDI-CC](Core.md#midi-cc) | |||||
- d. [MIDI-Trig](Core.md#midi-trig) | |||||
3. [Blank](Core.md#blank) | |||||
4. [Notes](Core.md#notes) | |||||
The *Core* plugin (built into Rack itself) includes utilities and interfaces for interfacing between virtual and hardware realms. | |||||
#### Modules | |||||
- [Audio](Core.md#audio) | |||||
- [MIDI Interfaces](Core.md#midi-interfaces) | |||||
- [MIDI-1](Core.md#midi-1) | |||||
- [MIDI-4](Core.md#midi-4) | |||||
- [MIDI-CC](Core.md#midi-cc) | |||||
- [MIDI-Trig](Core.md#midi-trig) | |||||
- [Blank](Core.md#blank) | |||||
- [Notes](Core.md#notes) | |||||
### Audio | ### Audio | ||||
 |  | ||||
@@ -42,7 +42,7 @@ A good balance can be found by increasing the block size until no audio "glitche | |||||
Note: Using multiple Audio modules is experimental and may crash Rack or render unstable audio. | Note: Using multiple Audio modules is experimental and may crash Rack or render unstable audio. | ||||
Most DAWs avoid this feature entirely by restricting audio to a single input and a single output device for stability reasons, but if using multiple audio devices in Rack works with your configuration, more power to you! | Most DAWs avoid this feature entirely by restricting audio to a single input and a single output device for stability reasons, but if using multiple audio devices in Rack works with your configuration, more power to you! | ||||
--- | |||||
### MIDI Interfaces | ### MIDI Interfaces | ||||
Each MIDI interface module (described below) supports the following drivers. | Each MIDI interface module (described below) supports the following drivers. | ||||
@@ -62,7 +62,7 @@ The *computer keyboard* MIDI driver generates MIDI notes when keys are presses w | |||||
Using two rows of keys, the virtual MIDI keyboard spans approximately 2½ octaves and can be shifted down and up with the <code>`</code> and `1` keys. | Using two rows of keys, the virtual MIDI keyboard spans approximately 2½ octaves and can be shifted down and up with the <code>`</code> and `1` keys. | ||||
Currently only the QWERTY (US) layout is supported, but other keyboard layouts may function similarly. | Currently only the QWERTY (US) layout is supported, but other keyboard layouts may function similarly. | ||||
--- | |||||
#### MIDI-1 | #### MIDI-1 | ||||
 |  | ||||
@@ -73,7 +73,7 @@ The **CV** output generates a 1V/oct pitch signal of the last held MIDI note. | |||||
**CLK1** and **CLK2** generate triggers specified by the division set by right-clicking on the panel and selecting the *CLK 1 rate* or *CLK 2 rate*. | **CLK1** and **CLK2** generate triggers specified by the division set by right-clicking on the panel and selecting the *CLK 1 rate* or *CLK 2 rate*. | ||||
**STRT**, **STOP**, and **CONT** generate triggers when the MIDI hardware or DAW host (for VCV Bridge) sends a start, stop, or continue event. | **STRT**, **STOP**, and **CONT** generate triggers when the MIDI hardware or DAW host (for VCV Bridge) sends a start, stop, or continue event. | ||||
--- | |||||
#### MIDI-4 | #### MIDI-4 | ||||
 |  | ||||
@@ -87,7 +87,7 @@ Right-click the panel to select the polyphony mode to specify the behavior in ma | |||||
Remember that MIDI interfaces can be used simultaneously with the same driver, for example if global controls like pitch and mod wheel are needed along with polyphonic controls. | Remember that MIDI interfaces can be used simultaneously with the same driver, for example if global controls like pitch and mod wheel are needed along with polyphonic controls. | ||||
--- | |||||
#### MIDI-CC | #### MIDI-CC | ||||
 |  | ||||
@@ -99,7 +99,7 @@ Each output can be assigned a particular CC number by clicking on the digital di | |||||
A **LRN** indicator is displayed to represent that the port is in "learn" mode. | A **LRN** indicator is displayed to represent that the port is in "learn" mode. | ||||
Either type a number or move a controller to set the CC number. | Either type a number or move a controller to set the CC number. | ||||
--- | |||||
#### MIDI-Trig | #### MIDI-Trig | ||||
 |  | ||||
@@ -109,15 +109,14 @@ For MIDI sequencers and drum machines that send immediate note ON/OFF messages i | |||||
To generate a CV signal corresponding to the velocity of the note instead of 10V, right-click on the panel and enable *Velocity* mode. | To generate a CV signal corresponding to the velocity of the note instead of 10V, right-click on the panel and enable *Velocity* mode. | ||||
This is useful for setting the amplitude of percussive sounds for MIDI controllers with velocity-capable pads, for example. | This is useful for setting the amplitude of percussive sounds for MIDI controllers with velocity-capable pads, for example. | ||||
--- | |||||
--- | |||||
### Blank | ### Blank | ||||
 |  | ||||
Useful for adding space between modules in your rack. | Useful for adding space between modules in your rack. | ||||
You can resize the panel by dragging the edges horizontally, with a minimum size of 3HP. | You can resize the panel by dragging the edges horizontally, with a minimum size of 3HP. | ||||
--- | |||||
### Notes | ### Notes | ||||
 |  | ||||
@@ -5,16 +5,24 @@ One of its many applications is to generate and process audio from virtual/digit | |||||
There are many online resources and books for learning DSP. | There are many online resources and books for learning DSP. | ||||
- [Digital signal processing Wikipedia](https://en.wikipedia.org/wiki/Digital_signal_processing) | |||||
- [DSPRelated.com](https://www.dsprelated.com/) | |||||
- [Signal Processing Stack Exchange](https://dsp.stackexchange.com/) | |||||
- [Digital Signal Processing MIT OpenCourseWare](https://ocw.mit.edu/resources/res-6-008-digital-signal-processing-spring-2011/) | |||||
- [The Scientist and Engineer's Guide to Digital Signal Processing](http://dspguide.com/) by Steven W. Smith | |||||
- [The Art of VA Filter Design](http://www.native-instruments.com/fileadmin/ni_media/downloads/pdf/VAFilterDesign_2.0.0a.pdf) by Vadim Zavalishin (PDF) | |||||
Below are my mindless ramblings of various topics with a focus on DSP for modular synthesizers. | |||||
Eventually this will become organized, but it is currently a *work-in-progress*. | |||||
If anything here is inaccurate, you can [edit it yourself](https://github.com/VCVRack/manual) or [open an issue](https://github.com/VCVRack/manual/issues) in the manual's source repository. | |||||
- [Digital signal processing Wikipedia](https://en.wikipedia.org/wiki/Digital_signal_processing): An neutral overview of the entire field. | |||||
- [Julius O. Smith III Online Books](https://ccrma.stanford.edu/~jos/) ([Index](https://ccrma.stanford.edu/~jos/GlobalJOSIndex.html)): Thousands of topics on audio DSP and relevant mathematics, neatly organized into easy-to-digest but sufficiently deep pages and examples. | |||||
- [Mathematics of the Discrete Fourier Transform (DFT)](https://ccrma.stanford.edu/~jos/mdft/) | |||||
- [Introduction to Digital Filters](https://ccrma.stanford.edu/~jos/filters/) | |||||
- [Physical Audio Signal Processing](https://ccrma.stanford.edu/~jos/pasp/) | |||||
- [Spectral Audio Signal Processing](https://ccrma.stanford.edu/~jos/sasp/) | |||||
- [Signal Processing Stack Exchange](https://dsp.stackexchange.com/): Questions and answers by thousands of DSP amateurs and professionals. | |||||
- [DSPRelated.com](https://www.dsprelated.com/): Articles, news, and blogs of both fundamental and modern DSP topics. | |||||
- [The Scientist and Engineer's Guide to Digital Signal Processing](http://dspguide.com/) by Steven W. Smith: Free online book about general DSP topics. | |||||
- [Digital Signal Processing MIT OpenCourseWare](https://ocw.mit.edu/resources/res-6-008-digital-signal-processing-spring-2011/): Video lectures and notes covering the basics of DSP. | |||||
- [The Art of VA Filter Design](http://www.native-instruments.com/fileadmin/ni_media/downloads/pdf/VAFilterDesign_2.0.0a.pdf) (PDF) by Vadim Zavalishin: Huge collection of deep topics in digital/analog filter design and analog filter modeling. | |||||
- [KVR Audio Forum - DSP and Plug-in Development](http://www.kvraudio.com/forum/viewforum.php?f=33): Music DSP and software development discussions. | |||||
The following topics are targeted toward modular synthesizer signal processing, in which designing small synthesizer components is the main objective. | |||||
This document is currently a *work-in-progress*. | |||||
Remember that if anything here is inaccurate, you can [edit it yourself](https://github.com/VCVRack/manual) or [open an issue](https://github.com/VCVRack/manual/issues) in the manual's source repository. | |||||
Image credits are from Wikipedia. | Image credits are from Wikipedia. | ||||
### Signals | ### Signals | ||||
@@ -182,11 +190,10 @@ $$ y(t) = (h \ast x)(t) = \int_{-\infty}^\infty h(\tau) x(t - \tau) d\tau $$ | |||||
where $h(t)$ is the *impulse response* of our filter. | where $h(t)$ is the *impulse response* of our filter. | ||||
The signal $h(t)$ is the result of processing a [delta function](https://en.wikipedia.org/wiki/Dirac_delta_function) through our filter, since $\delta(t)$ is the "identity" function of convolution, i.e. $h(t) = (h \ast \delta)(t)$. | The signal $h(t)$ is the result of processing a [delta function](https://en.wikipedia.org/wiki/Dirac_delta_function) through our filter, since $\delta(t)$ is the "identity" function of convolution, i.e. $h(t) = (h \ast \delta)(t)$. | ||||
Clapping your hands or popping a balloon (both good approximations of $\delta$) in a large cathedral will generate a very sophisticated impulse response, which can be recorded and processed in a FIR filter algorithm to reproduce arbitrary sounds as if they were performed in the cathedral. | |||||
Clapping your hands or popping a balloon (both good approximations of $\delta$) in a large cathedral will generate a very sophisticated impulse response, which can be recorded as $h(t)$ and processed in a FIR filter algorithm to reproduce arbitrary sounds as if they were performed in the cathedral. | |||||
Repeating this process in the digital realm gives us the discrete convolution. | Repeating this process in the digital realm gives us the discrete convolution. | ||||
$$ y_k = \sum_{n=-\infty}^\infty h_n x_{k-n} $$ | $$ y_k = \sum_{n=-\infty}^\infty h_n x_{k-n} $$ | ||||
Note that $h_n$ is both non-causal (nonzero for negative $t$ or $n$) and infinitely long, which is addressed later. | |||||
#### Brickwall filter | #### Brickwall filter | ||||
@@ -205,6 +212,13 @@ where $\operatorname{sinc}(x) = \sin(\pi x) / (\pi x)$ is the [normalized sinc f | |||||
Although the impulse response is infinitely long, restricting it to a finite range $[-T, T]$ and shifting it forward by $T$ produces a finite causal impulse response that can be solved by a fast FIR algorithm to produce a close approximation of an ideal brickwall filter. | Although the impulse response is infinitely long, restricting it to a finite range $[-T, T]$ and shifting it forward by $T$ produces a finite causal impulse response that can be solved by a fast FIR algorithm to produce a close approximation of an ideal brickwall filter. | ||||
### Windows | |||||
The impulse response $h_n$ is defined for all integers $n$, so it is both non-causal (requires future knowledge of $x(t)$ to compute $y(t)$) and infinitely long. | |||||
*TODO* | |||||
### To-do | ### To-do | ||||
- digital filters | - digital filters | ||||
@@ -4,8 +4,6 @@ The VCV Rack manual is under active development. | |||||
Edit this manual at https://github.com/VCVRack/manual. | Edit this manual at https://github.com/VCVRack/manual. | ||||
[PDF download](VCV-Rack-manual.pdf) | |||||
### Communities | ### Communities | ||||