├── .github
└── workflows
│ └── zola.yml
├── .gitignore
├── README.md
├── config.toml
├── content
├── _index.md
├── about.md
├── crates.toml
├── formats.toml
└── resources.toml
├── sass
├── _colors.scss
└── main.scss
├── static
├── .gitkeep
├── CNAME
└── media
│ ├── designed-dark.svg
│ ├── designed.svg
│ └── logo.png
├── templates
├── articles
│ ├── index.html
│ └── page.html
├── contributors
│ ├── list.html
│ └── single.html
├── crates
│ ├── list.html
│ └── single.html
├── index.html
├── layout.html
├── macros.html
├── rss.xml
└── topics
│ ├── list.html
│ └── single.html
└── themes
└── .gitkeep
/.github/workflows/zola.yml:
--------------------------------------------------------------------------------
1 | on:
2 | push:
3 | branches:
4 | - master
5 | pull_request:
6 | jobs:
7 | build_and_deploy:
8 | runs-on: ubuntu-latest
9 | if: github.ref == 'refs/heads/master'
10 | steps:
11 | - name: 'Checkout'
12 | uses: actions/checkout@master
13 | - name: 'Build and deploy'
14 | uses: shalzz/zola-deploy-action@master
15 | env:
16 | PAGES_BRANCH: gh-pages
17 | BUILD_DIR: .
18 | TOKEN: ${{ secrets.GITHUB_TOKEN }}
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | public
2 | .DS_Store
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Rust Audio
2 |
3 | This repository contains the code powering https://rust.audio. This website contains information on audio development with the Rust programming language.
4 |
5 | ## Developing & contributing
6 |
7 | Contributions are welcome. This repository uses the [Zola static site generator](https://github.com/getzola/zola). Please check [here](https://www.getzola.org/documentation/getting-started/overview/) for basic Zola documentation.
8 |
9 | ### Conventions
10 |
11 | When possible, try to content conventions from other items on the site. Most important things should be documented in the `toml` or `md` file. Don't worry too much about getting everything right!
12 |
13 | ### Site Layout
14 |
15 | - About rust.audio is in `content/about.md`
16 | - Formats describing e.g. `VST` vs `CLAP` are in `content/formats.toml`.
17 | - Audio resource links are in `resources.toml`.
18 |
19 |
--------------------------------------------------------------------------------
/config.toml:
--------------------------------------------------------------------------------
1 | # The URL the site will be built for
2 | base_url = "https://rust.audio"
3 |
4 | # Whether to automatically compile all Sass files in the sass directory
5 | compile_sass = true
6 | generate_rss = true
7 |
8 | # Whether to do syntax highlighting
9 | # Theme can be customised by setting the `highlight_theme` variable to a theme supported by Gutenberg
10 | highlight_code = true
11 | highlight_theme = "ir-white"
12 |
13 | # Whether to build a search index to be used later on by a JavaScript library
14 | build_search_index = true
15 |
16 | title = "Rust Audio"
17 |
18 | taxonomies = [
19 | ]
20 |
21 | [extra]
22 | logo = "/media/logo.png"
23 | discourse_url = "https://rust-audio.discourse.group/"
24 | repos_url = "https://api.github.com/orgs/RustAudio/repos"
25 | discord_server_id = "590254806208217089"
26 | discord_invite = "https://discord.gg/8qW6q2k"
--------------------------------------------------------------------------------
/content/_index.md:
--------------------------------------------------------------------------------
1 | +++
2 | +++
--------------------------------------------------------------------------------
/content/about.md:
--------------------------------------------------------------------------------
1 | +++
2 | +++
3 |
4 | [rust.audio](https://rust.audio) is a collection of resources dedicated to the development of audio applications in the Rust programming language. These topics vary from general DSP, to synthesis, to plugins and associated crates.
--------------------------------------------------------------------------------
/content/crates.toml:
--------------------------------------------------------------------------------
1 | [[crates]]
2 | key = "fundsp"
3 | source = "crates"
4 | tags = ["DSP"]
5 |
6 | [[crates]]
7 | key = "cpal"
8 | source = "crates"
9 | tags = ["devices"]
10 |
11 | [[crates]]
12 | key = "coremidi"
13 | source = "crates"
14 | tags = ["MIDI"]
15 |
16 | [[crates]]
17 | key = "wrl/baseplug"
18 | source = "github"
19 | tags = ["frameworks","VST2"]
20 |
21 | [[crates]]
22 | key = "RustAudio/baseview"
23 | source = "github"
24 | tags = ["windowing","GUI"]
25 |
26 | [[crates]]
27 | key = "robbert-vdh/nih-plug"
28 | source = "github"
29 | tags = ["frameworks","VST3","CLAP"]
30 |
31 | [[crates]]
32 | key = "glowcoil/clap-sys"
33 | source = "github"
34 | tags = ["bindings","CLAP"]
35 |
36 | [[crates]]
37 | key = "RustyDAW/rusty-daw-io"
38 | source = "github"
39 | tags = ["devices"]
40 |
41 | [[crates]]
42 | key = "RustyDAW/creek"
43 | source = "github"
44 | tags = ["streaming"]
45 |
46 | [[crates]]
47 | key = "MeadowlarkDAW/Meadowlark"
48 | source = "github"
49 | tags = ["DAWs"]
50 |
51 | [[crates]]
52 | key = "WeirdConstructor/HexoSynth"
53 | source = "github"
54 | tags = ["synthesizer", "plugin"]
55 |
56 | [[crates]]
57 | key = "vizia/vizia"
58 | source = "github"
59 | tags = ["GUI", "frameworks"]
60 |
61 | [[crates]]
62 | key = "chaosprint/glicol"
63 | source = "github"
64 | tags = ["languages", "DSP"]
65 |
66 | [[crates]]
67 | key = "rodio"
68 | source = "crates"
69 | tags = ["playback"]
70 |
71 | [[crates]]
72 | key = "kira"
73 | source = "crates"
74 | tags = ["games", "playback"]
75 |
76 | [[crates]]
77 | key = "awedio"
78 | source = "crates"
79 | tags = ["playback", "embedded"]
80 |
81 | [[crates]]
82 | key = "rubato"
83 | source = "crates"
84 | tags = ["resampling", "DSP"]
85 |
86 | [[crates]]
87 | key = "realfft"
88 | source = "crates"
89 | tags = ["FFT", "DSP"]
90 |
91 | [[crates]]
92 | key = "jack"
93 | source = "crates"
94 | tags = ["devices"]
95 |
96 | [[crates]]
97 | key = "alisomay/libpd-rs"
98 | source = "github"
99 | tags = ["languages", "DSP"]
100 |
101 | [[crates]]
102 | key = "rustfft"
103 | source = "crates"
104 | tags = ["FFT", "DSP"]
105 |
106 | [[crates]]
107 | key = "hound"
108 | source = "crates"
109 | tags = ["streaming", "frameworks"]
110 |
111 |
--------------------------------------------------------------------------------
/content/formats.toml:
--------------------------------------------------------------------------------
1 | # Audio plugin formats
2 |
3 | # Format for specifying a format 🤔
4 | #
5 | # ```
6 | # [[formats]]
7 | #
8 | # # Human readable format name
9 | # name = "MyFormatName"
10 | #
11 | # # Link to the homepage
12 | # link = "https://example.com"
13 | #
14 | # # Short synopsis of the format
15 | # description = "This format was designed for Plan9 computers only"
16 | #
17 | # # The license of the format
18 | # license = { name = "MIT", url = "https://example.com/license.html" }
19 | #
20 | # # Optionally, list crates that work with this format
21 | # crates = [
22 | # { name = "plan9-plug", url = "https://example.com/mycoolsite/plan9-plugin" },
23 | # ]
24 | #
25 | # # Optionally, list additional resources on this format
26 | # resources = [
27 | # { name = "My link docs name", url = "http://example.com/docs" },
28 | # ]
29 | # ```
30 |
31 | [[formats]]
32 | name = "VST"
33 | link = "https://steinbergmedia.github.io/vst3_dev_portal/pages/index.html"
34 | description = "VST can refer to several different versions of the VST format by Steinberg. VST2 was one of the most common standards, but is now unlicensed. Instead, VST3 is recommended and is generally supported in most DAWs. Note that the Rust vst3-sys crate currently relies on GPLv3 code."
35 | license = { name = "GPLv3 or Proprietary", url = "https://developer.steinberg.help/pages/viewpage.action?pageId=9797944" }
36 | crates = [
37 | { name = "vst", url = "https://github.com/RustAudio/vst-rs" },
38 | { name = "vst3-sys", url = "https://github.com/RustAudio/vst3-sys" },
39 | ]
40 | resources = []
41 |
42 | [[formats]]
43 | name = "AudioUnit"
44 | link = "https://developer.apple.com/documentation/audiounit/"
45 | description = "AudioUnit (AU) is only available on Apple platforms. AU v2 is simlar to VST, and AU v3 follows an Apple framework approach, which is harder to implement without Apple tools. Currently, no Rust libraries implement the AudioUnit standard."
46 | license = { name = "Proprietary", url = "https://developer.apple.com/licensing-trademarks/audio-units/" }
47 | resources = [
48 | { name = "Rust CoreAudio - AudioUnit struct documentation", url = "http://rustaudio.github.io/coreaudio-rs/coreaudio/audio_unit/struct.AudioUnit.html" },
49 | { name = "Rust CoreAudio - Possibility of creating AU plugins", url = "https://github.com/RustAudio/coreaudio-rs/issues/52" },
50 | { name = "Rust CoreAudio - AudioUnit implementation", url = "https://github.com/RustAudio/coreaudio-rs/blob/master/src/audio_unit/mod.rs" },
51 | { name = "DPlug - AudioUnit implemented in DLang", url = "https://github.com/AuburnSounds/Dplug/tree/master/au/dplug/au" },
52 | ]
53 |
54 | [[formats]]
55 | name = "LV2"
56 | link = "https://lv2plug.in/"
57 | description = "LV2 is only supported on Linux with a few exceptions. One interesting feature is that all LV2 plugin hosts and plugins are backwards compatible with previous versions."
58 | license = { name = "ISC", url = "https://gitlab.com/lv2/lv2/-/blob/master/COPYING" }
59 | crates = [
60 | { name = "rust-lv2", url = "https://github.com/RustAudio/rust-lv2" },
61 | { name = "lv2rs", url = "https://github.com/Janonard/lv2rs" },
62 | ]
63 | resources = [
64 | { name = "LV2 Crate implementation and Design on rust.audio", url = "https://rust-audio.discourse.group/t/lv2-crate-implementation-and-design/71/2" },
65 | ]
66 |
67 | [[formats]]
68 | name = "CLAP"
69 | link = "https://cleveraudio.org/"
70 | description = "CLAP is a relatively new plugin format with permissive licensing. It does not currently have wide support outside of Bitwig."
71 | license = { name = "MIT", url = "https://github.com/free-audio/clap/blob/main/LICENSE" }
72 | crates = [{ name = "clap-lv2", url = "https://github.com/glowcoil/clap-sys" }]
73 |
--------------------------------------------------------------------------------
/content/resources.toml:
--------------------------------------------------------------------------------
1 | # Resources format
2 | #
3 | # ```
4 | # [[resources]]
5 | #
6 | # A descriptive but short name for the resource
7 | # name = "My resource name"
8 | #
9 | # # Link directly to the resource named
10 | # url = "http://www.example.com/dsp.html"
11 | #
12 | # # Avoid creating new categories unless completely necessary
13 | # category = "general"
14 | # ```
15 |
16 | [[resources]]
17 | name = "The Scientist and Engineer's Guide to Digital Signal Processing"
18 | url = "http://www.dspguide.com/"
19 | category = "general"
20 |
21 | [[resources]]
22 | name = "MIT OpenCourseWare: 6.003 Signals and Systems 1"
23 | url = "https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-003-signals-and-systems-fall-2011/"
24 | category = "general"
25 |
26 | [[resources]]
27 | name = "MIT OpenCourseWare: 6.007 Signals and Systems 2"
28 | url = "https://ocw.mit.edu/resources/res-6-007-signals-and-systems-spring-2011/"
29 | category = "general"
30 |
31 | [[resources]]
32 | name = "Audio doghouse"
33 | url = "https://www.objc.io/issues/24-audio/audio-dog-house/"
34 | category = "general"
35 |
36 | [[resources]]
37 | name = "Alias-Free Digital Synthesis of Classic Analog Waveforms (whitepaper)"
38 | url = "https://ccrma.stanford.edu/~stilti/papers/blit.pdf"
39 | category = "bandlimited synthesis"
40 |
41 | [[resources]]
42 | name = "Stefan Stenzel - The amazing usefulness of band limited impulse trains"
43 | url = "https://www.youtube.com/watch?v=lpM4Tawq-XU"
44 | category = "bandlimited synthesis"
45 |
46 | [[resources]]
47 | name = "Interval Tree"
48 | url = "https://en.wikipedia.org/wiki/Interval_tree"
49 | category = "structures and algorithms"
50 |
51 | [[resources]]
52 | name = "Finger Tree"
53 | url = "https://en.wikipedia.org/wiki/Finger_tree"
54 | category = "structures and algorithms"
55 |
56 | [[resources]]
57 | name = "Radix Tree"
58 | url = "https://en.wikipedia.org/wiki/Radix_tree"
59 | category = "structures and algorithms"
60 |
61 | [[resources]]
62 | name = "Persistent Vector"
63 | url = "https://hypirion.com/musings/understanding-persistent-vector-pt-1) (Clojure)"
64 | category = "structures and algorithms"
65 |
66 | [[resources]]
67 | name = "Immutable data structures"
68 | url = "https://www.youtube.com/watch?v=ZsryQp0UAC8) (C++)"
69 | category = "structures and algorithms"
70 |
71 | [[resources]]
72 | name = "Xiph.org digital show-and-tell: Exploring sample rate and bit depth"
73 | url = "https://xiph.org/video/vid2.shtml"
74 | category = "misc"
75 |
--------------------------------------------------------------------------------
/sass/_colors.scss:
--------------------------------------------------------------------------------
1 | $border: #e1d8dd;
2 | $background: #ffffff;
3 | $background-low: #f3f3f3;
4 | $primary: #09184f;
5 | $accent: #0529ab;
6 | $contrast: darken($primary, 10);
7 | $contrast-low: lighten(desaturate($primary, 70), 20);
8 | $shadow: 0px 0px 3px 0px #1110121a;
--------------------------------------------------------------------------------
/sass/main.scss:
--------------------------------------------------------------------------------
1 | @import 'colors';
2 |
3 | .animated-border {
4 | height: 4px;
5 | background: linear-gradient(90deg, #562D6A 0%, #AB3D6A 25%, #562D6A 50%, #AB3D6A 75%, #562D6A 100%);
6 | background-size: 200% 200%;
7 | animation: BorderAnimation 2s linear infinite;
8 | opacity: 0.3;
9 | }
10 |
11 | @keyframes BorderAnimation {
12 | 0% {
13 | background-position: 0% 0%
14 | }
15 |
16 | 100% {
17 | background-position: 100% 0%
18 | }
19 | }
20 |
21 | #slideout-menu {
22 | touch-action: none;
23 | display: fixed;
24 | bottom: 100000px;
25 | }
26 |
27 | nav {
28 | display: flex;
29 | align-items: center;
30 | gap: 1rem;
31 | img {
32 | height: 40px;
33 | }
34 | padding: 1rem;
35 | h3 {margin: 0;}
36 | a {
37 | display: flex;
38 | align-items: center;
39 | gap: 1rem;
40 | }
41 | }
42 |
43 | body {
44 | font-size: 18px;
45 | line-height: 1.5;
46 | font-family: Arial, Helvetica, sans-serif;
47 | background: $background;
48 | margin: 0;
49 | margin-bottom: 8em;
50 | a {text-decoration: none; }
51 | }
52 |
53 | .button {
54 | background: $primary;
55 | font-weight: 700;
56 | padding: 0.5em 1em;
57 | border-radius: 1000px;
58 | color: $background;
59 | display: inline-block;
60 | &:hover {
61 | background: lighten($primary, 5);
62 | }
63 | &:active {
64 | background: lighten($primary, 10);
65 | }
66 | }
67 |
68 | .filters {
69 | margin-bottom: 1em;
70 | }
71 |
72 | .tags {
73 | text-transform: capitalize;
74 | display: flex;
75 | flex-wrap: wrap;
76 | gap: 0.3em;
77 | align-items: flex-start;
78 | }
79 |
80 | .tag {
81 | background: $background-low;
82 | font-weight: 600;
83 | padding: 0.1em 0.6em;
84 | border-radius: 1000px;
85 | color: $contrast-low;
86 | display: inline-block;
87 | border: 1px solid $border;
88 | font-size: 0.8rem;
89 | vertical-align: baseline;
90 | i{height: 0; svg{width:16px}}
91 | cursor: pointer;
92 | &:hover {
93 | background: darken($background-low, 5);
94 | }
95 | &:active {
96 | background: darken($background-low, 10);
97 | }
98 | }
99 |
100 | .tag.toggled {
101 | background: $accent;
102 | border: 1px solid rgba(255, 255, 255, 0.5);
103 | color: $background;
104 | }
105 |
106 | i{
107 | vertical-align: middle;
108 | svg {
109 | width: 24px;
110 | }
111 | }
112 |
113 | .container {
114 | max-width: 800px;
115 | width: 100%;
116 | margin: 0 auto;
117 | padding: 0 1rem;
118 | box-sizing: border-box;
119 | }
120 |
121 | .container-full {
122 | width: 100%;
123 | box-sizing: border-box;
124 | padding: 0 1rem;
125 |
126 | }
127 |
128 | .hide-small {
129 | @media screen and (max-width: 700px) {
130 | display: none;
131 | }
132 | }
133 |
134 | hr {
135 | border: 1px solid $border;
136 | margin: 3em 0;
137 | }
138 |
139 | h1,h2,h3,h4,h5,h6,pre {
140 | margin: 0.2em 0;
141 | }
142 |
143 | h1 { font-size: 3rem; }
144 | h2 { font-size: 2.5rem; }
145 | h3 { font-size: 2rem; }
146 | h4 { font-size: 1.5rem; }
147 | h5 { font-size: 1rem; }
148 | h6 { font-size: 0.75rem; }
149 |
150 | article {
151 | h1 { font-size: 2.5rem; }
152 | h2 { font-size: 2rem; }
153 | h3 { font-size: 1.5rem; }
154 | h4 { font-size: 1.2rem; }
155 | h5 { font-size: 0.8rem; }
156 | h6 { font-size: 0.6rem; }
157 | }
158 |
159 | article {
160 | pre {
161 | white-space: pre-wrap;
162 | word-break: break-word;
163 | }
164 |
165 | >blockquote {
166 | &:before {
167 | content: "◈";
168 | vertical-align: -0.1em;
169 | }
170 | p {
171 | display: inline;
172 | }
173 | }
174 | }
175 |
176 | p,
177 | ul,
178 | li {
179 | a {
180 | text-decoration: none;
181 | font-weight: normal;
182 | }
183 | }
184 |
185 | section {
186 | margin: 4em 0;
187 | }
188 |
189 | .crates {
190 | display: grid;
191 | grid-template-columns: 1fr 1fr 1fr 1fr;
192 | @media screen and (max-width: 960px) {
193 | grid-template-columns: 1fr 1fr 1fr;
194 | }
195 | @media screen and (max-width: 720px) {
196 | grid-template-columns: 1fr 1fr;
197 | }
198 | @media screen and (max-width: 500px) {
199 | grid-template-columns: 1fr;
200 | }
201 | h4 {
202 | margin: 0;
203 | }
204 | .crate {
205 | border-top: 1px $border solid;
206 | display: flex;
207 | flex-direction: column;
208 | padding: 1em;
209 | gap: 0.4em 1em;
210 | .details {
211 | display: flex;
212 | gap: 0.5em;
213 | align-items: center;
214 | }
215 | p, pre {
216 | margin: 0;
217 | font-size: 0.8em;
218 | line-height: 1.4;
219 | }
220 |
221 | }
222 | }
--------------------------------------------------------------------------------
/static/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RustAudio/website/c2036237be42a0ef8699ad8e1b193ab12d0ccfbc/static/.gitkeep
--------------------------------------------------------------------------------
/static/CNAME:
--------------------------------------------------------------------------------
1 | rust.audio
--------------------------------------------------------------------------------
/static/media/designed-dark.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/media/designed.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/media/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RustAudio/website/c2036237be42a0ef8699ad8e1b193ab12d0ccfbc/static/media/logo.png
--------------------------------------------------------------------------------
/templates/articles/index.html:
--------------------------------------------------------------------------------
1 | {% extends "layout.html" %}
2 | {% import "macros.html" as m %}
3 |
4 | {% block content %}
5 | {% endblock content %}
--------------------------------------------------------------------------------
/templates/articles/page.html:
--------------------------------------------------------------------------------
1 | {% extends "layout.html" %}
2 | {% import "macros.html" as m %}
3 |
4 | {% block content %}
5 | {{ page.title }}
7 | {{ page.content | safe }}
8 |
{{c.description}}
14 | {% endif %} 15 | 16 | {% if c.updated_at %} 17 |Updated at {{c.updated_at | date(format="%Y-%m-%d %H:%M%Z")}}
18 | {% endif %} 19 | 20 | {% if c.documentation %} 21 |22 | 23 | Documentation 24 | 25 |
26 | {% endif %} 27 |Join Rust Audio on Discord to keep up with audio development within the Rust ecosystem, get help with 29 | DSP, collaborate on projects, and everything in-between. 30 | 31 | Join 32 | Discord 33 |
34 |{{ name }}81 |
{{ description }}
84 | 85 | 90 | {#{{ crate.name }}105 |
{{format.name}}130 | 131 |
{{format.description}}
142 | 143 | {% if format.resources %} 144 |