BogaudioModules

BogaudioModules for VCV Rack
Log | Files | Refs | README | LICENSE

commit acad9b012127a88b4bcb42e80a79ad69568ee131
parent d1e850eeeba40ec6660bb87474188eeb0036137f
Author: Matt Demanett <matt@demanett.net>
Date:   Thu, 13 Jun 2019 00:23:41 -0400

v1: add script to use new Rack screenshotting feature to compose screenshots for the README.

Diffstat:
MREADME.md | 80++++++++++++++++++++++++++++++++++++++-----------------------------------------
Adoc/rack_background.png | 0
Mdoc/www/effects.png | 0
Mdoc/www/envelopes1.png | 0
Mdoc/www/envelopes2.png | 0
Mdoc/www/lfos.png | 0
Mdoc/www/misc.png | 0
Mdoc/www/mixers1.png | 0
Mdoc/www/mixers2.png | 0
Mdoc/www/modules1.png | 0
Mdoc/www/modules2.png | 0
Mdoc/www/modules3.png | 0
Mdoc/www/modules4.png | 0
Ddoc/www/modules5.png | 0
Ddoc/www/modules6.png | 0
Mdoc/www/noise.png | 0
Mdoc/www/oscillators.png | 0
Mdoc/www/pitch.png | 0
Mdoc/www/sequencers.png | 0
Mdoc/www/utilities.png | 0
Mdoc/www/visualizers.png | 0
Ascripts/make_screenshots.rb | 196+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
22 files changed, 234 insertions(+), 42 deletions(-)

diff --git a/README.md b/README.md @@ -5,9 +5,9 @@ Modules for [VCV Rack](https://github.com/VCVRack/Rack), an open-source Eurorack - [Oscillators](#oscillators) - [LFOs](#lfos) - [Envelopes and Envelope Utilities](#envelopes) - - [Noise/Random, Sample and Hold](#random) - [Mixers, Panners and VCAs](#mixers) - [Effects and Dynamics](#effects) + - [Noise/Random, Sample and Hold](#random) - [Sequential Switches and Sequencers](#sequencers) - [Visualizers](#visualizers) - [Pitch CV Utilities](#pitch) @@ -18,10 +18,6 @@ Modules for [VCV Rack](https://github.com/VCVRack/Rack), an open-source Eurorack ![modules screenshot](./doc/www/modules2.png) -![modules screenshot](./doc/www/modules6.png) - -![modules screenshot](./doc/www/modules5.png) - ![modules screenshot](./doc/www/modules3.png) ![modules screenshot](./doc/www/modules4.png) @@ -181,43 +177,6 @@ An envelope follower, a utility that converts its input to a CV proportional to With DAMP at the minimum setting and SCALE at half, the module is an effective wave rectifier (that is, it outputs the absolute value of the input). -### <a name="random"></a> Noise/Random, Sample and Hold - -![Noise/random screenshot](doc/www/noise.png) - -#### NOISE - -A noise source, in types blue (f), white, pink (1/f), red (aka rown, 1/f^2) and Gauss (normal with mean 0 and variance 1). - -Additionally, NOISE has an absolute value circuit. Patch audio into ABS to get positive CV. For example, patch white noise into ABS to get uniform values in the range 0 to 10. - -#### S&H - -A dual sample-and-hold and trigger-and-hold. Sampling may be triggered by CV (on the rising edge of a trigger or gate) or button press. If nothing is connected to an IN port, sampling for that channel is from an internal white noise source (range 0-10V). - -Each channel can be toggled into track-and-hold mode. In this mode, when the input at GATE is high, or the button is held, the input is copied to the output. When the gate goes low, the input is sampled and held until the next gate. - -#### WALK2 - -WALK2 provides two channels of chaotic CV, where the CV moves as a "random walk". The two outputs are drawn as a trace, in X and Y, on the display. - -For each channel: - - RATE controls how sedately, or wildly, the CV moves around. If CV is in use, it is attenuated by the knob. - - OFFSET adds or subtracts up to 5V from the base +/-5V output. If the offset CV is in use, it is attenuverted by the knob. - - SCALE scales the output; if CV is in use, it is attenuated by the knob. - -Additionally: - - A trigger on the JUMP input will cause both channels to jump to a random value. A bit of slew limitation applies to the jump to minimize popping. - - DIST outputs a third CV, ranging over 0-10V, related the X and Y channel outputs. - -Clicking on the display will jump the outputs, X and Y, to that point (again with a bit of slew limitation). - -Various options on the context (right-click) menu allow customization of the display (set the range of the display to +/-10V instead of the default +/-5V; hide the grid dots; set the color of the trace). - -#### WALK - -WALK is a single-channel random walk, identical to one channel of WALK2, in 3HP. - ### <a name="mixers"></a> Mixers, Panners and VCAs #### MIX8 @@ -360,6 +319,43 @@ In contrast to CLPR, LMTR does not distort the signal (or not much); it just red NSGT is a compact (6HP) [noise gate](https://en.wikipedia.org/wiki/Noise_gate). Its controls behave the same as the corresponding controls on PRESSOR. +### <a name="random"></a> Noise/Random, Sample and Hold + +![Noise/random screenshot](doc/www/noise.png) + +#### NOISE + +A noise source, in types blue (f), white, pink (1/f), red (aka rown, 1/f^2) and Gauss (normal with mean 0 and variance 1). + +Additionally, NOISE has an absolute value circuit. Patch audio into ABS to get positive CV. For example, patch white noise into ABS to get uniform values in the range 0 to 10. + +#### S&H + +A dual sample-and-hold and trigger-and-hold. Sampling may be triggered by CV (on the rising edge of a trigger or gate) or button press. If nothing is connected to an IN port, sampling for that channel is from an internal white noise source (range 0-10V). + +Each channel can be toggled into track-and-hold mode. In this mode, when the input at GATE is high, or the button is held, the input is copied to the output. When the gate goes low, the input is sampled and held until the next gate. + +#### WALK2 + +WALK2 provides two channels of chaotic CV, where the CV moves as a "random walk". The two outputs are drawn as a trace, in X and Y, on the display. + +For each channel: + - RATE controls how sedately, or wildly, the CV moves around. If CV is in use, it is attenuated by the knob. + - OFFSET adds or subtracts up to 5V from the base +/-5V output. If the offset CV is in use, it is attenuverted by the knob. + - SCALE scales the output; if CV is in use, it is attenuated by the knob. + +Additionally: + - A trigger on the JUMP input will cause both channels to jump to a random value. A bit of slew limitation applies to the jump to minimize popping. + - DIST outputs a third CV, ranging over 0-10V, related the X and Y channel outputs. + +Clicking on the display will jump the outputs, X and Y, to that point (again with a bit of slew limitation). + +Various options on the context (right-click) menu allow customization of the display (set the range of the display to +/-10V instead of the default +/-5V; hide the grid dots; set the color of the trace). + +#### WALK + +WALK is a single-channel random walk, identical to one channel of WALK2, in 3HP. + ### <a name="sequencers"></a> Sequential Switches and Sequencers ![Sequencers screenshot](doc/www/sequencers.png) diff --git a/doc/rack_background.png b/doc/rack_background.png Binary files differ. diff --git a/doc/www/effects.png b/doc/www/effects.png Binary files differ. diff --git a/doc/www/envelopes1.png b/doc/www/envelopes1.png Binary files differ. diff --git a/doc/www/envelopes2.png b/doc/www/envelopes2.png Binary files differ. diff --git a/doc/www/lfos.png b/doc/www/lfos.png Binary files differ. diff --git a/doc/www/misc.png b/doc/www/misc.png Binary files differ. diff --git a/doc/www/mixers1.png b/doc/www/mixers1.png Binary files differ. diff --git a/doc/www/mixers2.png b/doc/www/mixers2.png Binary files differ. diff --git a/doc/www/modules1.png b/doc/www/modules1.png Binary files differ. diff --git a/doc/www/modules2.png b/doc/www/modules2.png Binary files differ. diff --git a/doc/www/modules3.png b/doc/www/modules3.png Binary files differ. diff --git a/doc/www/modules4.png b/doc/www/modules4.png Binary files differ. diff --git a/doc/www/modules5.png b/doc/www/modules5.png Binary files differ. diff --git a/doc/www/modules6.png b/doc/www/modules6.png Binary files differ. diff --git a/doc/www/noise.png b/doc/www/noise.png Binary files differ. diff --git a/doc/www/oscillators.png b/doc/www/oscillators.png Binary files differ. diff --git a/doc/www/pitch.png b/doc/www/pitch.png Binary files differ. diff --git a/doc/www/sequencers.png b/doc/www/sequencers.png Binary files differ. diff --git a/doc/www/utilities.png b/doc/www/utilities.png Binary files differ. diff --git a/doc/www/visualizers.png b/doc/www/visualizers.png Binary files differ. diff --git a/scripts/make_screenshots.rb b/scripts/make_screenshots.rb @@ -0,0 +1,196 @@ +#!/usr/bin/env ruby + +# To generate per-modules screenshots, in Rack dir: ./Rack -d -p 1 + +screens = [ + { + file: 'modules1.png', + crop: false, + rows: [ + ['VCO', 'XCO', 'Additator', 'FMOp', '-', 'LFO', 'EightFO', 'LLFO'], + ['DADSRH', 'DADSRHPlus', 'DGate', 'Shaper', 'ShaperPlus', 'AD', 'ADSR', 'Follow'] + ] + }, + { + file: 'modules2.png', + crop: false, + rows: [ + ['Mix8', 'Mix4', 'Mix1', 'VCM', 'Mute8', 'Pan', 'XFade', 'VCA', 'VCAmp'], + ['AMRM', 'Pressor', 'Lmtr', 'Nsgt', 'UMix', 'Matrix88'] + ] + }, + { + file: 'modules3.png', + crop: false, + rows: [ + ['Noise', 'SampleHold', 'Walk2', 'Walk', '-', 'EightOne', 'OneEight', 'AddrSeq'], + ['VU', 'Analyzer', 'AnalyzerXL'] + ] + }, + { + file: 'modules4.png', + crop: false, + rows: [ + ['Detune', 'Stack', 'Reftone', '-', 'Bool', 'Cmp', 'CVD', 'FlipFlop', 'Manual', 'Mult', 'Offset', 'Slew', 'Sums', 'Switch', '-', 'Blank3', 'Blank6'] + ] + }, + + { + file: 'oscillators.png', + crop: true, + rows: [ + ['VCO', 'XCO', 'Additator', 'FMOp'] + ] + }, + { + file: 'lfos.png', + crop: true, + rows: [ + ['LFO', 'EightFO', 'LLFO'] + ] + }, + { + file: 'envelopes1.png', + crop: true, + rows: [ + ['DADSRH', 'DADSRHPlus', 'DGate'] + ] + }, + { + file: 'envelopes2.png', + crop: true, + rows: [ + ['Shaper', 'ShaperPlus', 'AD', 'ADSR', 'Follow'] + ] + }, + { + file: 'noise.png', + crop: true, + rows: [ + ['Noise', 'SampleHold', 'Walk2', 'Walk'] + ] + }, + { + file: 'mixers1.png', + crop: true, + rows: [ + ['Mix8', 'Mix4', 'Mix1'] + ] + }, + { + file: 'mixers2.png', + crop: true, + rows: [ + ['VCM', 'Mute8', 'Pan', 'XFade', 'VCA', 'VCAmp'] + ] + }, + { + file: 'effects.png', + crop: true, + rows: [ + ['AMRM', 'Pressor', 'Lmtr', 'Nsgt', 'UMix', 'Matrix88'] + ] + }, + { + file: 'sequencers.png', + crop: true, + rows: [ + ['EightOne', 'OneEight', 'AddrSeq'] + ] + }, + { + file: 'visualizers.png', + crop: true, + rows: [ + ['VU', 'Analyzer', 'AnalyzerXL'] + ] + }, + { + file: 'pitch.png', + crop: true, + rows: [ + ['Detune', 'Stack', 'Reftone'] + ] + }, + { + file: 'utilities.png', + crop: true, + rows: [ + ['Bool', 'Cmp', 'CVD', 'FlipFlop', 'Manual', 'Mult', 'Offset', 'Slew', 'Sums', 'Switch'] + ] + }, + { + file: 'misc.png', + crop: true, + rows: [ + ['Blank3', 'Blank6'] + ] + } +] + +HP = 15 +PAD_EDGE = 1 * HP +PAD_MODULE = 1 * HP +PAD_GROUP = 3 * HP +OUT_DIR = './doc/www' +BACKGROUND_FILE = './doc/rack_background.png' + +# require 'chunky_png' +require 'oily_png' +require 'pp' + +screens_dir = ARGV[0] +if screens_dir.nil? + STDERR.puts "Usage: #{$0}: <rack screenshot output directory for plugin>" + exit 1 +end + +unless Dir.exists?(screens_dir) + STDERR.puts "No such screenshots directory: #{screens_dir}" + exit 1 +end + +$row_background = nil +def background_for_rows(n) + unless $row_background + background = ChunkyPNG::Image.from_file(BACKGROUND_FILE) + $row_background = background.crop(0, 31, 15 * ((background.dimension.width - 10) / 15), 380) + end + + out = ChunkyPNG::Image.new($row_background.dimension.width, n * $row_background.dimension.height, ChunkyPNG::Color::TRANSPARENT) + (0...n).each do |i| + out.compose!($row_background, 0, i * $row_background.dimension.height) + end + out +end + +screens.each do |screen| + next unless screen + + rows = screen[:rows] + out = background_for_rows(rows.size) + x = 0 + rows.each_with_index do |row, i| + x = PAD_EDGE + row.each_with_index do |item, j| + if item == '-' + x += PAD_GROUP + x -= PAD_MODULE if j > 0 + else + image = ChunkyPNG::Image.from_file(File.join(screens_dir, "Bogaudio-#{item}.png")) + out.compose!(image, x, i * $row_background.dimension.height) + x += image.dimension.width + x += PAD_MODULE + end + end + x -= PAD_MODULE if rows.last.size > 0 + x += PAD_EDGE + end + + out.crop!(0, 0, x, out.dimension.height) if screen[:crop] + + file = File.join(OUT_DIR, screen[:file]) + out.save(file) + puts "wrote #{file}" + # system("open #{file}") +end