Install ToobAmp files; uninstall cleanup.

This commit is contained in:
Robin Davies
2022-03-04 20:53:06 -05:00
parent 627f25ebf0
commit 36fefbaf23
85 changed files with 5440 additions and 33 deletions
+11 -1
View File
@@ -16,7 +16,14 @@ add_subdirectory("react")
add_subdirectory("src")
# select LV2 source directory for the current build architecture
message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}")
set(LV2_SOURCE_DIRECTORY ${PROJECT_SOURCE_DIR}/lv2/${CMAKE_SYSTEM_PROCESSOR})
if (NOT EXISTS ${LV2_SOURCE_DIRECTORY})
message(FATAL_ERROR "Lv2 Binaries for architecture '${CMAKE_SYSTEM_PROCESSOR}' have not been provisioned. See lv2/Readme.md")
endif()
# add_subdirectory("test")
# add_test(NAME Test COMMAND piddletest)
@@ -42,6 +49,9 @@ install (FILES ${PROJECT_SOURCE_DIR}/src/template.service
${PROJECT_SOURCE_DIR}/src/templateJack.service
DESTINATION /etc/pipedal )
install (DIRECTORY ${LV2_SOURCE_DIRECTORY}
DESTINATION /usr/lib/liv2
)
install(CODE
[[
file(GET_RUNTIME_DEPENDENCIES
@@ -71,7 +81,7 @@ set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_CURRENT_SOURCE_DIR}/debian/postinst;${CMAKE_CURRENT_SOURCE_DIR}/debian/postinst")
set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_CURRENT_SOURCE_DIR}/debian/postinst;${CMAKE_CURRENT_SOURCE_DIR}/debian/prerm")
include(CPack)
+5
View File
@@ -0,0 +1,5 @@
This folder contains pre-built binaries for an initial bundle of Lv2 plugins.
This arrangment is temporary, and is expected to go away, once a reliable distribution
of this project and the ToobAmp project via apt can be arranged.
+224
View File
@@ -0,0 +1,224 @@
@prefix doap: <http://usefulinc.com/ns/doap#> .
@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix units: <http://lv2plug.in/ns/extensions/units#> .
@prefix urid: <http://lv2plug.in/ns/ext/urid#> .
@prefix atom: <http://lv2plug.in/ns/ext/atom#> .
@prefix midi: <http://lv2plug.in/ns/ext/midi#> .
@prefix epp: <http://lv2plug.in/ns/ext/port-props#> .
@prefix uiext: <http://lv2plug.in/ns/extensions/ui#> .
@prefix idpy: <http://harrisonconsoles.com/lv2/inlinedisplay#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix mod: <http://moddevices.com/ns/mod#> .
@prefix param: <http://lv2plug.in/ns/ext/parameters#> .
@prefix work: <http://lv2plug.in/ns/ext/worker#> .
@prefix atom: <http://lv2plug.in/ns/ext/atom#> .
@prefix patch: <http://lv2plug.in/ns/ext/patch#> .
@prefix plug: <http://two-play.com/plugins/toob-cab-sim#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix state: <http://lv2plug.in/ns/ext/state#> .
@prefix urid: <http://lv2plug.in/ns/ext/urid#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
<http://two-play.com/plugins/toob#frequencyResponseVector>
a lv2:Parameter ;
rdfs:label "frequencyResponseVector" ;
rdfs:range atom:Vector .
<http://two-play.com/plugins/toob-cab-sim#uiState>
a lv2:Parameter ;
rdfs:label "uiState" ;
rdfs:range atom:Vector .
<http://two-play.com/rerdavies#me>
a foaf:Person ;
foaf:name "Robin Davies" ;
foaf:mbox <mailto:rerdavies@gmail.com> ;
foaf:homepage <http://two-play.com/> .
<http://two-play.com/plugins/toob-cab-sim>
a lv2:Plugin ,
lv2:SimulatorPlugin ;
doap:name "TooB Cab Simulator" ,
"TooB Cab Simulator"@en-gb-gb
;
doap:license <https://two-play.com/TooB/licenses/isc> ;
doap:maintainer <http://two-play.com/rerdavies#me> ;
lv2:minorVersion 0 ;
lv2:microVersion 13 ;
rdfs:comment "TooB amplifier cabinet simulator." ;
mod:brand "TooB";
mod:label "Cab Simulator";
lv2:requiredFeature urid:map ;
lv2:optionalFeature lv2:hardRTCapable;
lv2:extensionData state:interface;
patch:readable
<http://two-play.com/plugins/toob#frequencyResponseVector>,
<http://two-play.com/plugins/toob-cab-sim#uiState>;
rdfs:comment """
The TooB Cabinet simulator provides EQ tools for emulating cabinet response. See the presets for
emulations of well-known cabinets.
The TooB Cabinet Simulator is part of the TooB Amp Emulation Toolkit. Typically, you would
use the following plugins in the following order:
- TooB Input Stage
- TooB Tone Stack
- Toob Power Stage
- Toob Cabinet Simulator
""";
lv2:port
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 0 ;
lv2:symbol "locut" ;
lv2:name "Lo Cut";
lv2:default 120.0 ;
lv2:minimum 30.0 ;
lv2:maximum 300.0 ;
units:unit units:hz ;
lv2:scalePoint [
rdfs:label "30Hz" ;
rdf:value 30.0
], [
rdfs:label "300Hz" ;
rdf:value 300
];
rdfs:comment "Low cutoff frequency. 30hz to 300hz. Set to minimum to disable." ;
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 1 ;
lv2:symbol "bright" ;
lv2:name "Bright";
lv2:default 0.0 ;
lv2:minimum 0.0 ;
lv2:maximum 20.0 ;
units:unit units:db;
lv2:scalePoint [
rdfs:label "0dB" ;
rdf:value 0.0
] , [
rdfs:label "10dB" ;
rdf:value 10
] , [
rdfs:label "20dB" ;
rdf:value 20
];
rdfs:comment "Bright boost (0db to 20db)." ;
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 2 ;
lv2:symbol "brightf" ;
lv2:name "BrightF";
lv2:default 1300.0 ;
lv2:minimum 1000.0 ;
lv2:maximum 5000.0;
units:unit units:hz;
lv2:designation param:cutoffFrequency ;
rdfs:comment "Bright boost frequency. (1khz to 8khz)" ;
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 3 ;
lv2:symbol "hicut" ;
lv2:name "Hi Cut";
lv2:default 6000.0 ;
lv2:minimum 2000.0 ;
lv2:maximum 13000.0;
units:unit units:hz;
lv2:portProperty epp:logarithmic;
lv2:designation param:cutoffFrequency ;
rdfs:comment "Hi cutoff frequency. 2khz to 13khz. Set to maximum to disable." ;
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 4 ;
lv2:symbol "comb" ;
lv2:name "Comb";
lv2:default 0.0 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0;
rdfs:comment "Amount of comb filtering. 0 to 1. Set to minimum to disable." ;
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 5 ;
lv2:symbol "combf" ;
lv2:name "Comb F";
lv2:default 2000.0 ;
lv2:minimum 1000.0 ;
lv2:maximum 8000.0;
units:unit units:hz;
lv2:designation param:cutoffFrequency ;
rdfs:comment "Comb filter frequency. (1khz to 8khz)" ;
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 6 ;
lv2:symbol "trim" ;
lv2:name "Trim";
lv2:default 0.0 ;
lv2:minimum -30.0 ;
lv2:maximum 30.0;
units:unit units:db;
rdfs:comment "Master volume trim. (-30db to + 30db)" ;
],
[
a lv2:AudioPort ,
lv2:InputPort ;
lv2:index 7 ;
lv2:symbol "in" ;
lv2:name "In"
] ,
[
a lv2:AudioPort ,
lv2:OutputPort ;
lv2:index 8 ;
lv2:symbol "out" ;
lv2:name "Out"
], [
a atom:AtomPort ,
lv2:InputPort;
atom:bufferType atom:Sequence ;
atom:supports patch:Message;
lv2:designation lv2:control ;
lv2:index 9 ;
lv2:symbol "control" ;
lv2:name "Control" ;
rdfs:comment "Plugin to GUI communication" ;
] , [
a atom:AtomPort ,
lv2:OutputPort ;
atom:bufferType atom:Sequence ;
atom:supports patch:Message;
lv2:designation lv2:control ;
lv2:index 10 ;
lv2:symbol "notify" ;
lv2:name "Notify" ;
rdfs:comment "Plugin to GUI communication" ;
]
.
+267
View File
@@ -0,0 +1,267 @@
@prefix doap: <http://usefulinc.com/ns/doap#> .
@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix units: <http://lv2plug.in/ns/extensions/units#> .
@prefix urid: <http://lv2plug.in/ns/ext/urid#> .
@prefix atom: <http://lv2plug.in/ns/ext/atom#> .
@prefix midi: <http://lv2plug.in/ns/ext/midi#> .
@prefix epp: <http://lv2plug.in/ns/ext/port-props#> .
@prefix uiext: <http://lv2plug.in/ns/extensions/ui#> .
@prefix idpy: <http://harrisonconsoles.com/lv2/inlinedisplay#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix mod: <http://moddevices.com/ns/mod#> .
@prefix param: <http://lv2plug.in/ns/ext/parameters#> .
@prefix work: <http://lv2plug.in/ns/ext/worker#> .
@prefix atom: <http://lv2plug.in/ns/ext/atom#> .
@prefix patch: <http://lv2plug.in/ns/ext/patch#> .
@prefix plug: <http://two-play.com/plugins/toob-input_stage#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix state: <http://lv2plug.in/ns/ext/state#> .
@prefix urid: <http://lv2plug.in/ns/ext/urid#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix pg: <http://lv2plug.in/ns/ext/port-groups#> .
@prefix inputStage: <http://two-play.com/plugins/toob-input_stage#> .
<http://two-play.com/plugins/toob#frequencyResponseVector>
a lv2:Parameter ;
rdfs:label "frequencyResponseVector" ;
rdfs:range atom:Vector .
<http://two-play.com/plugins/toob-input_stage#uiState>
a lv2:Parameter ;
rdfs:label "uiState" ;
rdfs:range atom:Vector .
<http://two-play.com/rerdavies#me>
a foaf:Person ;
foaf:name "Robin Davies" ;
foaf:mbox <mailto:rerdavies@gmail.com> ;
foaf:homepage <http://two-play.com/> .
inputStage:filterGroup
a param:ControlGroup ,
pg:InputGroup ;
lv2:name "EQ" ;
lv2:symbol "filter" .
<http://two-play.com/plugins/toob-input_stage>
a lv2:Plugin ,
lv2:SimulatorPlugin ;
doap:name "TooB Input Stage" ,
"TooB Input Stage"@en-gb-gb
;
doap:license <https://two-play.com/TooB/licenses/isc> ;
doap:maintainer <http://two-play.com/rerdavies#me> ;
lv2:minorVersion 0 ;
lv2:microVersion 13 ;
mod:brand "TooB";
mod:label "Input Stage";
lv2:requiredFeature urid:map ;
lv2:optionalFeature lv2:hardRTCapable;
lv2:extensionData state:interface;
patch:readable
<http://two-play.com/plugins/toob#frequencyResponseVector>,
<http://two-play.com/plugins/toob-input_stage#uiState>;
rdfs:comment """
TooB Input Stage provides basic tools for trimming and shaping guitar input signals
before feeding them through amp emulations.
Components in the TooB Amp Emulation Toolkit expect guitar signal levels to be nominally close
to zero db. Use the Trim control to get your input signal into a reasonable range (ideally, into
the yellow range on the VU, but not going above zero dB).
In some cases, you can reduce noise in your guitar signal by filtering out low and high frequencies.
Use the Low and Hi Cut controls to remove unnecessary frequencies. Set the Lo Cut to minimum value
to disable the Low Cut filter. Se the Hi Cut control to maximum value to disable the Hi Cut filter.
Bright EQ settings allow boosting of high frequencies to simulate the bright input jack
found on many guitar amps.
The GateT control provides a noise gate. Set to minimum value to disable.
The Boost control allows simulation of overdriven input stages. Use judiciously. Heavy overdrive
effects are better implemented in the TooB Power Stage.
The TooB Input Stage is part of the TooB Amp Emulation Toolkit. Typically, you would
use the following plugins in the following order.
- TooB Input Stage
- TooB Tone Stack
- Toob Power Stage
- Toob Cabinet Simulator
""";
lv2:port
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 0 ;
lv2:symbol "trim" ;
lv2:name "Trim";
lv2:default 0.0 ;
lv2:minimum -60.0 ;
lv2:maximum 30.0 ;
units:unit units:db ;
lv2:scalePoint [
rdfs:label "+30dB" ;
rdf:value 20.0
] , [
rdfs:label "-INF" ;
rdf:value -60.0
]
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 1 ;
pg:group inputStage:filterGroup ;
lv2:symbol "locut" ;
lv2:name "Lo Cut";
lv2:default 120.0 ;
lv2:minimum 30.0 ;
lv2:maximum 300.0 ;
units:unit units:hz;
lv2:designation param:cutoffFrequency ;
lv2:scalePoint [
rdfs:label "OFF" ;
rdf:value 30.0
];
rdfs:comment "Low cutoff frequency"
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 2 ;
pg:group inputStage:filterGroup ;
lv2:symbol "bright" ;
lv2:name "Bright";
lv2:default 0.0 ;
lv2:minimum 0.0 ;
lv2:maximum 25.0 ;
units:unit units:db;
lv2:scalePoint [
rdfs:label "OFF" ;
rdf:value 0.0
];
rdfs:comment "Boost high frequencies." ;
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 3 ;
pg:group inputStage:filterGroup ;
lv2:symbol "brightf" ;
lv2:name "Bright F";
lv2:default 1300.0 ;
lv2:minimum 1000.0 ;
lv2:maximum 5000.0;
units:unit units:hz;
lv2:designation param:cutoffFrequency ;
lv2:scalePoint [
rdfs:label "OFF" ;
rdf:value 0.0
];
rdfs:comment "Bright frequency." ;
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 4 ;
pg:group inputStage:filterGroup ;
lv2:symbol "hicut" ;
lv2:name "Hi Cut";
lv2:default 6000.0 ;
lv2:minimum 2000.0 ;
lv2:maximum 13000.0;
units:unit units:hz;
lv2:portProperty epp:logarithmic;
lv2:designation param:cutoffFrequency ;
lv2:scalePoint[
rdfs:label "OFF" ;
rdf:value 13000.0
];
rdfs:comment "Hi cutoff frequency." ;
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 5 ;
lv2:symbol "gate_t" ;
lv2:name "Gate T";
lv2:default -80.0 ;
lv2:minimum -80.0 ;
lv2:maximum -20.0;
units:unit units:db;
lv2:scalePoint [
rdfs:label "OFF" ;
rdf:value -80.0
];
rdfs:comment "Noise gate threshold. Zero to disable." ;
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 6 ;
lv2:symbol "boost" ;
lv2:name "Boost";
lv2:default 0.0 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0;
units:unit units:db;
lv2:scalePoint [
rdfs:label "OFF" ;
rdf:value 0.0
];
rdfs:comment "Simulate overdriving the input buffer." ;
],
[
a lv2:AudioPort ,
lv2:InputPort ;
lv2:index 7 ;
lv2:symbol "in" ;
lv2:name "In"
] , [
a lv2:AudioPort ,
lv2:OutputPort ;
lv2:index 8 ;
lv2:symbol "out" ;
lv2:name "Out"
],[
a atom:AtomPort ,
lv2:InputPort;
atom:bufferType atom:Sequence ;
atom:supports patch:Message;
lv2:designation lv2:control ;
lv2:index 9 ;
lv2:symbol "control" ;
lv2:name "Control" ;
rdfs:comment "Plugin to GUI communication" ;
] , [
a atom:AtomPort ,
lv2:OutputPort ;
atom:bufferType atom:Sequence ;
atom:supports patch:Message;
lv2:designation lv2:control ;
lv2:index 10 ;
lv2:symbol "notify" ;
lv2:name "Notify" ;
rdfs:comment "Plugin to GUI communication" ;
]
.
+624
View File
@@ -0,0 +1,624 @@
@prefix doap: <http://usefulinc.com/ns/doap#> .
@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix units: <http://lv2plug.in/ns/extensions/units#> .
@prefix urid: <http://lv2plug.in/ns/ext/urid#> .
@prefix atom: <http://lv2plug.in/ns/ext/atom#> .
@prefix midi: <http://lv2plug.in/ns/ext/midi#> .
@prefix epp: <http://lv2plug.in/ns/ext/port-props#> .
@prefix uiext: <http://lv2plug.in/ns/extensions/ui#> .
@prefix idpy: <http://harrisonconsoles.com/lv2/inlinedisplay#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix mod: <http://moddevices.com/ns/mod#> .
@prefix param: <http://lv2plug.in/ns/ext/parameters#> .
@prefix work: <http://lv2plug.in/ns/ext/worker#> .
@prefix pg: <http://lv2plug.in/ns/ext/port-groups#> .
@prefix atom: <http://lv2plug.in/ns/ext/atom#> .
@prefix patch: <http://lv2plug.in/ns/ext/patch#> .
@prefix plug: <http://two-play.com/plugins/toob-power-stage#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix state: <http://lv2plug.in/ns/ext/state#> .
@prefix urid: <http://lv2plug.in/ns/ext/urid#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix modgui: <http://moddevices.com/ns/modgui#> .
@prefix pstage: <http://two-play.com/plugins/toob-power-stage#> .
pstage:stage1
a param:ControlGroup ,
pg:InputGroup ;
lv2:name "Stage 1" ;
lv2:symbol "stage1" .
pstage:stage2
a param:ControlGroup ,
pg:InputGroup ;
lv2:name "Stage 2" ;
lv2:symbol "stage2" .
pstage:stage3
a param:ControlGroup ,
pg:InputGroup ;
lv2:name "Stage 3" ;
lv2:symbol "stage3" .
<http://two-play.com/plugins/toob-power-stage#uiState>
a lv2:Parameter ;
rdfs:label "uiState" ;
rdfs:range atom:Vector .
<http://two-play.com/rerdavies#me>
a foaf:Person ;
foaf:name "Robin Davies" ;
foaf:mbox <mailto:rerdavies@gmail.com> ;
foaf:homepage <http://two-play.com/> .
<http://two-play.com/plugins/toob-power-stage>
a lv2:Plugin ,
lv2:SimulatorPlugin ;
doap:name "TooB Power Stage";
doap:license <https://two-play.com/TooB/licenses/isc> ;
doap:maintainer <http://two-play.com/rerdavies#me> ;
lv2:minorVersion 0 ;
lv2:microVersion 15 ;
mod:brand "TooB";
mod:label "Power Stage";
lv2:requiredFeature urid:map ;
lv2:optionalFeature lv2:hardRTCapable;
lv2:extensionData state:interface;
patch:readable
<http://two-play.com/plugins/toob-power-stage#uiState>;
rdfs:comment """
The TooB Power Stage provides flexible and nuanced emulations of guitar amp power stages.
The goal of TooB Power Stage is not to inflexibly emulate existing tube power stages, but instead,
to be better.
TooB Power Stage provides 3 consecutive gain stages, each of which can be overdriven to varying
degrees. Power transformer sag is emulated using the SAG and SAGD controls, which emulate the
volume and distortion effects introduced when power transformer voltage sags.
Each gain section expects an input level that is nominally in the range of 12db to 0db.
It's ok if the levels are slightly over 0db, but they should not be massively over. Use the
Trim control to adjust input signal levels.
The Gain controls use oversampled atan wave shaping to emulate the effect of overdriving
gain stages. Atan wave shaping provides rich even-order harmonics similar to those produced by a tube
amp power stage. A modest amount of gain will produce the characteristically "warm" sound of a tube
gain stage. More extreme settings produce harder overdrive.
Judicious use of the LO CUT and HI CUT controls have interesting and subtle effects on the overall sound.
You are encouraged to play with these controls to see what happens. Tightening up low and high frequencies,
in early gain sections can allow you to drive the signal much harder in later gain sections without totally
breaking up. Real amps will usually cut low frequency response at somewhere between 80Hz (Fender)
and 140Hz (Marshall).
General experience seems to suggest that gradually increasing the gain in each section allows you to drive
the signal harder without introducing undesirable effects in the output. However, there definitely interesting
and subtle differences in tone that can be acheived by not adhering to that rule of thumb.
The SAG and SAGD controls are important controls. You need to undertand how they work. SAG controls how much
the overall volume of the output decreases as the transform sags. It provides the subtle "compression" that
tube amps provide, which is quite different from the compression provided by compressors. SAGD controls
the amount of additional distortion that occurs as the gain stages receive reduced voltage. It provides
the "forgiveness" of a good tube amp. Specifically, because SAGD operates in a feedback loop that runs through
all three gain stages. Increasing the distortion in the gain stages increases the power use of the gain stages;
increasing the power use of the gain stages increases the effect of SAG and SAGD which has an opposing effect
on power use. The net result is that using SAG and SAGD causes signals to break up more gradually
(hence the perceived "forgiveness"). The effects are non-linear, so not easy to describe completely. You
are strongly urged to experiment with SAG and SAGD settings in order to get best tone results.
The TooB Power Stage design is based on an experimental design, that unexpectedly produced extraordinarily
good amp tones. To be perfectly honest, we have not completely explored the sonic possibilities of the
TooB Power Stage. What's known so far: it produces exceptionally pretty clean tones; it can be driven really
hard, and seems to preserve an unusual amount of detail in the signal even when being driven hard; and it
can definitely produce signals that have many of the most prized features of tube amplifiers: warmth, detail,
subtle "compression" without coloration, and forgiving break up.
Explore!
The TooB Input Stage is part of the TooB Amp Emulation Toolkit. Typically, you would
use the following plugins in the following order.
- TooB Input Stage
- TooB Tone Stack
- Toob Power Stage
- Toob Cabinet Simulator
""";
lv2:port
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 0 ;
pg:group pstage:stage1 ;
lv2:symbol "trim1" ;
lv2:name "Trim";
lv2:default 0.0 ;
lv2:minimum -20.0 ;
lv2:maximum 20.0 ;
units:unit units:db ;
lv2:scalePoint [
rdfs:label "+20" ;
rdf:value 20.0
] , [
rdfs:label "+10" ;
rdf:value 10.0
] , [
rdfs:label "0" ;
rdf:value 0.0
] , [
rdfs:label "-10" ;
rdf:value -10.0
], [
rdfs:label "-20" ;
rdf:value -20.0
];
rdfs:comment "Trim input level (stage 1)" ;
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 1 ;
pg:group pstage:stage1 ;
lv2:symbol "gain1" ;
lv2:name "Gain";
lv2:default 0.0 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0 ;
rdfs:comment "Gain (stage 1)"
],
[
a lv2:InputPort ,
lv2:ControlPort ;
pg:group pstage:stage1 ;
lv2:index 2 ;
lv2:symbol "shape1" ;
lv2:name "Shape1";
lv2:default 0.0 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0;
lv2:rangeStep 2;
lv2:portProperty lv2:enumeration ;
rdfs:comment "Wave Shape" ;
lv2:scalePoint [
rdfs:label "atan" ;
rdf:value 0.0
],
[
rdfs:label "triode" ;
rdf:value 1.0
]
],
[
a lv2:InputPort ,
lv2:ControlPort ;
pg:group pstage:stage1 ;
lv2:index 3 ;
lv2:symbol "bias1" ;
lv2:name "Bias1";
lv2:default 0.0 ;
lv2:minimum -2.0 ;
lv2:maximum 2.0;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 4 ;
pg:group pstage:stage1 ;
lv2:symbol "locut1" ;
lv2:name "Lo Cut";
lv2:default 30.0 ;
lv2:minimum 30.0 ;
lv2:maximum 300.0 ;
units:unit units:hz;
lv2:designation param:cutoffFrequency ;
lv2:scalePoint [
rdfs:label "OFF" ;
rdf:value 30.0
];
rdfs:comment "Low frequency cutoff (stage 1). Set to minimum to disable." ;
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 5 ;
pg:group pstage:stage1 ;
lv2:symbol "hicut1" ;
lv2:name "Hi Cut";
lv2:default 19000.0 ;
lv2:minimum 1000.0 ;
lv2:maximum 19000.0;
units:unit units:hz;
lv2:designation param:cutoffFrequency ;
lv2:scalePoint [
rdfs:label "OFF" ;
rdf:value 19000.0
];
rdfs:comment "High cutoff frequency (stage 1). Set to maximum to disable." ;
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 6 ;
pg:group pstage:stage2 ;
lv2:symbol "gain2_enable" ;
lv2:name "Enable2";
lv2:default 1 ;
lv2:minimum 0 ;
lv2:maximum 1;
lv2:portProperty lv2:toggled ;
rdfs:comment "Enable gain stage 2" ;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 7 ;
pg:group pstage:stage2 ;
lv2:symbol "trim2" ;
lv2:name "Trim";
lv2:default 0.0 ;
lv2:minimum -20.0 ;
lv2:maximum 20.0 ;
units:unit units:db ;
lv2:scalePoint [
rdfs:label "+20" ;
rdf:value 20.0
] , [
rdfs:label "+10" ;
rdf:value 10.0
] , [
rdfs:label "0" ;
rdf:value 0.0
] , [
rdfs:label "-10" ;
rdf:value -10.0
], [
rdfs:label "-20" ;
rdf:value -20.0
];
rdfs:comment "Trim input (stage 2)" ;
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 8 ;
pg:group pstage:stage2 ;
lv2:symbol "gain2" ;
lv2:name "Gain";
lv2:default 0.0 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0 ;
rdfs:comment "Gain (stage 2)"
],
[
a lv2:InputPort ,
lv2:ControlPort ;
pg:group pstage:stage2 ;
lv2:index 9 ;
lv2:symbol "shape2" ;
lv2:name "Shape2";
lv2:default 0.0 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0;
lv2:rangeStep 2;
lv2:portProperty lv2:enumeration ;
rdfs:comment "Wave Shape" ;
lv2:scalePoint [
rdfs:label "atan" ;
rdf:value 0.0
],
[
rdfs:label "triode" ;
rdf:value 1.0
]
],
[
a lv2:InputPort ,
lv2:ControlPort ;
pg:group pstage:stage2 ;
lv2:index 10 ;
lv2:symbol "bias2" ;
lv2:name "Bias2";
lv2:default 0.0 ;
lv2:minimum -2.0 ;
lv2:maximum 2.0;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 11 ;
pg:group pstage:stage2 ;
lv2:symbol "locut2" ;
lv2:name "Lo Cut";
lv2:default 30.0 ;
lv2:minimum 30.0 ;
lv2:maximum 300.0 ;
units:unit units:hz;
lv2:designation param:cutoffFrequency ;
lv2:scalePoint [
rdfs:label "OFF" ;
rdf:value 30.0
]
;
rdfs:comment "Low frequency cutoff (stage 2). Set to minimum to disable." ;
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 12 ;
pg:group pstage:stage2 ;
lv2:symbol "hicut2" ;
lv2:name "Hi Cut";
lv2:default 19000.0 ;
lv2:minimum 1000.0 ;
lv2:maximum 19000.0;
units:unit units:hz;
lv2:designation param:cutoffFrequency ;
lv2:scalePoint [
rdfs:label "OFF" ;
rdf:value 19000.0
];
rdfs:comment "High cutoff frequency (stage 2). Set to maximum to disable." ;
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 13 ;
pg:group pstage:stage3 ;
lv2:symbol "gain3_enable" ;
lv2:name "Enable3";
lv2:default 1 ;
lv2:minimum 0 ;
lv2:maximum 1;
lv2:portProperty lv2:toggled ;
rdfs:comment "Enable gain stage 3" ;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 14 ;
pg:group pstage:stage3 ;
lv2:symbol "trim3" ;
lv2:name "Trim";
lv2:default 0.0 ;
lv2:minimum -20.0 ;
lv2:maximum 20.0 ;
units:unit units:db ;
lv2:scalePoint [
rdfs:label "+20" ;
rdf:value 20.0
] , [
rdfs:label "+10" ;
rdf:value 10.0
] , [
rdfs:label "0" ;
rdf:value 0.0
] , [
rdfs:label "-10" ;
rdf:value -10.0
], [
rdfs:label "-20" ;
rdf:value -20.0
];
rdfs:comment "Trim input level (stage 3)." ;
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 15 ;
pg:group pstage:stage3 ;
lv2:symbol "gain3" ;
lv2:name "Gain";
lv2:default 0.0 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0 ;
rdfs:comment "Gain (stage 3)."
],
[
a lv2:InputPort ,
lv2:ControlPort ;
pg:group pstage:stage3 ;
lv2:index 16 ;
lv2:symbol "shape3" ;
lv2:name "Shape3";
lv2:default 0.0 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0;
lv2:rangeStep 2;
lv2:portProperty lv2:enumeration ;
rdfs:comment "Wave Shape" ;
lv2:scalePoint [
rdfs:label "atan" ;
rdf:value 0.0
],
[
rdfs:label "triode" ;
rdf:value 1.0
]
],
[
a lv2:InputPort ,
lv2:ControlPort ;
pg:group pstage:stage3 ;
lv2:index 17 ;
lv2:symbol "bias3" ;
lv2:name "Bias3";
lv2:default 0.0 ;
lv2:minimum -2.0 ;
lv2:maximum 2.0;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 18 ;
pg:group pstage:stage3 ;
lv2:symbol "locut3" ;
lv2:name "Lo Cut";
lv2:default 30.0 ;
lv2:minimum 30.0 ;
lv2:maximum 300.0 ;
units:unit units:hz;
lv2:designation param:cutoffFrequency ;
lv2:scalePoint [
rdfs:label "OFF" ;
rdf:value 30.0
];
rdfs:comment "Low frequency cutoff (stage 3). Set to minimum to disable." ;
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 19 ;
pg:group pstage:stage3 ;
lv2:symbol "hicut3" ;
lv2:name "Hi Cut";
lv2:default 19000.0 ;
lv2:minimum 1000.0 ;
lv2:maximum 19000.0;
units:unit units:hz;
lv2:designation param:cutoffFrequency ;
lv2:scalePoint [
rdfs:label "OFF" ;
rdf:value 19000
];
rdfs:comment "High cutoff frequency (stage 3). Set to minimum to disable." ;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 20 ;
lv2:symbol "sag" ;
lv2:name "Sag";
lv2:default 0.0 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0;
rdfs:comment "Transformer sag (volume)." ;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 21 ;
lv2:symbol "sagd" ;
lv2:name "Sag D";
lv2:default 0.0 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0;
rdfs:comment "Transformer sag (distortion)." ;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 22 ;
lv2:symbol "master" ;
lv2:name "Master";
lv2:default -0.0 ;
lv2:minimum -60.0 ;
lv2:maximum 30.0;
units:unit units:db;
lv2:scalePoint [
rdfs:label "-60db" ;
rdf:value -60.0
] , [
rdfs:label "0db" ;
rdf:value 0.0
], [
rdfs:label "30db" ;
rdf:value -30.0
];
rdfs:comment "Master volume." ;
],
[
a lv2:AudioPort ,
lv2:InputPort ;
lv2:index 23 ;
lv2:symbol "in" ;
lv2:name "In"
] , [
a lv2:AudioPort ,
lv2:OutputPort ;
lv2:index 24 ;
lv2:symbol "out" ;
lv2:name "Out"
],[
a atom:AtomPort ,
lv2:InputPort;
atom:bufferType atom:Sequence ;
atom:supports patch:Message;
lv2:designation lv2:control ;
lv2:index 25 ;
lv2:symbol "control" ;
lv2:name "Control" ;
rdfs:comment "Plugin to GUI communication" ;
] , [
a atom:AtomPort ,
lv2:OutputPort ;
atom:bufferType atom:Sequence ;
atom:supports patch:Message;
lv2:designation lv2:control ;
lv2:index 26 ;
lv2:symbol "notify" ;
lv2:name "Notify" ;
rdfs:comment "Plugin to GUI communication" ;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 27 ;
lv2:symbol "sagf" ;
lv2:name "SagF";
lv2:default 13.0 ;
lv2:minimum 5.0 ;
lv2:maximum 25.0;
rdfs:comment "Sag filter Fc." ;
]
.
+587
View File
@@ -0,0 +1,587 @@
@prefix doap: <http://usefulinc.com/ns/doap#> .
@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix units: <http://lv2plug.in/ns/extensions/units#> .
@prefix urid: <http://lv2plug.in/ns/ext/urid#> .
@prefix atom: <http://lv2plug.in/ns/ext/atom#> .
@prefix midi: <http://lv2plug.in/ns/ext/midi#> .
@prefix epp: <http://lv2plug.in/ns/ext/port-props#> .
@prefix uiext: <http://lv2plug.in/ns/extensions/ui#> .
@prefix idpy: <http://harrisonconsoles.com/lv2/inlinedisplay#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix mod: <http://moddevices.com/ns/mod#> .
@prefix param: <http://lv2plug.in/ns/ext/parameters#> .
@prefix work: <http://lv2plug.in/ns/ext/worker#> .
@prefix pg: <http://lv2plug.in/ns/ext/port-groups#> .
@prefix atom: <http://lv2plug.in/ns/ext/atom#> .
@prefix patch: <http://lv2plug.in/ns/ext/patch#> .
@prefix plug: <http://two-play.com/plugins/toob-power-stage-2#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix state: <http://lv2plug.in/ns/ext/state#> .
@prefix urid: <http://lv2plug.in/ns/ext/urid#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix modgui: <http://moddevices.com/ns/modgui#> .
@prefix pstage: <http://two-play.com/plugins/toob-power-stage-2#> .
pstage:stage1
a param:ControlGroup ,
pg:InputGroup ;
lv2:name "Stage 1" ;
lv2:symbol "stage1" .
pstage:stage2
a param:ControlGroup ,
pg:InputGroup ;
lv2:name "Stage 2" ;
lv2:symbol "stage2" .
pstage:stage3
a param:ControlGroup ,
pg:InputGroup ;
lv2:name "Stage 3" ;
lv2:symbol "stage3" .
<http://two-play.com/plugins/toob-power-stage-2#uiState>
a lv2:Parameter ;
rdfs:label "uiState" ;
rdfs:range atom:Vector .
<http://two-play.com/rerdavies#me>
a foaf:Person ;
foaf:name "Robin Davies" ;
foaf:mbox <mailto:rerdavies@gmail.com> ;
foaf:homepage <http://two-play.com/> .
<http://two-play.com/plugins/toob-power-stage-2>
a lv2:Plugin ,
lv2:SimulatorPlugin ;
doap:name "TooB2 Power Stage";
doap:license <https://two-play.com/TooB/licenses/isc> ;
doap:maintainer <http://two-play.com/rerdavies#me> ;
lv2:minorVersion 0 ;
lv2:microVersion 1 ;
mod:brand "TooB";
mod:label "Power Stage 2.0";
lv2:requiredFeature urid:map ;
lv2:optionalFeature lv2:hardRTCapable;
lv2:extensionData state:interface;
patch:readable
<http://two-play.com/plugins/toob-power-stage-2#uiState>;
rdfs:comment """
The TooB Power Stage provides flexible and nuanced emulations of guitar amp power stages.
The goal of TooB Power Stage is not to inflexibly emulate existing tube power stages, but instead,
to be better.
TooB Power Stage provides 3 consecutive gain stages, each of which can be overdriven to varying
degrees. Power transformer sag is emulated using the SAG and SAGD controls, which emulate the
volume and distortion effects introduced when power transformer voltage sags.
Each gain section expects an input level that is nominally in the range of 12db to 0db.
It's ok if the levels are slightly over 0db, but they should not be massively over. Use the
Trim control to adjust input signal levels.
The Gain controls use oversampled atan wave shaping to emulate the effect of overdriving
gain stages. Atan wave shaping provides rich even-order harmonics similar to those produced by a tube
amp power stage. A modest amount of gain will produce the characteristically "warm" sound of a tube
gain stage. More extreme settings produce harder overdrive.
Judicious use of the LO CUT and HI CUT controls have interesting and subtle effects on the overall sound.
You are encouraged to play with these controls to see what happens. Tightening up low and high frequencies,
in early gain sections can allow you to drive the signal much harder in later gain sections without totally
breaking up. Real amps will usually cut low frequency response at somewhere between 80Hz (Fender)
and 140Hz (Marshall).
General experience seems to suggest that gradually increasing the gain in each section allows you to drive
the signal harder without introducing undesirable effects in the output. However, there definitely interesting
and subtle differences in tone that can be acheived by not adhering to that rule of thumb.
The SAG and SAGD controls are important controls. You need to undertand how they work. SAG controls how much
the overall volume of the output decreases as the transform sags. It provides the subtle "compression" that
tube amps provide, which is quite different from the compression provided by compressors. SAGD controls
the amount of additional distortion that occurs as the gain stages receive reduced voltage. It provides
the "forgiveness" of a good tube amp. Specifically, because SAGD operates in a feedback loop that runs through
all three gain stages. Increasing the distortion in the gain stages increases the power use of the gain stages;
increasing the power use of the gain stages increases the effect of SAG and SAGD which has an opposing effect
on power use. The net result is that using SAG and SAGD causes signals to break up more gradually
(hence the perceived "forgiveness"). The effects are non-linear, so not easy to describe completely. You
are strongly urged to experiment with SAG and SAGD settings in order to get best tone results.
The TooB Power Stage design is based on an experimental design, that unexpectedly produced extraordinarily
good amp tones. To be perfectly honest, we have not completely explored the sonic possibilities of the
TooB Power Stage. What's known so far: it produces exceptionally pretty clean tones; it can be driven really
hard, and seems to preserve an unusual amount of detail in the signal even when being driven hard; and it
can definitely produce signals that have many of the most prized features of tube amplifiers: warmth, detail,
subtle "compression" without coloration, and forgiving break up.
Explore!
The TooB Input Stage is part of the TooB Amp Emulation Toolkit. Typically, you would
use the following plugins in the following order.
- TooB Input Stage
- TooB Tone Stack
- Toob Power Stage
- Toob Cabinet Simulator
""";
lv2:port
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 0 ;
pg:group pstage:stage1 ;
lv2:symbol "trim1" ;
lv2:name "Trim";
lv2:default 0.0 ;
lv2:minimum -20.0 ;
lv2:maximum 20.0 ;
units:unit units:db ;
rdfs:comment "Trim input level (stage 1)" ;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 1 ;
pg:group pstage:stage1 ;
lv2:symbol "locut1" ;
lv2:name "Lo Cut";
lv2:default 30.0 ;
lv2:minimum 30.0 ;
lv2:maximum 300.0 ;
units:unit units:hz;
lv2:designation param:cutoffFrequency ;
lv2:scalePoint [
rdfs:label "OFF" ;
rdf:value 30.0
];
rdfs:comment "Low frequency cutoff (stage 1). Set to minimum to disable." ;
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 2 ;
pg:group pstage:stage1 ;
lv2:symbol "hicut1" ;
lv2:name "Hi Cut";
lv2:default 19000.0 ;
lv2:minimum 1000.0 ;
lv2:maximum 19000.0;
units:unit units:hz;
lv2:designation param:cutoffFrequency ;
lv2:scalePoint [
rdfs:label "OFF" ;
rdf:value 19000.0
];
rdfs:comment "High cutoff frequency (stage 1). Set to maximum to disable." ;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
pg:group pstage:stage1 ;
lv2:index 3 ;
lv2:symbol "shape1" ;
lv2:name "Shape1";
lv2:default 0.0 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0;
lv2:rangeStep 2;
lv2:portProperty lv2:enumeration ;
rdfs:comment "Wave Shape" ;
lv2:scalePoint [
rdfs:label "atan" ;
rdf:value 0.0
],
[
rdfs:label "triode" ;
rdf:value 1.0
];
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 4 ;
pg:group pstage:stage1 ;
lv2:symbol "gain1" ;
lv2:name "Gain";
lv2:default 0.0 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0 ;
rdfs:comment "Gain (stage 1)"
],
[
a lv2:InputPort ,
lv2:ControlPort ;
pg:group pstage:stage1 ;
lv2:index 5 ;
lv2:symbol "bias1" ;
lv2:name "Bias1";
lv2:default 0.0 ;
lv2:minimum -2.0 ;
lv2:maximum 2.0;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 6 ;
pg:group pstage:stage2 ;
lv2:symbol "trim2" ;
lv2:name "Trim";
lv2:default 0.0 ;
lv2:minimum -20.0 ;
lv2:maximum 20.0 ;
units:unit units:db ;
rdfs:comment "Trim input (stage 2)" ;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 7 ;
pg:group pstage:stage2 ;
lv2:symbol "locut2" ;
lv2:name "Lo Cut";
lv2:default 30.0 ;
lv2:minimum 30.0 ;
lv2:maximum 300.0 ;
units:unit units:hz;
lv2:designation param:cutoffFrequency ;
lv2:scalePoint [
rdfs:label "OFF" ;
rdf:value 30.0
]
;
rdfs:comment "Low frequency cutoff (stage 2). Set to minimum to disable." ;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 8 ;
pg:group pstage:stage2 ;
lv2:symbol "hicut2" ;
lv2:name "Hi Cut";
lv2:default 19000.0 ;
lv2:minimum 1000.0 ;
lv2:maximum 19000.0;
units:unit units:hz;
lv2:designation param:cutoffFrequency ;
lv2:scalePoint [
rdfs:label "OFF" ;
rdf:value 19000.0
];
rdfs:comment "High cutoff frequency (stage 2). Set to maximum to disable." ;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
pg:group pstage:stage2 ;
lv2:index 9 ;
lv2:symbol "shape2" ;
lv2:name "Shape2";
lv2:default 0.0 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0;
lv2:rangeStep 2;
lv2:portProperty lv2:enumeration ;
rdfs:comment "Wave Shape" ;
lv2:scalePoint [
rdfs:label "atan" ;
rdf:value 0.0
],
[
rdfs:label "triode" ;
rdf:value 1.0
]
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 10 ;
pg:group pstage:stage2 ;
lv2:symbol "gain2" ;
lv2:name "Gain";
lv2:default 0.0 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0 ;
rdfs:comment "Gain (stage 2)"
],
[
a lv2:InputPort ,
lv2:ControlPort ;
pg:group pstage:stage2 ;
lv2:index 11 ;
lv2:symbol "bias2" ;
lv2:name "Bias2";
lv2:default 0.0 ;
lv2:minimum -2.0 ;
lv2:maximum 2.0;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 12 ;
pg:group pstage:stage2 ;
lv2:symbol "gain2_enable" ;
lv2:name "Enable2";
lv2:default 1 ;
lv2:minimum 0 ;
lv2:maximum 1;
lv2:portProperty lv2:toggled ;
rdfs:comment "Enable gain stage 2" ;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 13 ;
pg:group pstage:stage3 ;
lv2:symbol "trim3" ;
lv2:name "Trim";
lv2:default 0.0 ;
lv2:minimum -20.0 ;
lv2:maximum 20.0 ;
units:unit units:db ;
rdfs:comment "Trim input level (stage 3)." ;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 14 ;
pg:group pstage:stage3 ;
lv2:symbol "locut3" ;
lv2:name "Lo Cut";
lv2:default 30.0 ;
lv2:minimum 30.0 ;
lv2:maximum 300.0 ;
units:unit units:hz;
lv2:designation param:cutoffFrequency ;
lv2:scalePoint [
rdfs:label "OFF" ;
rdf:value 30.0
];
rdfs:comment "Low frequency cutoff (stage 3). Set to minimum to disable." ;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 15 ;
pg:group pstage:stage3 ;
lv2:symbol "hicut3" ;
lv2:name "Hi Cut";
lv2:default 19000.0 ;
lv2:minimum 1000.0 ;
lv2:maximum 19000.0;
units:unit units:hz;
lv2:designation param:cutoffFrequency ;
lv2:scalePoint [
rdfs:label "OFF" ;
rdf:value 19000
];
rdfs:comment "High cutoff frequency (stage 3). Set to minimum to disable." ;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
pg:group pstage:stage3 ;
lv2:index 16 ;
lv2:symbol "shape3" ;
lv2:name "Shape3";
lv2:default 0.0 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0;
lv2:rangeStep 2;
lv2:portProperty lv2:enumeration ;
rdfs:comment "Wave Shape" ;
lv2:scalePoint [
rdfs:label "atan" ;
rdf:value 0.0
],
[
rdfs:label "triode" ;
rdf:value 1.0
]
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 17 ;
pg:group pstage:stage3 ;
lv2:symbol "gain3" ;
lv2:name "Gain";
lv2:default 0.0 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0 ;
rdfs:comment "Gain (stage 3)."
],
[
a lv2:InputPort ,
lv2:ControlPort ;
pg:group pstage:stage3 ;
lv2:index 18 ;
lv2:symbol "bias3" ;
lv2:name "Bias3";
lv2:default 0.0 ;
lv2:minimum -2.0 ;
lv2:maximum 2.0;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 19 ;
pg:group pstage:stage3 ;
lv2:symbol "gain3_enable" ;
lv2:name "Enable3";
lv2:default 1 ;
lv2:minimum 0 ;
lv2:maximum 1;
lv2:portProperty lv2:toggled ;
rdfs:comment "Enable gain stage 3" ;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 20 ;
lv2:symbol "sag" ;
lv2:name "Sag Vol";
lv2:default 0.0 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0;
rdfs:comment "Transformer sag (volume)." ;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 21 ;
lv2:symbol "sagd" ;
lv2:name "Sag Dist";
lv2:default 0.0 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0;
rdfs:comment "Transformer sag (distortion)." ;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 22 ;
lv2:symbol "master" ;
lv2:name "Master";
lv2:default -0.0 ;
lv2:minimum -60.0 ;
lv2:maximum 30.0;
units:unit units:db;
lv2:scalePoint [
rdfs:label "-60db" ;
rdf:value -60.0
] , [
rdfs:label "0db" ;
rdf:value 0.0
], [
rdfs:label "30db" ;
rdf:value -30.0
];
rdfs:comment "Master volume." ;
],
[
a lv2:AudioPort ,
lv2:InputPort ;
lv2:index 23 ;
lv2:symbol "in" ;
lv2:name "In"
] , [
a lv2:AudioPort ,
lv2:OutputPort ;
lv2:index 24 ;
lv2:symbol "out" ;
lv2:name "Out"
],[
a atom:AtomPort ,
lv2:InputPort;
atom:bufferType atom:Sequence ;
atom:supports patch:Message;
lv2:designation lv2:control ;
lv2:index 25 ;
lv2:symbol "control" ;
lv2:name "Control" ;
rdfs:comment "Plugin to GUI communication" ;
] , [
a atom:AtomPort ,
lv2:OutputPort ;
atom:bufferType atom:Sequence ;
atom:supports patch:Message;
lv2:designation lv2:control ;
lv2:index 26 ;
lv2:symbol "notify" ;
lv2:name "Notify" ;
rdfs:comment "Plugin to GUI communication" ;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 27 ;
lv2:symbol "sagf" ;
lv2:name "SagF";
lv2:default 13.0 ;
lv2:minimum 5.0 ;
lv2:maximum 25.0;
rdfs:comment "Sag filter Fc." ;
]
.
@@ -0,0 +1,151 @@
@prefix doap: <http://usefulinc.com/ns/doap#> .
@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix units: <http://lv2plug.in/ns/extensions/units#> .
@prefix urid: <http://lv2plug.in/ns/ext/urid#> .
@prefix atom: <http://lv2plug.in/ns/ext/atom#> .
@prefix midi: <http://lv2plug.in/ns/ext/midi#> .
@prefix epp: <http://lv2plug.in/ns/ext/port-props#> .
@prefix uiext: <http://lv2plug.in/ns/extensions/ui#> .
@prefix idpy: <http://harrisonconsoles.com/lv2/inlinedisplay#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix mod: <http://moddevices.com/ns/mod#> .
@prefix param: <http://lv2plug.in/ns/ext/parameters#> .
@prefix work: <http://lv2plug.in/ns/ext/worker#> .
@prefix atom: <http://lv2plug.in/ns/ext/atom#> .
@prefix patch: <http://lv2plug.in/ns/ext/patch#> .
@prefix plug: <http://two-play.com/plugins/toob-spectrum#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix state: <http://lv2plug.in/ns/ext/state#> .
@prefix urid: <http://lv2plug.in/ns/ext/urid#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
<http://two-play.com/rerdavies#me>
a foaf:Person ;
foaf:name "Robin Davies" ;
foaf:mbox <mailto:rerdavies@gmail.com> ;
foaf:homepage <http://two-play.com/> .
<http://two-play.com/plugins/toob-spectrum>
a lv2:Plugin ,
lv2:AnalyserPlugin ;
doap:name "TooB Spectrum Analyzer" ,
"TooB Spectrum Analyzer"@en-gb-gb
;
doap:license <https://two-play.com/TooB/licenses/isc> ;
doap:maintainer <http://two-play.com/rerdavies#me> ;
lv2:minorVersion 0 ;
lv2:microVersion 13 ;
rdfs:comment "TooB spectrum analyzer" ;
mod:brand "TooB";
mod:label "Spectrum Analyzer";
lv2:requiredFeature urid:map ;
lv2:optionalFeature lv2:hardRTCapable;
lv2:extensionData state:interface,
work:interface
;
rdfs:comment """
Displays a spectral plot of the input signal.
""";
lv2:port
[
a lv2:AudioPort ,
lv2:InputPort ;
lv2:index 0 ;
lv2:symbol "in" ;
lv2:name "In"
] ,
[
a lv2:AudioPort ,
lv2:OutputPort ;
lv2:index 1 ;
lv2:symbol "out" ;
lv2:name "Out"
], [
a atom:AtomPort ,
lv2:InputPort;
atom:bufferType atom:Sequence ;
atom:supports patch:Message;
lv2:designation lv2:control ;
lv2:index 2 ;
lv2:symbol "control" ;
lv2:name "Control" ;
rdfs:comment "Plugin to GUI communication" ;
] , [
a atom:AtomPort ,
lv2:OutputPort ;
atom:bufferType atom:Sequence ;
atom:supports patch:Message;
lv2:designation lv2:control ;
lv2:index 3;
lv2:symbol "notify" ;
lv2:name "Notify" ;
rdfs:comment "Plugin to GUI communication" ;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 4 ;
lv2:symbol "blockSize" ;
lv2:name "Block Size";
lv2:default 4096.0 ;
lv2:minimum 1024.0 ;
lv2:maximum 8192.0;
lv2:portProperty lv2:enumeration ;
rdfs:comment "Wave Shape" ;
lv2:scalePoint [
rdfs:label "1024" ;
rdf:value 1024.0
],
[
rdfs:label "2048" ;
rdf:value 2048.0
],
[
rdfs:label "4096" ;
rdf:value 4096.0
],
[
rdfs:label "8192" ;
rdf:value 8192.0
];
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 5 ;
lv2:symbol "minF" ;
lv2:name "Min F";
lv2:default 60.0 ;
lv2:minimum 10.0 ;
lv2:maximum 400.0 ;
units:unit units:hz;
rdfs:comment "Minimum frequency displayed." ;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 6 ;
lv2:symbol "maxF" ;
lv2:name "Max F";
lv2:default 16000.0 ;
lv2:minimum 1000.0 ;
lv2:maximum 22000.0 ;
units:unit units:hz;
rdfs:comment "Maximum frequency displayed." ;
];
.
+166
View File
@@ -0,0 +1,166 @@
@prefix doap: <http://usefulinc.com/ns/doap#> .
@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix units: <http://lv2plug.in/ns/extensions/units#> .
@prefix urid: <http://lv2plug.in/ns/ext/urid#> .
@prefix atom: <http://lv2plug.in/ns/ext/atom#> .
@prefix midi: <http://lv2plug.in/ns/ext/midi#> .
@prefix epp: <http://lv2plug.in/ns/ext/port-props#> .
@prefix uiext: <http://lv2plug.in/ns/extensions/ui#> .
@prefix idpy: <http://harrisonconsoles.com/lv2/inlinedisplay#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix mod: <http://moddevices.com/ns/mod#> .
@prefix param: <http://lv2plug.in/ns/ext/parameters#> .
@prefix work: <http://lv2plug.in/ns/ext/worker#> .
@prefix atom: <http://lv2plug.in/ns/ext/atom#> .
@prefix patch: <http://lv2plug.in/ns/ext/patch#> .
@prefix plug: <http://two-play.com/plugins/toob-tone-stack#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix state: <http://lv2plug.in/ns/ext/state#> .
@prefix urid: <http://lv2plug.in/ns/ext/urid#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
<http://two-play.com/plugins/toob#frequencyResponseVector>
a lv2:Parameter ;
rdfs:label "frequencyResponseVector" ;
rdfs:range atom:Vector .
<http://two-play.com/plugins/toob-tone-stack#uiState>
a lv2:Parameter ;
rdfs:label "uiState" ;
rdfs:range atom:Vector .
<http://two-play.com/rerdavies#me>
a foaf:Person ;
foaf:name "Robin Davies" ;
foaf:mbox <mailto:rerdavies@gmail.com> ;
foaf:homepage <http://two-play.com/> .
<http://two-play.com/plugins/toob-tone-stack>
a lv2:Plugin ,
lv2:SimulatorPlugin ;
doap:name "TooB Tone Stack" ,
"TooB Tone Stack"@en-gb-gb
;
doap:license <https://two-play.com/TooB/licenses/isc> ;
doap:maintainer <http://two-play.com/rerdavies#me> ;
lv2:minorVersion 0 ;
lv2:microVersion 13 ;
rdfs:comment """
The TooB Tone Stack emulates the tone controls of either a 59' Bassman or a JCM8000 guitar amplifier.
The TooB Input Stage is part of the TooB Amp Emulation Toolkit. Typically, you would
use the following plugins in the following order.
- TooB Input Stage
- TooB Tone Stack
- Toob Power Stage
- Toob Cabinet Simulator
""" ;
mod:brand "TooB";
mod:label "Tone Stack";
lv2:requiredFeature urid:map ;
lv2:optionalFeature lv2:hardRTCapable;
lv2:extensionData state:interface;
patch:readable
<http://two-play.com/plugins/toob#frequencyResponseVector>
;
lv2:port
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 0 ;
lv2:symbol "bass" ;
lv2:name "Bass";
lv2:default 0.5 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0 ;
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 1 ;
lv2:symbol "mid" ;
lv2:name "Mid";
lv2:default 0.5 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0 ;
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 2 ;
lv2:symbol "treble" ;
lv2:name "Treble";
lv2:default 0.5 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0;
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 3 ;
lv2:symbol "ampmodel" ;
lv2:name "Model";
lv2:default 0.0 ;
lv2:minimum 0.0 ;
lv2:maximum 2.0;
lv2:portProperty lv2:enumeration ;
lv2:scalePoint [
rdfs:label "Bassman" ;
rdf:value 0.0
] , [
rdfs:label "JCM8000" ;
rdf:value 1.0
], [
rdfs:label "Baxandall" ;
rdf:value 2.0
];
],
[
a lv2:AudioPort ,
lv2:InputPort ;
lv2:index 4 ;
lv2:symbol "in" ;
lv2:name "In"
], [
a lv2:AudioPort ,
lv2:OutputPort ;
lv2:index 5 ;
lv2:symbol "out" ;
lv2:name "Out"
],[
a atom:AtomPort ,
lv2:InputPort;
atom:bufferType atom:Sequence ;
atom:supports patch:Message;
lv2:designation lv2:control ;
lv2:index 6 ;
lv2:symbol "control" ;
lv2:name "Control" ;
rdfs:comment "Plugin to GUI communication" ;
] , [
a atom:AtomPort ,
lv2:OutputPort ;
atom:bufferType atom:Sequence ;
atom:supports patch:Message;
lv2:designation lv2:control ;
lv2:index 7 ;
lv2:symbol "notify" ;
lv2:name "Notify" ;
rdfs:comment "Plugin to GUI communication" ;
]
.
+1
View File
@@ -0,0 +1 @@
ToobAmp.so.0
+1
View File
@@ -0,0 +1 @@
ToobAmp.so.0.0.2
Binary file not shown.
+344
View File
@@ -0,0 +1,344 @@
@prefix doap: <http://usefulinc.com/ns/doap#> .
@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix units: <http://lv2plug.in/ns/extensions/units#> .
@prefix urid: <http://lv2plug.in/ns/ext/urid#> .
@prefix atom: <http://lv2plug.in/ns/ext/atom#> .
@prefix midi: <http://lv2plug.in/ns/ext/midi#> .
@prefix epp: <http://lv2plug.in/ns/ext/port-props#> .
@prefix uiext: <http://lv2plug.in/ns/extensions/ui#> .
@prefix idpy: <http://harrisonconsoles.com/lv2/inlinedisplay#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix mod: <http://moddevices.com/ns/mod#> .
@prefix param: <http://lv2plug.in/ns/ext/parameters#> .
@prefix work: <http://lv2plug.in/ns/ext/worker#> .
@prefix pg: <http://lv2plug.in/ns/ext/port-groups#> .
@prefix atom: <http://lv2plug.in/ns/ext/atom#> .
@prefix patch: <http://lv2plug.in/ns/ext/patch#> .
@prefix plug: <http://two-play.com/plugins/toob-tone-stack#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix state: <http://lv2plug.in/ns/ext/state#> .
@prefix urid: <http://lv2plug.in/ns/ext/urid#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix toobml: <http://two-play.com/plugins/toob-ml#> .
toobml:filterGroup
a param:ControlGroup ,
pg:InputGroup ;
lv2:name "EQ" ;
lv2:symbol "filter" .
<http://two-play.com/rerdavies#me>
a foaf:Person ;
foaf:name "Robin Davies" ;
foaf:mbox <mailto:rerdavies@gmail.com> ;
foaf:homepage <http://two-play.com/> .
<http://two-play.com/plugins/toob-ml>
a lv2:Plugin ,
lv2:SimulatorPlugin ;
doap:name "TooB ML Amplifier" ,
"TooB ML Amplifier"@en-gb-gb
;
doap:license <https://two-play.com/TooB/licenses/isc> ;
doap:maintainer <http://two-play.com/rerdavies#me> ;
lv2:minorVersion 0 ;
lv2:microVersion 13 ;
rdfs:comment """
The TooB ML Amplifier plugin provides emulation of a variety of amplifiers and overdrive pedals that are implemented
using artifical intelligence/machine learning modelling of real amplifiers.
A few models are trained to emulate the effects of the gain control on the amps that they model, but most are not.
For convenience, tone controls are provided for rough shaping of tone before the input signal is fed to the neural net models. The tone
section can be completely bypassed by setting all tone controls to exactly 0.5.
The TooB ML Amplifier is based heavily on code from the RTNeural project (https://github.com/jatinchowdhury18/RTNeural), by Jatin Chowdhury,
and uses model files from from the GuitarML Neural Pi project (https://github.com/GuitarML/NeuralPi).
""" ;
mod:brand "TooB";
mod:label "ML Amplifier";
lv2:requiredFeature urid:map, work:schedule ;
lv2:optionalFeature lv2:hardRTCapable;
lv2:extensionData state:interface, work:interface;
patch:readable
<http://two-play.com/plugins/toob#frequencyResponseVector>
;
lv2:port
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 0;
lv2:symbol "trim" ;
lv2:name "Trim";
lv2:default 0.0 ;
lv2:minimum -30.0 ;
lv2:maximum 30.0 ;
units:unit units:db ;
rdf:comment "Input volume trim (pre-model)";
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 1 ;
lv2:symbol "bass" ;
lv2:name "Bass";
pg:group toobml:filterGroup ;
lv2:default 0.5 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0 ;
rdf:comment "Bass eq (pre-model)";
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 2 ;
lv2:symbol "mid" ;
lv2:name "Mid";
pg:group toobml:filterGroup ;
lv2:default 0.5 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0 ;
rdf:comment "Mid eq (pre-model)";
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 3 ;
lv2:symbol "treble" ;
lv2:name "Treble";
pg:group toobml:filterGroup ;
lv2:default 0.5 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0 ;
rdf:comment "Treble eq (pre-model)";
],
[
a lv2:InputPort, lv2:ControlPort ;
lv2:index 4 ;
lv2:symbol "model" ;
lv2:name "Model" ;
lv2:default 0.0 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0 ;
lv2:portProperty lv2:enumeration ;
lv2:scalePoint
[
rdfs:label "BluesJR";
rdf:value 0.0
],
[
rdfs:label "BluesJR FullD";
rdf:value 1.0
],
[
rdfs:label "BossDistortionDs1 highGain";
rdf:value 2.0
],
[
rdfs:label "BossMetalZoneMt2 highGain";
rdf:value 3.0
],
[
rdfs:label "DumbleClone clean";
rdf:value 4.0
],
[
rdfs:label "DumbleClone highGain";
rdf:value 5.0
],
[
rdfs:label "DumbleClone medGain";
rdf:value 6.0
],
[
rdfs:label "EH CockFight highDrive";
rdf:value 7.0
],
[
rdfs:label "FenderPrinceton clean";
rdf:value 8.0
],
[
rdfs:label "FenderPrinceton highLevel";
rdf:value 9.0
],
[
rdfs:label "Goat DistortionGen highDist";
rdf:value 10.0
],
[
rdfs:label "Goat DistortionGen lowDist";
rdf:value 11.0
],
[
rdfs:label "HT40 Overdrive";
rdf:value 12.0
],
[
rdfs:label "LittleBigMuff";
rdf:value 13.0
],
[
rdfs:label "MIAudio Crunchbox highGain";
rdf:value 14.0
],
[
rdfs:label "MIAudio Crunchbox midGain";
rdf:value 15.0
],
[
rdfs:label "MesaBoogieMk2b Clean";
rdf:value 16.0
],
[
rdfs:label "MesaBoogieMk2b Crunch";
rdf:value 17.0
],
[
rdfs:label "MesaBoogieMk2b highGain";
rdf:value 18.0
],
[
rdfs:label "MesaBoogie Studio22 Clean";
rdf:value 19.0
],
[
rdfs:label "MesaBoogie Studio22 highGain";
rdf:value 20.0
],
[
rdfs:label "PAiA AxeGrinder highDist";
rdf:value 21.0
],
[
rdfs:label "ProCoRat";
rdf:value 22.0
],
[
rdfs:label "RockmanXPR Clean";
rdf:value 23.0
],
[
rdfs:label "RockmanXPR Distortion";
rdf:value 24.0
],
[
rdfs:label "Rockman Acoustic";
rdf:value 25.0
],
[
rdfs:label "Rockman Ultimatum highGain";
rdf:value 26.0
],
[
rdfs:label "Soldano crunch";
rdf:value 27.0
],
[
rdfs:label "Soldano highGain";
rdf:value 28.0
],
[
rdfs:label "TS9";
rdf:value 29.0
],
[
rdfs:label "TS9 FullD";
rdf:value 30.0
],
[
rdfs:label "WamplerTumnus highGain";
rdf:value 31.0
],
[
rdfs:label "XoticCompSP";
rdf:value 32.0
];
] ,
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 5 ;
lv2:symbol "gain" ;
lv2:name "Gain";
lv2:default 3.0 ;
lv2:minimum 0.0 ;
lv2:maximum 10.0 ;
rdf:comment "Model gain (used by some but not all models)"
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 6 ;
lv2:symbol "master" ;
lv2:name "Master";
lv2:default 0.0 ;
lv2:minimum -30.0 ;
lv2:maximum 30.0 ;
units:unit units:db ;
rdf:comment "Output volume trim (pot-model)";
],
[
a lv2:AudioPort ,
lv2:InputPort ;
lv2:index 7 ;
lv2:symbol "in" ;
lv2:name "In"
], [
a lv2:AudioPort ,
lv2:OutputPort ;
lv2:index 8 ;
lv2:symbol "out" ;
lv2:name "Out"
]
,
[
a atom:AtomPort ,
lv2:InputPort;
atom:bufferType atom:Sequence ;
atom:supports patch:Message;
lv2:designation lv2:control ;
lv2:index 9 ;
lv2:symbol "control" ;
lv2:name "Control" ;
rdfs:comment "Plugin to GUI communication" ;
] , [
a atom:AtomPort ,
lv2:OutputPort ;
atom:bufferType atom:Sequence ;
atom:supports patch:Message;
lv2:designation lv2:control ;
lv2:index 10 ;
lv2:symbol "notify" ;
lv2:name "Notify" ;
rdfs:comment "Plugin to GUI communication" ;
]
.
+140
View File
@@ -0,0 +1,140 @@
@prefix doap: <http://usefulinc.com/ns/doap#> .
@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix units: <http://lv2plug.in/ns/extensions/units#> .
@prefix urid: <http://lv2plug.in/ns/ext/urid#> .
@prefix atom: <http://lv2plug.in/ns/ext/atom#> .
@prefix midi: <http://lv2plug.in/ns/ext/midi#> .
@prefix epp: <http://lv2plug.in/ns/ext/port-props#> .
@prefix uiext: <http://lv2plug.in/ns/extensions/ui#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix param: <http://lv2plug.in/ns/ext/parameters#> .
@prefix work: <http://lv2plug.in/ns/ext/worker#> .
@prefix atom: <http://lv2plug.in/ns/ext/atom#> .
@prefix patch: <http://lv2plug.in/ns/ext/patch#> .
@prefix plug: <http://two-play.com/plugins/toob-tone-stack#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix state: <http://lv2plug.in/ns/ext/state#> .
@prefix urid: <http://lv2plug.in/ns/ext/urid#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix toobtuner: <http://two-play.com/plugins/toob-tuner#> .
<http://two-play.com/rerdavies#me>
a foaf:Person ;
foaf:name "Robin Davies" ;
foaf:mbox <mailto:rerdavies@gmail.com> ;
foaf:homepage <http://two-play.com/> .
<http://two-play.com/plugins/toob-tuner>
a lv2:Plugin ,
lv2:AnalyserPlugin ;
doap:name "TooB Tuner";
doap:license <https://two-play.com/TooB/licenses/isc> ;
doap:maintainer <http://two-play.com/rerdavies#me> ;
lv2:minorVersion 0 ;
lv2:microVersion 1 ;
rdfs:comment """
A chromatic guitar tuner.
""" ;
lv2:requiredFeature urid:map, work:schedule ;
lv2:optionalFeature lv2:hardRTCapable;
lv2:extensionData state:interface, work:interface;
lv2:port
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 0;
lv2:symbol "REFFREQ" ;
lv2:name "RefFreq";
lv2:default 440 ;
lv2:minimum 425;
lv2:maximum 455 ;
units:unit units:hz ;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 1 ;
lv2:symbol "THRESHOLD" ;
lv2:name "Threshold";
lv2:default -37 ;
lv2:minimum -60 ;
lv2:maximum 0 ;
units:unit units:db ;
], [
a lv2:InputPort ,
lv2:ControlPort ;
lv2:portProperty lv2:integer;
lv2:index 2 ;
lv2:symbol "MUTE" ;
lv2:name "Mute";
lv2:default 0.0 ;
lv2:minimum 0.0 ;
lv2:maximum 1.0 ;
],
[
a lv2:OutputPort ,
lv2:ControlPort ;
lv2:index 3 ;
lv2:symbol "FREQ" ;
lv2:name "Freq";
lv2:default 0.0 ;
lv2:minimum 0.0 ;
lv2:maximum 1200.0 ;
],
[
a lv2:AudioPort ,
lv2:InputPort ;
lv2:index 4 ;
lv2:symbol "in" ;
lv2:name "In"
], [
a lv2:AudioPort ,
lv2:OutputPort ;
lv2:index 5 ;
lv2:symbol "out" ;
lv2:name "Out"
]
,
[
a atom:AtomPort ,
lv2:InputPort;
atom:bufferType atom:Sequence ;
atom:supports patch:Message;
lv2:designation lv2:control ;
lv2:index 6 ;
lv2:symbol "control" ;
lv2:name "Control" ;
rdfs:comment "Plugin to GUI communication" ;
] , [
a atom:AtomPort ,
lv2:OutputPort ;
atom:bufferType atom:Sequence ;
atom:supports patch:Message;
lv2:designation lv2:control ;
lv2:index 7 ;
lv2:symbol "notify" ;
lv2:name "Notify" ;
rdfs:comment "Plugin to GUI communication" ;
]
.
+271
View File
@@ -0,0 +1,271 @@
@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix modgui: <http://moddevices.com/ns/modgui#> .
<http://two-play.com/plugins/toob-tone-stack> a lv2:Plugin ;
lv2:binary <ToobAmp.so> ;
rdfs:seeAlso <ToneStack.ttl> .
<http://two-play.com/plugins/toob-ml> a lv2:Plugin ;
lv2:binary <ToobAmp.so> ;
rdfs:seeAlso <ToobML.ttl> .
<http://two-play.com/plugins/toob-power-stage> a lv2:Plugin ;
lv2:binary <ToobAmp.so> ;
rdfs:seeAlso <PowerStage.ttl> .
<http://two-play.com/plugins/toob-power-stage-2> a lv2:Plugin ;
lv2:binary <ToobAmp.so> ;
rdfs:seeAlso <PowerStage2.ttl> .
<http://two-play.com/plugins/toob-input_stage> a lv2:Plugin ;
lv2:binary <ToobAmp.so> ;
rdfs:seeAlso <InputStage.ttl> .
<http://two-play.com/plugins/toob-cab-sim> a lv2:Plugin ;
lv2:binary <ToobAmp.so> ;
rdfs:seeAlso <CabSim.ttl> .
<http://two-play.com/plugins/toob-spectrum> a lv2:Plugin ;
lv2:binary <ToobAmp.so> ;
rdfs:seeAlso <SpectrumAnalyzer.ttl> .
<http://two-play.com/plugins/toob-tuner> a lv2:Plugin ;
lv2:binary <ToobAmp.so> ;
rdfs:seeAlso <ToobTuner.ttl> .
<http://two-play.com/plugins/toob-power-stage>
modgui:gui [
modgui:resourcesDirectory <modgui> ;
modgui:iconTemplate <modgui/icon-toob-power-stage.html> ;
modgui:stylesheet <modgui/stylesheet-toob.css> ;
modgui:screenshot <modgui/screenshot-toob-power-stage.png> ;
modgui:thumbnail <modgui/thumbnail-toob-power-stage.png> ;
modgui:javascript <modgui/script-toob-power-stage.js> ;
modgui:brand "TooB" ;
modgui:label "TooB Power Stage" ;
modgui:monitoredOutputs [ lv2:symbol "notify"] ;
modgui:port [
lv2:index 0 ;
lv2:symbol "trim1" ;
lv2:name "TRIM" ;
] , [
lv2:index 1 ;
lv2:symbol "gain1" ;
lv2:name "GAIN" ;
] , [
lv2:index 2 ;
lv2:symbol "locut1" ;
lv2:name "LO CUT" ;
] , [
lv2:index 3 ;
lv2:symbol "hicut1" ;
lv2:name "HI CUT" ;
], [
lv2:index 22 ;
lv2:symbol "shape1" ;
lv2:name "SHAPE1" ;
], [
lv2:index 4 ;
lv2:symbol "gain2_enable" ;
lv2:name "Ena" ;
] , [
lv2:index 5 ;
lv2:symbol "trim2" ;
lv2:name "TRIM" ;
] , [
lv2:index 6 ;
lv2:symbol "gain2" ;
lv2:name "GAIN" ;
] , [
lv2:index 7 ;
lv2:symbol "locut2" ;
lv2:name "LO CUT" ;
] , [
lv2:index 8 ;
lv2:symbol "hicut2" ;
lv2:name "HI CUT" ;
], [
lv2:index 23 ;
lv2:symbol "shape2" ;
lv2:name "SHAPE2" ;
] , [
lv2:index 9 ;
lv2:symbol "gain3_enable" ;
lv2:name "Ena" ;
] ,
[
lv2:index 10 ;
lv2:symbol "trim3" ;
lv2:name "TRIM" ;
] , [
lv2:index 11 ;
lv2:symbol "gain3" ;
lv2:name "GAIN" ;
] , [
lv2:index 12 ;
lv2:symbol "locut3" ;
lv2:name "LO CUT" ;
] , [
lv2:index 13 ;
lv2:symbol "hicut3" ;
lv2:name "HI CUT" ;
] , [
lv2:index 24 ;
lv2:symbol "shape3" ;
lv2:name "SHAPE3" ;
], [
lv2:index 14 ;
lv2:symbol "sag" ;
lv2:name "SAG" ;
] , [
lv2:index 15 ;
lv2:symbol "sagd" ;
lv2:name "SAGD" ;
], [
lv2:index 16 ;
lv2:symbol "master" ;
lv2:name "MASTER" ;
],
[
a lv2:InputPort ,
lv2:ControlPort ;
lv2:index 21 ;
lv2:symbol "sagf" ;
lv2:name "SagF";
]
;
] .
<http://two-play.com/plugins/toob-input_stage>
modgui:gui [
modgui:resourcesDirectory <modgui> ;
modgui:javascript <modgui/script-toob-input-stage.js> ;
modgui:iconTemplate <modgui/icon-toob-input-stage.html> ;
modgui:stylesheet <modgui/stylesheet-toob.css> ;
modgui:screenshot <modgui/screenshot-toob-input-stage.png> ;
modgui:thumbnail <modgui/thumbnail-toob-input-stage.png> ;
modgui:brand "TooB" ;
modgui:label "TooB Input Stage" ;
modgui:monitoredOutputs [ lv2:symbol "notify"] ;
modgui:port [
lv2:index 0 ;
lv2:symbol "trim" ;
lv2:name "Trim" ;
] , [
lv2:index 1 ;
lv2:symbol "locut" ;
lv2:name "Lo Cut" ;
] , [
lv2:index 2 ;
lv2:symbol "bright" ;
lv2:name "Bright" ;
] , [
lv2:index 3 ;
lv2:symbol "brightf" ;
lv2:name "Bright F" ;
] , [
lv2:index 4 ;
lv2:symbol "hicut" ;
lv2:name "Hi Cut" ;
] , [
lv2:index 5 ;
lv2:symbol "gate_t" ;
lv2:name "Gate T" ;
] , [
lv2:index 6 ;
lv2:symbol "boost" ;
lv2:name "Boost" ;
]
;
] .
<http://two-play.com/plugins/toob-cab-sim>
modgui:gui [
modgui:resourcesDirectory <modgui> ;
modgui:javascript <modgui/script-toob-cab-sim.js> ;
modgui:iconTemplate <modgui/icon-toob-cab-sim.html> ;
modgui:stylesheet <modgui/stylesheet-toob.css> ;
modgui:screenshot <modgui/screenshot-toob-cab-sim.png> ;
modgui:thumbnail <modgui/thumbnail-toob-cab-sim.png> ;
modgui:brand "TooB" ;
modgui:label "TooB Cab Simulator" ;
modgui:monitoredOutputs [ lv2:symbol "notify"] ;
modgui:port [
lv2:index 0 ;
lv2:symbol "locut" ;
lv2:name "Lo Cut" ;
] , [
lv2:index 1 ;
lv2:symbol "bright" ;
lv2:name "Bright" ;
] , [
lv2:index 2 ;
lv2:symbol "brightf" ;
lv2:name "F" ;
] , [
lv2:index 3 ;
lv2:symbol "hicut" ;
lv2:name "Hi Cut" ;
], [
lv2:index 4 ;
lv2:symbol "comb" ;
lv2:name "Comb" ;
], [
lv2:index 5 ;
lv2:symbol "combf" ;
lv2:name "F" ;
], [
lv2:index 6 ;
lv2:symbol "trim" ;
lv2:name "Trim" ;
]
;
] .
<http://two-play.com/plugins/toob-tone-stack>
modgui:gui [
modgui:resourcesDirectory <modgui> ;
modgui:javascript <modgui/script-toob-tone-stack.js> ;
modgui:iconTemplate <modgui/icon-toob-tone-stack.html> ;
modgui:stylesheet <modgui/stylesheet-toob.css> ;
modgui:screenshot <modgui/screenshot-toob-tone-stack.png> ;
modgui:thumbnail <modgui/thumbnail-toob-tone-stack.png> ;
modgui:brand "TooB" ;
modgui:label "TooB Tone Stack" ;
modgui:monitoredOutputs [ lv2:symbol "notify"] ;
modgui:port [
lv2:index 0 ;
lv2:symbol "bass" ;
lv2:name "Bass" ;
] , [
lv2:index 1 ;
lv2:symbol "mid" ;
lv2:name "Mid" ;
], [
lv2:index 2 ;
lv2:symbol "treble" ;
lv2:name "Treble" ;
] , [
lv2:index 3 ;
lv2:symbol "ampmodel" ;
lv2:name "Amp Model" ;
]
;
] .
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
# NeuralPi Tones
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,33 @@
BluesJR.json
BluesJR_FullD.json
BossDistortionDs1_highGain.json
BossMetalZoneMt2_highGain.json
DumbleClone_clean.json
DumbleClone_highGain.json
DumbleClone_medGain.json
EH_CockFight_highDrive.json
FenderPrinceton_clean.json
FenderPrinceton_highLevel.json
Goat_DistortionGen_highDist.json
Goat_DistortionGen_lowDist.json
HT40_Overdrive.json
LittleBigMuff.json
MIAudio_Crunchbox_highGain.json
MIAudio_Crunchbox_midGain.json
MesaBoogieMk2b_Clean.json
MesaBoogieMk2b_Crunch.json
MesaBoogieMk2b_highGain.json
MesaBoogie_Studio22_Clean.json
MesaBoogie_Studio22_highGain.json
PAiA_AxeGrinder_highDist.json
ProCoRat.json
RockmanXPR_Clean.json
RockmanXPR_Distortion.json
Rockman_Acoustic.json
Rockman_Ultimatum_highGain.json
Soldano_crunch.json
Soldano_highGain.json
TS9.json
TS9_FullD.json
WamplerTumnus_highGain.json
XoticCompSP.json
@@ -0,0 +1,115 @@
<div class="mod-pedal mod-rack-reaktor{{{cns}}} mod-rack-cab-sim{{{cns}}}">
<script id="ToobFrequencyScript" src="/resources/js/ToobFrequencyPlot.js{{{ns}}}" type="application/javascript" />
<script id="ToobVuScript" src="/resources/js/ToobVu.js{{{ns}}}" type="application/javascript" />
<div mod-role="drag-handle" class="mod-drag-handle" style="height:100%; width: 100%"></div>
<div class="mod-control-group">
<div class="toob_column_grid" style="height: 100%">
<div class="toob_column">
<div class="mod-switch clearfix" mod-role="bypass">
<div class="mod-switch-image" mod-role="bypass-light"></div>
</div>
</div>
<div class="toob_column" >
<div class="toob_row_grid" style="flex-flow: row wrap; width: 240px" >
<div id="toob_cabsim_fresp" class="toob_frequency_response toob_cabsim_fresp toob_row"
/>
{{#controls.0}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.0}}
{{#controls.1}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.1}}
{{#controls.3}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.3}}
{{#controls.4}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.4}}
<div class="toob_row" style="width: 120px; padding-left: 60px">
{{#controls.2}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.2}}
</div>
<div class="toob_row" style="width: 120px; padding-left: 60px">
{{#controls.5}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.5}}
</div>
</div>
</div>
<div class="toob_column clearfix">
<div class="toob_row_grid">
<div class="toob_row">
<div class="toob_vu cabsim_vu" >
</div>
</div>
<div class="toob_column_grid toob_row">
{{#controls.6}}
<div class="mod-bakelite toob_column" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.6}}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="mod-pedal-input">
{{#effect.ports.audio.input}}
<div class="mod-input mod-input-disconnected" title="{{name}}" mod-role="input-audio-port" mod-port-symbol="{{symbol}}">
<div class="mod-pedal-input-image"></div>
</div>
{{/effect.ports.audio.input}}
{{#effect.ports.midi.input}}
<div class="mod-input mod-input-disconnected" title="{{name}}" mod-role="input-midi-port" mod-port-symbol="{{symbol}}">
<div class="mod-pedal-input-image"></div>
</div>
{{/effect.ports.midi.input}}
{{#effect.ports.cv.input}}
<div class="mod-input mod-input-disconnected" title="{{name}}" mod-role="input-cv-port" mod-port-symbol="{{symbol}}">
<div class="mod-pedal-input-image"></div>
</div>
{{/effect.ports.cv.input}}
</div>
<div class="mod-pedal-output">
{{#effect.ports.audio.output}}
<div class="mod-output mod-output-disconnected" title="{{name}}" mod-role="output-audio-port" mod-port-symbol="{{symbol}}">
<div class="mod-pedal-output-image"></div>
</div>
{{/effect.ports.audio.output}}
{{#effect.ports.midi.output}}
<div class="mod-output mod-output-disconnected" title="{{name}}" mod-role="output-midi-port" mod-port-symbol="{{symbol}}">
<div class="mod-pedal-output-image"></div>
</div>
{{/effect.ports.midi.output}}
{{#effect.ports.cv.output}}
<div class="mod-output mod-output-disconnected" title="{{name}}" mod-role="output-cv-port" mod-port-symbol="{{symbol}}">
<div class="mod-pedal-output-image"></div>
</div>
{{/effect.ports.cv.output}}
</div>
</div>
@@ -0,0 +1,166 @@
<div class="mod-pedal mod-rack-reaktor{{{cns}}}">
<script id="ToobFrequencyScript" src="/resources/js/ToobFrequencyPlot.js{{{ns}}}" type="application/javascript" />
<script id="ToobVuScript" src="/resources/js/ToobVu.js{{{ns}}}" type="application/javascript" />
<script id="ToobGainScript" src="/resources/js/ToobGain.js{{{ns}}}" type="application/javascript" />
<div mod-role="drag-handle" class="mod-drag-handle" style="height:100%; width: 100%"></div>
<div class="mod-control-group">
<div class="toob_column_grid" style="height: 100%">
<div class="toob_column">
<div class="mod-switch clearfix" mod-role="bypass">
<div class="mod-switch-image" mod-role="bypass-light"></div>
</div>
</div>
<div class="toob_column" >
<div class="toob_row_grid">
<div id="toob_vu" class="toob_vu toob_row" />
{{#controls.0}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.0}}
</div>
</div>
<div class="toob_column clearfix">
<div class="toob_row_grid">
<div class="toob_row">
<div class="toob_frequency_response" mode-role="frequency-display">
</div>
</div>
<div class="toob_column_grid toob_row">
{{#controls.1}}
<div class="mod-bakelite toob_column" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.1}}
{{#controls.2}}
<div class="mod-bakelite toob_column" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.2}}
{{#controls.4}}
<div class="mod-bakelite toob_column" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.4}}
</div>
<div class="toob_row">
{{#controls.3}}
<div class="mod-bakelite" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.3}}
</div>
</div>
</div>
<div class="toob_column clearfix">
<div class="toob_row_grid">
{{#controls.5}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.5}}
<div class="toob_row">
<div class="toob_gain" />
</div>
{{#controls.6}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.6}}
</div>
</div>
<div class="toob_column">
{{#controls.7}}
<div class="mod-bakelite" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.7}}
<div class="toob_row_grid">
{{#controls.8}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.8}}
{{#controls.9}}
<div class="mod-enumerated mod-enumerated-1" mod-role="input-control-port" mod-port-symbol="{{symbol}}" mod-widget="custom-select">
<div mod-role="input-control-value" mod-port-symbol="{{symbol}}" class="mod-enumerated-selected"></div>
<div class="mod-enumerated-list">
{{#scalePoints}}
<div mod-role="enumeration-option" mod-port-value="{{value}}">{{label}}</div>
{{/scalePoints}}
</div>
</div>
{{/controls.9}}
</div>
{{#controls.10}}
<div class="mod-enumerated mod-enumerated-2" mod-role="input-control-port" mod-port-symbol="{{symbol}}" mod-widget="custom-select">
<div mod-role="input-control-value" mod-port-symbol="{{symbol}}" class="mod-enumerated-selected"></div>
<div class="mod-enumerated-list">
{{#scalePoints}}
<div mod-role="enumeration-option" mod-port-value="{{value}}">{{label}}</div>
{{/scalePoints}}
</div>
</div>
{{/controls.10}}
{{#controls.11}}
<div class="mod-enumerated mod-enumerated-3" mod-role="input-control-port" mod-port-symbol="{{symbol}}" mod-widget="custom-select">
<div mod-role="input-control-value" mod-port-symbol="{{symbol}}" class="mod-enumerated-selected"></div>
<div class="mod-enumerated-list">
{{#scalePoints}}
<div mod-role="enumeration-option" mod-port-value="{{value}}">{{label}}</div>
{{/scalePoints}}
</div>
</div>
{{/controls.11}}
</div>
</div>
</div>
</div>
<div class="mod-pedal-input">
{{#effect.ports.audio.input}}
<div class="mod-input mod-input-disconnected" title="{{name}}" mod-role="input-audio-port" mod-port-symbol="{{symbol}}">
<div class="mod-pedal-input-image"></div>
</div>
{{/effect.ports.audio.input}}
{{#effect.ports.midi.input}}
<div class="mod-input mod-input-disconnected" title="{{name}}" mod-role="input-midi-port" mod-port-symbol="{{symbol}}">
<div class="mod-pedal-input-image"></div>
</div>
{{/effect.ports.midi.input}}
{{#effect.ports.cv.input}}
<div class="mod-input mod-input-disconnected" title="{{name}}" mod-role="input-cv-port" mod-port-symbol="{{symbol}}">
<div class="mod-pedal-input-image"></div>
</div>
{{/effect.ports.cv.input}}
</div>
<div class="mod-pedal-output">
{{#effect.ports.audio.output}}
<div class="mod-output mod-output-disconnected" title="{{name}}" mod-role="output-audio-port" mod-port-symbol="{{symbol}}">
<div class="mod-pedal-output-image"></div>
</div>
{{/effect.ports.audio.output}}
{{#effect.ports.midi.output}}
<div class="mod-output mod-output-disconnected" title="{{name}}" mod-role="output-midi-port" mod-port-symbol="{{symbol}}">
<div class="mod-pedal-output-image"></div>
</div>
{{/effect.ports.midi.output}}
{{#effect.ports.cv.output}}
<div class="mod-output mod-output-disconnected" title="{{name}}" mod-role="output-cv-port" mod-port-symbol="{{symbol}}">
<div class="mod-pedal-output-image"></div>
</div>
{{/effect.ports.cv.output}}
</div>
</div>
@@ -0,0 +1,182 @@
<div class="mod-pedal mod-rack-reaktor{{{cns}}} mod-pedal mod-rack-power-stage{{{cns}}}">
<script id="ToobFrequencyScript" src="/resources/js/ToobFrequencyPlot.js{{{ns}}}" type="application/javascript" />
<script id="ToobVuScript" src="/resources/js/ToobVu.js{{{ns}}}" type="application/javascript" />
<script id="ToobGainScript" src="/resources/js/ToobGain.js{{{ns}}}" type="application/javascript" />
<div mod-role="drag-handle" class="mod-drag-handle" style="height:100%; width: 100%"></div>
<div class="mod-control-group">
<div class="toob_column_grid" style="height: 100%">
<!-- SWITCH -->
<div class="toob_column">
<div class="mod-switch clearfix" mod-role="bypass">
<div class="mod-switch-image" mod-role="bypass-light"></div>
</div>
</div>
<!-- GAIN STAGE 1-->
<div class="toob_column" >
<div class="toob_row_grid" style="flex-flow: row wrap; width: 120px">
<div id="toob_gain1_vu1" class="toob_micro_vu toob_row" />
<div id="toob_gain1_gain" class="toob_gain toob_gain_power_stage toob_row" />
{{#controls.0}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.0}}
{{#controls.1}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.1}}
{{#controls.2}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.2}}
{{#controls.3}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.3}}
</div>
</div>
<!-- GAIN STAGE 2-->
<div class="toob_column" >
<div class="toob_row_grid" style="flex-flow: row wrap; width: 120px">
<div id="toob_gain2_vu" class="toob_micro_vu toob_row" />
<div id="toob_gain2_gain" class="toob_gain toob_gain_power_stage toob_row" />
{{#controls.5}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.5}}
{{#controls.6}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.6}}
{{#controls.7}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.7}}
{{#controls.8}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.8}}
</div>
</div>
<!-- GAIN STAGE 2-->
<div class="toob_column" >
<div class="toob_row_grid" style="flex-flow: row wrap; width: 120px">
<div id="toob_gain3_vu" class="toob_micro_vu toob_row" />
<div id="toob_gain3_gain" class="toob_gain toob_gain_power_stage toob_row" />
{{#controls.10}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.10}}
{{#controls.11}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.11}}
{{#controls.12}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.12}}
{{#controls.13}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.13}}
</div>
</div>
<!-- OUTPUT-->
<div class="toob_column" >
<div class="toob_row_grid" style="flex-flow: row wrap; width: 128px">
<div style="margin-left: 34px; margin-right: 34px; margin-bottom: 15px;">
{{#controls.16}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.16}}
</div>
<div class="toob-sag-meter" />
{{#controls.14}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.14}}
<div class="toob-sag-meter" />
{{#controls.15}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.15}}
</div>
</div>
<div class="toob_column" >
<div class="toob_large_vu" />
</div>
</div>
</div>
</div>
<div class="mod-pedal-input">
{{#effect.ports.audio.input}}
<div class="mod-input mod-input-disconnected" title="{{name}}" mod-role="input-audio-port" mod-port-symbol="{{symbol}}">
<div class="mod-pedal-input-image"></div>
</div>
{{/effect.ports.audio.input}}
{{#effect.ports.midi.input}}
<div class="mod-input mod-input-disconnected" title="{{name}}" mod-role="input-midi-port" mod-port-symbol="{{symbol}}">
<div class="mod-pedal-input-image"></div>
</div>
{{/effect.ports.midi.input}}
{{#effect.ports.cv.input}}
<div class="mod-input mod-input-disconnected" title="{{name}}" mod-role="input-cv-port" mod-port-symbol="{{symbol}}">
<div class="mod-pedal-input-image"></div>
</div>
{{/effect.ports.cv.input}}
</div>
<div class="mod-pedal-output">
{{#effect.ports.audio.output}}
<div class="mod-output mod-output-disconnected" title="{{name}}" mod-role="output-audio-port" mod-port-symbol="{{symbol}}">
<div class="mod-pedal-output-image"></div>
</div>
{{/effect.ports.audio.output}}
{{#effect.ports.midi.output}}
<div class="mod-output mod-output-disconnected" title="{{name}}" mod-role="output-midi-port" mod-port-symbol="{{symbol}}">
<div class="mod-pedal-output-image"></div>
</div>
{{/effect.ports.midi.output}}
{{#effect.ports.cv.output}}
<div class="mod-output mod-output-disconnected" title="{{name}}" mod-role="output-cv-port" mod-port-symbol="{{symbol}}">
<div class="mod-pedal-output-image"></div>
</div>
{{/effect.ports.cv.output}}
</div>
</div>
@@ -0,0 +1,81 @@
<div class="mod-pedal mod-rack-reaktor{{{cns}}} mod-rack-tone-stack{{{cns}}}">
<script id="ToobFrequencyScript" src="/resources/js/ToobFrequencyPlot.js{{{ns}}}" type="application/javascript" />
<div mod-role="drag-handle" class="mod-drag-handle" style="height:100%; width: 100%"></div>
<div class="mod-control-group">
<div class="toob_column_grid" style="height: 100%">
<div class="toob_column">
<div class="mod-switch clearfix" mod-role="bypass">
<div class="mod-switch-image" mod-role="bypass-light"></div>
</div>
</div>
<div class="toob_column" >
<div class="toob_row_grid" style="flex-flow: row wrap; width: 180px" >
<div style="width: 180px" class="toob_row">
{{#controls.3}}
<div class="toob-amp-model" title="{{comment}}">
<div class="toob-amp-model-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}" mod-widget="switch"></div>
</div>
{{/controls.3}}
</div>
<div id="toob_tonestack_fresp" class="toob_frequency_response toob_tonestack_fresp toob_row"
/>
{{#controls.0}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.0}}
{{#controls.1}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.1}}
{{#controls.2}}
<div class="mod-bakelite toob_row" title="{{comment}}">
<div class="mod-bakelite-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div>
<span class="mod-bakelite-title">{{name}}</span>
</div>
{{/controls.2}}
</div>
</div>
</div>
</div>
</div>
</div>
<div class="mod-pedal-input">
{{#effect.ports.audio.input}}
<div class="mod-input mod-input-disconnected" title="{{name}}" mod-role="input-audio-port" mod-port-symbol="{{symbol}}">
<div class="mod-pedal-input-image"></div>
</div>
{{/effect.ports.audio.input}}
{{#effect.ports.midi.input}}
<div class="mod-input mod-input-disconnected" title="{{name}}" mod-role="input-midi-port" mod-port-symbol="{{symbol}}">
<div class="mod-pedal-input-image"></div>
</div>
{{/effect.ports.midi.input}}
{{#effect.ports.cv.input}}
<div class="mod-input mod-input-disconnected" title="{{name}}" mod-role="input-cv-port" mod-port-symbol="{{symbol}}">
<div class="mod-pedal-input-image"></div>
</div>
{{/effect.ports.cv.input}}
</div>
<div class="mod-pedal-output">
{{#effect.ports.audio.output}}
<div class="mod-output mod-output-disconnected" title="{{name}}" mod-role="output-audio-port" mod-port-symbol="{{symbol}}">
<div class="mod-pedal-output-image"></div>
</div>
{{/effect.ports.audio.output}}
{{#effect.ports.midi.output}}
<div class="mod-output mod-output-disconnected" title="{{name}}" mod-role="output-midi-port" mod-port-symbol="{{symbol}}">
<div class="mod-pedal-output-image"></div>
</div>
{{/effect.ports.midi.output}}
{{#effect.ports.cv.output}}
<div class="mod-output mod-output-disconnected" title="{{name}}" mod-role="output-cv-port" mod-port-symbol="{{symbol}}">
<div class="mod-pedal-output-image"></div>
</div>
{{/effect.ports.cv.output}}
</div>
</div>
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

@@ -0,0 +1,147 @@
var ToobFrequencyPlot = {
CreateWrapper: function (selector,width,height, dbMinOpt,dbMaxOpt,dbTickSpacingOpt)
{
if (dbMinOpt == undefined) dbMinOpt = -45;
if (dbMaxOpt == undefined) dbMaxOpt = 5;
if (dbTickSpacingOpt == undefined) dbTickSpacingOpt = 10;
var result = { };
result.MIN_DB_AF = Math.pow(10,-192/20);
result.fMin = 30;
result.fMax = 22050;
result.logMin = Math.log(result.fMin);
result.logMax = Math.log(result.fMax);
// Size of the SVG element.
result.xMin = 0;
result.xMax = PLOT_WIDTH;
result.yMin = 0;
result.yMax = PLOT_HEIGHT;
result.dbMin = dbMaxOpt; // deliberately reversed to flip up and down.
result.dbMax = dbMinOpt;
result.dbTickSpacing = dbTickSpacingOpt;
result.DrawGrid = function(svg)
{
var style = { fill: 'none', stroke: "#066",strokeWidth: 0.25};
for (var db = Math.ceil(this.dbMax/this.dbTickSpacing)*this.dbTickSpacing; db < this.dbMin; db += this.dbTickSpacing )
{
var y = (db-this.dbMin)/(this.dbMax-this.dbMin)*(this.yMax-this.yMin);
svg.line(this.xMin,y,this.xMax,y,style);
}
var decade0 = Math.pow(10,Math.floor(Math.log10(this.fMin)));
for (var decade = decade0; decade < this.fMax; decade *= 10)
{
for (var i = 0; i < 10; ++i)
{
var f = decade*i;
if (f > this.fMin && f < this.fMax)
{
var x = this.xScale(f);
svg.line(x,this.yMin,x,this.yMax,style);
}
}
}
};
result.Draw = function(svg,values)
{
svg.clear();
var points = new Array(values.length/2);
for (var i = 0; i < values.length; i += 2)
{
var f = values[i];
var v = values[i+1];
var x = this.xScale(f);
var y = this.afToY(v);
points[i/2] = [x,y];
}
svg.polyline(points,{fill: 'none', stroke: "#990", strokeWidth: 0.5});
};
result.MaybeDraw = function()
{
if (this.values && this.svgPlot)
{
this.Draw(this.svgPlot,this.values);
}
};
result.SetValues = function(values)
{
this.values = values;
this.MaybeDraw();
};
result.DrawPlot = function(svg)
{
result.svgPlot = svg;
result.MaybeDraw();
};
result.Attach = function(selector, width,height)
{
this.xMax = width;
this.yMax = height;
this.selector = selector;
this.background = $("<div>");
selector.append(this.background);
this.plot = $("<div>");
selector.append(this.plot);
this.background.svg({onLoad: function (svg) { result.DrawGrid.apply(result,[svg]) } });
this.plot.svg({onLoad: function (svg) { result.DrawPlot.apply(result,[svg]) } });
};
result.afToY = function(value)
{
value = Math.abs(value);
var db;
if (value < this.MIN_DB_AF) {
db = -192.0;
} else {
db = 20*Math.log10(value);
}
var y = (db-this.dbMin)/(this.dbMax-this.dbMin)*(this.yMax-this.yMin) + this.yMin;
return y;
};
result.xScale = function(frequency)
{
var logV = Math.log(frequency);
return (this.xMax-this.xMin) * (logV-this.logMin)/(this.logMax-this.logMin) + this.xMin;
};
result.UpdateFrequencyResponse = function(values)
{
this.values = values;
this.MaybeDrawResponse();
};
result.DrawResponse = function(svg,values)
{
svg.clear();
var points = new Array(values.length/2);
for (var i = 0; i < values.length; i += 2)
{
var f = values[i];
var v = values[i+1];
var x = this.xScale(f);
var y = this.afToY(v);
points[i/2] = [x,y];
}
svg.polyline(points,{fill: 'none', stroke: "#990", strokeWidth: 0.5});
};
result.Attach(selector,width,height);
return result;
}
};
@@ -0,0 +1,83 @@
var ToobGain = {
CreateWrapper: function (selector,width,height)
{
var result = {
MIN_DB_AF: Math.pow(10,-192/20),
width: width,
height:height,
debugBreak: true,
DebugBreak: function()
{
if (this.debugBreak)
{
this.debugBreak = false;
debugger;
}
},
gain: 1e-7,
gainScale: 1,
SetValue: function(value)
{
value = value*value;
value = value*value*1000;
if (value < 1E-7) value = 1E-7;
this.gain = value;
this.gainScale = 1/Math.atan(this.gain);
this.MaybeDraw();
},
GainFn: function(x)
{
return Math.atan(x*this.gain)*this.gainScale;
},
Draw: function(svg)
{
svg.clear();
var points = [];
var ix = 0;
var xs = this.width/2;
var ys = (this.height-2)/2;
var y0 = this.height/2;
for (var x = -1.0; x <= 1.0; x += 2.0/this.width)
{
var y = this.GainFn(x);
points[ix++] = [ (x+1)*xs, y0-y*ys];
}
svg.polyline(points,{ fill: 'none', stroke: '#880', strokeThickness: 0.5, opacity: 0.5});
},
MaybeDraw: function()
{
if (this.svgPlot)
{
this.Draw(this.svgPlot);
}
},
DrawPlot: function(svg)
{
this.svgPlot = svg;
this.MaybeDraw();
},
Attach: function(selector)
{
//this.DebugBreak();
this.plot = $("<div>");
selector.append(this.plot);
var self = this;
this.plot.svg({onLoad: function (svg) { self.DrawPlot.apply(self,[svg]); } });
}
};
result.Attach(selector);
return result;
}
};
+419
View File
@@ -0,0 +1,419 @@
var ToobVu = {
CreateWrapper: function (selector, _channels, width, height, minDb, maxDb, tickSpacingOpt, isTinyOpt)
{
if (tickSpacingOpt == undefined)
{
tickSpacingOpt = 6;
}
isTinyOpt = isTinyOpt == undefined? false: isTinyOpt;
var result = {
MIN_DB_AF: Math.pow(10,-192/20),
channels: _channels,
dbMin: minDb,
dbMax: maxDb,
width: width,
height:height,
yMin: 0,
yMax: height-4,
xMin: 0,
xMax: width,
tickSpacing: tickSpacingOpt,
isTiny: isTinyOpt,
values: [-96],
peaks: [-96],
prepareLayout: function() {
var ticksWidth;
if (this.isTiny)
{
this.tick0L = 0;
this.tick1R = width;
ticksWidth = this.tick1R-this.tick0L;
this.trackL = this.tick0L + ticksWidth/3;
this.trackR = this.tick0L + ticksWidth*2/3;
this.tick0R = this.trackL-2;
this.tick1L = this.trackR + 2;
this.ledL = this.trackL+1;
this.ledR = this.trackR-1;
} else {
this.tick0L = 20;
this.tick1R = width;
ticksWidth = this.tick1R-this.tick0L;
if (this.channels > 1)
{
this.trackL = this.tick0L + ticksWidth/4;
this.trackR = this.tick0L + ticksWidth*3/4;
} else
{
this.trackL = this.tick0L + ticksWidth/3;
this.trackR = this.tick0L + ticksWidth*2/3;
}
this.tick0R = this.trackL-2;
this.tick1L = this.trackR + 2;
this.ledL = this.trackL+1;
this.ledR = this.trackR-1;
}
},
DrawTicks: function (svg) {
var majorTick = { fill: 'none', stroke: "#EEE",strokeWidth: 2, opacity: 0.5 };
if (this.tickSpacing == 0)
{
var y = this.dbToY(0);
svg.line(this.tick0L,y,this.tick0R,y,
majorTick);
if (!this.isTiny)
{
svg.line(this.tick1L,y,this.tick1R,y,
majorTick);
}
} else {
var minorTick = { fill: 'none', stroke: "#EEE",strokeWidth: 1, opacity: 0.3 };
var textSettings = { fill: '#eee', stroke: 'none', fontFamily: '"cooper hewitt",Sans-Serif',fontSize: "6px", textAnchor: "end", opacity: 0.5};
for (var db = Math.ceil(this.dbMin/this.tickSpacing)*this.tickSpacing; db < this.dbMax; db += this.tickSpacing )
{
var y = this.dbToY(db);
svg.line(this.tick0L,y,this.tick0R,y,
db === 0? majorTick: minorTick);
if (!this.isTiny)
{
svg.line(this.tick1L,y,this.tick1R,y,
db === 0? majorTick: minorTick);
var text;
if (db > 0)
{
text = "+" + db;
} else {
text = "" + db;
}
svg.text(this.tick0L-2,y+2,text,textSettings);
}
}
}
var y0 = this.dbToY(0);
var y1 = this.dbToY(-this.tickSpacing);
var targetFill = {fill: '#FFF', stroke: 'none',opacity: 0.07};
svg.rect(this.tick0L,y0,this.tick0R-this.tick0L,y1-y0,0,0,targetFill);
svg.rect(this.tick1L,y0,this.tick1R-this.tick1L,y1-y0,0,0,targetFill);
y0 = this.dbToY(this.dbMax);
y1 = this.dbToY(this.dbMin);
svg.rect(this.trackL,y0,this.trackR-this.trackL,y1-y0,0,0,{fill: '#000', stroke: 'none'});
},
greenVu: { fill: "#080", stroke: 'none',opacity: 0.5},
redVu: { fill: "#800", stroke: 'none',opacity: 0.5},
yellowVu: { fill: "#880", stroke: 'none',opacity: 0.5},
greenPeak: { fill: "#0F0", stroke: 'none',opacity: 1},
redPeak: { fill: "#F00", stroke: 'none',opacity: 1},
yellowPeak: { fill: "#FF0", stroke: 'none',opacity: 1},
greenPeakColor: "#0F0",
nonePeakColor: "transparent",
redPeakColor: "#F00",
yellowPeakColor: "#FF0",
debugBreak: true,
DebugBreak: function()
{
if (this.debugBreak)
{
this.debugBreak = false;
debugger;
}
},
Update: function()
{
var yMin = this.dbToY(this.dbMin);
var yMax = this.dbToY(this.dbMax);
var yZero = this.dbToY(0);
var yYellow = this.dbToY(-6);
for (var channel = 0; channel < this.channels; ++channel)
{
var yValue = this.dbToY(this.values[channel]);
var yPeak = this.dbToY(this.peaks[channel]);
var channelControls = this.channelControls[channel];
if (yValue < yMin)
{
var yGreen = Math.max(yYellow,yValue);
channelControls.greenRect.setAttribute("y",yGreen,"");
channelControls.greenRect.setAttribute("height",yMin-yGreen,"");
} else {
channelControls.greenRect.setAttribute("y",0,"");
channelControls.greenRect.setAttribute("height",0,"");
}
if (yValue < yYellow)
{
var y = Math.max(yZero,yValue);
channelControls.yellowRect.setAttribute("y",y,"");
channelControls.yellowRect.setAttribute("height",yYellow-y,"");
} else {
channelControls.yellowRect.setAttribute("y",0,"");
channelControls.yellowRect.setAttribute("height",0,"");
}
if (yValue < yZero)
{
var y = Math.max(yMax,yValue);
channelControls.redRect.setAttribute("y",y,"");
channelControls.redRect.setAttribute("height",yZero-y,"");
} else {
channelControls.redRect.setAttribute("y",0,"");
channelControls.redRect.setAttribute("height",0,"");
}
var peakFill = null;
var peakHeight = 2;
if (yPeak < yZero)
{
peakFill = this.redPeakColor;
} else if (yPeak < yYellow)
{
peakFill = this.yellowPeakColor;
} else if (yPeak < yMin)
{
peakFill = this.greenPeakColor;
} else {
peakFill = this.nonePeakColor;
peakHeight = 0;
}
{
var y = Math.max(yMax+1,yPeak);
channelControls.peakRect.setAttribute("y",y-1,"");
channelControls.peakRect.setAttribute("height",peakHeight);
channelControls.peakRect.setAttribute("fill",peakFill);
}
}
if (!this.isTiny && this.hasGate)
{
// 0: disabled, 1: released, 2: releasing, 3: attacking, 4: holding.
var yGateThreshold = this.dbToY(this.gateThreshold);
var showGate = (this.gateEnabled && yGateThreshold < yMin);
if (showGate)
{
var state = { fill: this.gateState >= 3 ? "#080" : "#C00", stroke: '#000', strokeWidth: 1};
var fill = this.gateState >= 3 ? "#080" : "#C00";
this.gateIndicatorL.setAttribute("fill",fill,"");
this.gateIndicatorR.setAttribute("fill",fill,"");
var pointsL = (this.trackL-1) +","+ (yGateThreshold) +
" " + (this.trackL-9) + "," + (yGateThreshold+4) +
" " + (this.trackL-9) + "," + (yGateThreshold-4) +
" " + (this.trackL-1) +","+ (yGateThreshold);
this.gateIndicatorL.setAttribute("points",pointsL,"");
var pointsR = (this.trackR+1) +","+ (yGateThreshold) +
" " + (this.trackR+9) + "," + (yGateThreshold-4) +
" " + (this.trackR+9) + "," + (yGateThreshold+4) +
" " + (this.trackR+1) +","+ (yGateThreshold);
this.gateIndicatorR.setAttribute("points",pointsR,"");
this.gateIndicatorL.setAttribute("opacity","1","");
this.gateIndicatorR.setAttribute("opacity","1","");
} else {
this.gateIndicatorL.setAttribute("opacity","0","");
this.gateIndicatorR.setAttribute("opacity","0","");
}
}
},
Draw: function(svg)
{
svg.clear();
for (var channel = 0; channel < this.channels; ++channel)
{
this.channelControls[channel] = this.drawChannel(svg,channel);
}
if (!this.isTiny)
{
var yGateThreshold = this.dbToY(0);
var state = { fill: "transparent", stroke: '#000', strokeWidth: 1};
var points = [[0,0]]; // just create the structure. Updates will give the shape.
this.gateIndicatorL = svg.polyline(points,state);
this.gateIndicatorR = svg.polyline(points,state);
}
},
drawChannel: function(svg,channel)
{
var result = {};
var width = ((this.ledR-this.ledL)-(this.channels-1))/this.channels;
var x0 = this.ledL + channel*(width+1);
// render all the controls, without y info which will be filled in during Update.
result.greenRect = svg.rect(x0,0,width,0,0,0,this.greenVu);
result.yellowRect = svg.rect(x0,0,width,0,0,0,this.yellowVu);
result.redRect = svg.rect(x0,0,width,0,0,0,this.redVu);
result.peakRect = svg.rect(x0,0,width,0,0,0,this.greenPeak);
return result;
},
channelControls: [],
MaybeUpdate: function()
{
if (this.svgPlot)
{
for (var i = 0; i < this.channels; ++i)
{
this.Update(this.channelControls[i],this.values[i],this.peaks[i]);
}
}
},
getTimeMs: function()
{
return new Date().getTime();
},
lastPeaks: [-96],
holdTimes: [0],
holdLengthMs: 2000,
holdTime: 0,
peakDecayRate: -96/4000,
valueDecayRate: -96/1000,
lastValueTime: 0,
gateState: 0,
UpdateValue: function(value, gateStateOpt)
{
this.UpdateValues([value],gateStateOpt);
},
UpdateValues: function(values,gateStateOpt)
{
if (gateStateOpt == undefined)
{
gateStateOpt = 0;
}
//this.DebugBreak();
var time = this.getTimeMs();
for (var i = 0; i < this.values.length; ++i)
{
var value = i < values.length? values[i]: 0;
value = this.afToDb(value);
var decayedValue = this.values[i] +(time-this.lastValueTime)*this.valueDecayRate;
if (decayedValue > value)
{
value = decayedValue;
}
this.values[i] = value;
if (time > this.holdTimes[i])
{
this.peaks[i] = this.lastPeaks[i] +(time-this.holdTimes[i])*this.peakDecayRate;
}
if (value > this.peaks[i])
{
this.lastPeaks[i] = this.peaks[i] = value;
this.holdTimes[i] = time+this.holdLengthMs;
}
}
this.lastValueTime = time;
this.gateState = gateStateOpt;
this.MaybeUpdate();
},
gateEnabled: false,
gateThreshold: -180,
hasGate: false,
SetGateEnabled: function(enabled)
{
this.hasGate = true;
if (this.gateEnabled != enabled)
{
this.gateEnabled = enabled;
this.MaybeUpdate();
}
},
SetGateThreshold: function(value)
{
this.hasGate = true;
if (this.gateThreshold != value)
{
this.gateThreshold = value;
this.MaybeUpdate();
}
},
DrawPlot: function(svg)
{
this.svgPlot = svg;
this.Draw(this.svgPlot,this.value,this.peak);
},
dbToY: function(db)
{
if (db < this.minDb) db = this.minDb;
if (db > this.maxDb) db = this.maxDb;
return (db-this.dbMin)/(this.dbMax-this.dbMin)*(this.yMin-this.yMax)+this.yMax;
},
afToDb: function(af)
{
var value = Math.abs(af);
var db;
if (value < this.MIN_DB_AF) {
db = -192.0;
} else {
db = 20*Math.log10(value);
}
return db;
},
afToY: function(value)
{
var db = afToDb(value);
return this.dbToY(db);
},
Attach: function(selector)
{
var time = this.getTimeMs();
this.lastValueTime = time;
if (this.holdTime === 0) this.holdTime = time;
for (var i = 1; i < this.channels; ++i)
{
this.values[i] = this.values[0];
this.peaks[i] = this.peaks[0];
this.lastPeaks[i] = this.peaks[0];
}
for (var i = 0; i < this.channels; ++i)
{
this.holdTimes[i] = time;
}
this.prepareLayout();
this.background = $("<div>");
selector.append(this.background);
this.plot = $("<div>");
selector.append(this.plot);
var self = this;
this.background.svg({onLoad: function (svg) { self.DrawTicks.apply(self,[svg]); } });
this.plot.svg({onLoad: function (svg) { self.DrawPlot.apply(self,[svg]); } });
}
};
result.Attach(selector);
return result;
}
};
Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 441 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

@@ -0,0 +1,167 @@
method = function (event,jsFuncs) {
function LoadScripts(ds)
{
var script = event.icon.find("#ToobFrequencyScript");
$.get(script[0].src, function(data,status) {
ds.OnFrequencyScriptLoaded.apply(ds,[data,status]);
});
script = event.icon.find("#ToobVuScript");
$.get(script[0].src, function(data,status) {
ds.OnVuScriptLoaded.apply(ds,[data,status]);
});
}
function handle_event (symbol, value) {
switch (symbol) {
case "gate_t":
{
var ds = event.icon.data('xModFrequency');
ds.SetGateThreshold(value);
ds.SetGateEnabled(value != -80);
}
break;
case "boost":
{
var ds = event.icon.data('xModFrequency');
ds.SetBoost(value);
}
break;
}
}
function MakeDs()
{
var ds = {
FREQUENCY_RESPONSE_URI: "http://two-play.com/plugins/toob#frequencyResponseVector",
UI_STATE_URI: "http://two-play.com/plugins/toob-cab-sim#uiState",
SpectrumDiv: event.icon.find('.toob_cabsim_fresp'),
attached: false,
vuAttached: false,
OnVuScriptLoaded: function(data,status)
{
eval(data);
if (ToobVu && !this.vuAttached)
{
this.vuAttached = true;
this.ToobVu = ToobVu;
this.vu = this.ToobVu.CreateWrapper(this.VuDiv,2,48,130,-80,20,12);
}
},
gateThreshold: -192,
gateEnabled: false,
SetGateThreshold: function(value)
{
this.gateThreshold = value;
if (this.vu)
{
this.vu.SetGateThreshold(value);
}
},
SetGateEnabled: function(enabled)
{
this.gateEnabled = enabled;
if (this.vu)
{
this.vu.SetGateEnabled(enabled);
}
},
boost: 0,
SetBoost: function(value)
{
this.boost = value;
if (this.gain)
{
this.gain.SetValue(value);
}
},
OnFrequencyScriptLoaded: function(data,status)
{
eval(data);
if (ToobFrequencyPlot && !ds.attached)
{
ds.ToobFrequencyPlot = ToobFrequencyPlot;
ds.attached = true;
ds.frequencyPlot = ToobFrequencyPlot.CreateWrapper(this.SpectrumDiv,236,66);
}
this.MaybeDrawResponse();
},
MaybeDrawResponse: function() {
if (this.frequencyPlot && this.values)
{
this.frequencyPlot.SetValues(this.values);
}
},
VuDiv: event.icon.find('.cabsim_vu'),
UpdateFrequencyResults: function(values)
{
this.values = values;
this.MaybeDrawResponse();
},
UpdateUiState: function(values)
{
var vuLevel = values[0];
var gateState = values[1];
if (this.vu)
{
this.vu.UpdateValues([ values[0], values[1] ],gateState);
}
}
};
return ds;
}
function handle_property(uri, value)
{
var ds = event.icon.data('xModFrequency');
if (uri == ds.FREQUENCY_RESPONSE_URI)
{
ds.UpdateFrequencyResults(value);
} else if (uri == ds.UI_STATE_URI)
{
ds.UpdateUiState(value);
}
}
if (event.type == 'start') {
//debugger;
// var dpy = event.icon.find('[mod-role=frequency-display]');
var ds = MakeDs();
event.icon.data('xModFrequency', ds);
LoadScripts(ds);
var ports = event.ports;
for (var p in ports) {
handle_event(ports[p].symbol, ports[p].value);
}
// refresh the frequency display if not first load.
jsFuncs.patch_get(ds.FREQUENCY_RESPONSE_URI);
}
else if (event.type == 'change') {
if (event.symbol)
{
handle_event (event.symbol, event.value);
} else {
handle_property(event.uri,event.value);
}
} else {
//debugger;
}
};
@@ -0,0 +1,188 @@
method = function (event,jsFuncs) {
function LoadScripts(ds)
{
var script = event.icon.find("#ToobFrequencyScript");
$.get(script[0].src, function(data,status) {
ds.OnFrequencyScriptLoaded.apply(ds,[data,status]);
});
script = event.icon.find("#ToobVuScript");
$.get(script[0].src, function(data,status) {
ds.OnVuScriptLoaded.apply(ds,[data,status]);
});
script = event.icon.find("#ToobGainScript");
$.get(script[0].src, function(data,status) {
ds.OnGainScriptLoaded.apply(ds,[data,status]);
});
}
function handle_event (symbol, value) {
switch (symbol) {
case "gate_t":
{
var ds = event.icon.data('xModFrequency');
ds.SetGateThreshold(value);
ds.SetGateEnabled(value != -80);
}
break;
case "boost":
{
var ds = event.icon.data('xModFrequency');
ds.SetBoost(value);
}
break;
}
}
function MakeDs()
{
var ds = {
FREQUENCY_RESPONSE_URI: "http://two-play.com/plugins/toob#frequencyResponseVector",
UI_STATE_URI: "http://two-play.com/plugins/toob-input_stage#uiState",
SpectrumDiv: event.icon.find('.toob_frequency_response'),
attached: false,
vuAttached: false,
gainAttached: false,
OnGainScriptLoaded: function(data,status)
{
eval(data);
if (ToobGain && !this.gainAttached)
{
this.gainAttached = true;
this.ToobGain = ToobGain;
this.gain = this.ToobGain.CreateWrapper(this.GainDiv,48,48);
this.gain.SetValue(this.boost);
}
},
OnVuScriptLoaded: function(data,status)
{
eval(data);
if (ToobVu && !this.vuAttached)
{
this.vuAttached = true;
this.ToobVu = ToobVu;
this.vu = this.ToobVu.CreateWrapper(this.VuDiv,1,48,130,-80,10,12);
}
},
gateThreshold: -192,
gateEnabled: false,
SetGateThreshold: function(value)
{
this.gateThreshold = value;
if (this.vu)
{
this.vu.SetGateThreshold(value);
}
},
SetGateEnabled: function(enabled)
{
this.gateEnabled = enabled;
if (this.vu)
{
this.vu.SetGateEnabled(enabled);
}
},
boost: 0,
SetBoost: function(value)
{
this.boost = value;
if (this.gain)
{
this.gain.SetValue(value);
}
},
OnFrequencyScriptLoaded: function(data,status)
{
eval(data);
if (ToobFrequencyPlot && !ds.attached)
{
ds.ToobFrequencyPlot = ToobFrequencyPlot;
ds.attached = true;
ds.frequencyPlot = ToobFrequencyPlot.CreateWrapper(this.SpectrumDiv,178,78);
}
this.MaybeDrawResponse();
},
MaybeDrawResponse: function() {
if (this.frequencyPlot && this.values)
{
this.frequencyPlot.SetValues(this.values);
}
},
VuDiv: event.icon.find('.toob_vu'),
GainDiv: event.icon.find('.toob_gain'),
UpdateFrequencyResults: function(values)
{
this.values = values;
this.MaybeDrawResponse();
},
UpdateUiState: function(values)
{
var vuLevel = values[0];
var gateState = values[1];
if (this.vu)
{
this.vu.UpdateValue(vuLevel,gateState);
}
}
};
return ds;
}
function handle_property(uri, value)
{
var ds = event.icon.data('xModFrequency');
if (uri == ds.FREQUENCY_RESPONSE_URI)
{
ds.UpdateFrequencyResults(value);
} else if (uri == ds.UI_STATE_URI)
{
ds.UpdateUiState(value);
}
}
if (event.type == 'start') {
//debugger;
if (event.api_version < 2)
{
alert("Requires mod-ui Javascript API 2.0 or later.");
}
// var dpy = event.icon.find('[mod-role=frequency-display]');
var ds = MakeDs();
event.icon.data('xModFrequency', ds);
LoadScripts(ds);
var ports = event.ports;
for (var p in ports) {
handle_event(ports[p].symbol, ports[p].value);
}
// refresh the frequency display if not first load.
jsFuncs.patch_get(ds.FREQUENCY_RESPONSE_URI);
}
else if (event.type == 'change') {
if (event.symbol)
{
handle_event (event.symbol, event.value);
} else {
handle_property(event.uri,event.value);
}
} else {
//debugger;
}
};
@@ -0,0 +1,257 @@
method = function (event,jsFuncs) {
function LoadScripts(ds)
{
var script = event.icon.find("#ToobFrequencyScript");
$.get(script[0].src, function(data,status) {
ds.OnFrequencyScriptLoaded.apply(ds,[data,status]);
});
script = event.icon.find("#ToobVuScript");
$.get(script[0].src, function(data,status) {
ds.OnVuScriptLoaded.apply(ds,[data,status]);
});
script = event.icon.find("#ToobGainScript");
$.get(script[0].src, function(data,status) {
ds.OnGainScriptLoaded.apply(ds,[data,status]);
});
}
function handle_event (symbol, value) {
var ds;
switch (symbol) {
case "gain1":
{
ds = event.icon.data('xModFrequency');
ds.SetGain(0,value);
}
break;
case "gain2":
{
ds = event.icon.data('xModFrequency');
ds.SetGain(1,value);
}
break;
case "gain3":
{
ds = event.icon.data('xModFrequency');
ds.SetGain(2,value);
}
break;
case "boost":
{
ds = event.icon.data('xModFrequency');
ds.SetBoost(value);
}
break;
}
}
function MakeDs()
{
var ds = {
UI_STATE_URI: "http://two-play.com/plugins/toob-power-stage#uiState",
SpectrumDiv: event.icon.find('.toob_frequency_response'),
icon: event.icon,
attached: false,
vuAttached: false,
gainAttached: false,
OnGainScriptLoaded: function(data,status)
{
eval(data);
if (ToobGain && !this.gainAttached)
{
this.gainAttached = true;
this.ToobGain = ToobGain;
this.gainControls = [];
var divs = event.icon.find('.toob_gain');
var self = this;
divs.each(function (i)
{
self.gainControls[i] = self.ToobGain.CreateWrapper($(this),48,48);
self.gainControls[i].SetValue(self.gains[i]);
});
}
},
gains: [1E-7,1E-7,1E-7],
SetGain: function(gainStage,value)
{
this.gains[gainStage] = value;
if (this.gainControls)
{
this.gainControls[gainStage].SetValue(value);
}
},
SAG_METER_SIZE: { width: 2, height: 44},
sagRects: [],
DrawSagMeters: function(selector)
{
var self = this;
var targetFill = { fill: "#044", stroke: 'none'};
selector.each(function (i) {
var meter = $(this);
meter.svg({onLoad: function (svg) {
self.sagRects[i] = svg.rect(0,0,
self.SAG_METER_SIZE.width,self.SAG_METER_SIZE.height,
0,0,
targetFill);
}});
});
$(this)
},
OnVuScriptLoaded: function(data,status)
{
eval(data);
if (ToobVu && !this.vuAttached)
{
this.vuAttached = true;
this.ToobVu = ToobVu;
this.vuControls = [];
var microVus = this.icon.find('.toob_micro_vu');
var self = this;
microVus.each(function (i)
{
self.vuControls[i] = self.ToobVu.CreateWrapper($(this),1,20,66,-30,10,0,true);
self.vuControls[i].UpdateValue(self.vus[i]);
});
var masterVu = this.icon.find('.toob_large_vu');
this.vuControls[3] = this.ToobVu.CreateWrapper(masterVu,1,48,206,-80,10,12);
this.vuControls[3].UpdateValue(this.vus[3]);
}
},
vuControls: null,
vus: [0,0,0,0],
SetVu: function(i,value)
{
this.vus[i] = value;
if (this.vuControls)
{
this.vuControls[i].UpdateValue(value);
}
},
sag: 0,
sagD: 0,
SetSag: function(value)
{
this.sag = value;
var rect = this.sagRects[0];
if (rect != undefined)
{
var y = this.SAG_METER_SIZE.height*this.sag;
rect.setAttribute("top",y,"");
rect.setAttribute("height",this.SAG_METER_SIZE.height-y,"");
}
},
SetSagD: function(value)
{
this.sagD = value;
var rect = this.sagRects[1];
if (rect != undefined)
{
var y = this.SAG_METER_SIZE.height*(this.sagD);
rect.setAttribute("top",y,"");
rect.setAttribute("height",this.SAG_METER_SIZE.height-y,"");
}
},
OnFrequencyScriptLoaded: function(data,status)
{
eval(data);
if (ToobFrequencyPlot && !ds.attached)
{
ds.ToobFrequencyPlot = ToobFrequencyPlot;
ds.attached = true;
ds.frequencyPlot = ToobFrequencyPlot.CreateWrapper(this.SpectrumDiv,178,78);
}
this.MaybeDrawResponse();
},
MaybeDrawResponse: function() {
if (this.frequencyPlot && this.values)
{
this.frequencyPlot.SetValues(this.values);
}
},
UpdateFrequencyResults: function(values)
{
this.values = values;
this.MaybeDrawResponse();
},
UpdateUiState: function(values)
{
for (var i = 0; i < 4; ++i)
{
this.SetVu(i,values[i]);
}
this.SetSag(values[4]);
this.SetSagD(values[5]);
}
};
ds.DrawSagMeters(event.icon.find(".toob-sag-meter"));
return ds;
}
function handle_property(uri, value)
{
var ds = event.icon.data('xModFrequency');
if (uri == ds.FREQUENCY_RESPONSE_URI)
{
ds.UpdateFrequencyResults(value);
} else if (uri == ds.UI_STATE_URI)
{
ds.UpdateUiState(value);
}
}
if (event.type == 'start') {
debugger;
// var dpy = event.icon.find('[mod-role=frequency-display]');
var ds = MakeDs();
event.icon.data('xModFrequency', ds);
LoadScripts(ds);
var ports = event.ports;
for (var p in ports) {
handle_event(ports[p].symbol, ports[p].value);
}
}
else if (event.type == 'change') {
if (event.symbol)
{
handle_event (event.symbol, event.value);
} else {
handle_property(event.uri,event.value);
}
} else {
//debugger;
}
};
@@ -0,0 +1,130 @@
method = function (event,jsFuncs) {
function LoadScripts(ds)
{
var script = event.icon.find("#ToobFrequencyScript");
$.get(script[0].src, function(data,status) {
ds.OnFrequencyScriptLoaded.apply(ds,[data,status]);
});
}
function handle_event (symbol, value) {
switch (symbol) {
case "gate_t":
{
var ds = event.icon.data('xModFrequency');
ds.SetGateThreshold(value);
ds.SetGateEnabled(value != -80);
}
break;
case "boost":
{
var ds = event.icon.data('xModFrequency');
ds.SetBoost(value);
}
break;
}
}
function MakeDs()
{
var ds = {
FREQUENCY_RESPONSE_URI: "http://two-play.com/plugins/toob#frequencyResponseVector",
UI_STATE_URI: "http://two-play.com/plugins/toob-tone-stack#uiState",
SpectrumDiv: event.icon.find('.toob_tonestack_fresp'),
attached: false,
OnFrequencyScriptLoaded: function(data,status)
{
eval(data);
if (ToobFrequencyPlot && !ds.attached)
{
//debugger;
ds.ToobFrequencyPlot = ToobFrequencyPlot;
ds.attached = true;
ds.frequencyPlot = ToobFrequencyPlot.CreateWrapper(this.SpectrumDiv,176,86,-25,3);
}
this.MaybeDrawResponse();
},
MaybeDrawResponse: function() {
if (this.frequencyPlot && this.values)
{
this.frequencyPlot.SetValues(this.values);
}
},
VuDiv: event.icon.find('.cabsim_vu'),
UpdateFrequencyResults: function(values)
{
this.values = values;
this.MaybeDrawResponse();
},
UpdateUiState: function(values)
{
var vuLevel = values[0];
var gateState = values[1];
if (this.vu)
{
this.vu.UpdateValues([ values[0], values[1] ],gateState);
}
}
};
return ds;
}
function handle_property(uri, value)
{
var ds = event.icon.data('xModFrequency');
if (uri == ds.FREQUENCY_RESPONSE_URI)
{
ds.UpdateFrequencyResults(value);
} else if (uri == ds.UI_STATE_URI)
{
ds.UpdateUiState(value);
}
}
if (event.type == 'start') {
//debugger;
if (event.api_version < 2)
{
alert("Requires mod-ui Javascript API 2.0 or later.");
}
// var dpy = event.icon.find('[mod-role=frequency-display]');
var ds = MakeDs();
event.icon.data('xModFrequency', ds);
LoadScripts(ds);
var ports = event.ports;
for (var p in ports) {
handle_event(ports[p].symbol, ports[p].value);
}
// refresh the frequency display if not first load.
jsFuncs.patch_get(ds.FREQUENCY_RESPONSE_URI);
}
else if (event.type == 'change') {
if (event.symbol)
{
handle_event (event.symbol, event.value);
} else {
handle_property(event.uri,event.value);
}
} else {
//debugger;
}
};
@@ -0,0 +1,542 @@
/* SKINS */
.mod-rack-reaktor{{{cns}}} {
background-image:url(/resources/racks/reaktor/reaktor.png{{{ns}}});
background-position:center center;
background-repeat:no-repeat;
font-family:Helvetica,Arial,Sans-serif;
height:255px;
position:relative;
width:458px;
}
.mod-rack-power-stage{{{cns}}} {
background-image:url(/resources/racks/reaktor/PowerStage.png{{{ns}}});
width:701px;
}
.mod-rack-cab-sim{{{cns}}} {
background-image:url(/resources/racks/reaktor/CabSimulator.png{{{ns}}});
width:458px;
}
.mod-rack-tone-stack{{{cns}}} {
background-image:url(/resources/racks/reaktor/ToneStack.png{{{ns}}});
width:341px;
}
/* THE AUTHOR */
.mod-rack-reaktor{{{cns}}} .mod-plugin-brand h1 {
color:#fff;
font-size:14px;
left:70px;
line-height:1;
margin:0;
position:absolute;
top:20px;
}
/* PLUGIN'S NAME */
.mod-rack-reaktor{{{cns}}} .mod-plugin-name h1 {
color:#fff;
font-size:18px;
left:75px;
top:26px;
opacity: 0.6;
line-height:1;
margin:0;
position:absolute;
}
/* INPUT/OUTPUT */
.mod-rack-reaktor{{{cns}}} .mod-pedal-input {
top:25px;
}
.mod-rack-reaktor{{{cns}}} .mod-pedal-output {
top:25px;
}
/* CONTROLS */
.mod-rack-reaktor{{{cns}}} .mod-control-group {
bottom:15px;
color:#fff;
font-size:10px;
height:210px;
bottom: 15px;
left:32px;
position:absolute;
right:32px;
z-index: 30;
}
.mod-rack-reaktor{{{cns}}} .mod-control-group > div {
margin-right:4px;
}
/* SWITCH ON/OFF GENERAL */
.mod-rack-reaktor{{{cns}}} .mod-switch {
cursor:pointer;
float:left;
height:73px;
position:relative;
width:73px;
}
.mod-rack-reaktor{{{cns}}} .mod-switch-image {
background-image:url(/resources/switches/switch-001.png{{{ns}}});
background-position:-9px 0px;
background-repeat:no-repeat;
background-size:auto 73px;
height:73px;
width:73px;
}
.mod-rack-reaktor{{{cns}}} .mod-switch-image.on {
background-position:-82px 0px;
}
.mod-rack-reaktor{{{cns}}} .mod-switch-image.off {
background-position:-9px 0px;
}
/* SMALL CONTROL */
.mod-rack-reaktor{{{cns}}} .mod-bakelite-small {
float:left;
height:52px;
overflow:hidden;
position:relative;
text-align:center;
width:46px;
}
.mod-rack-reaktor{{{cns}}} .mod-bakelite-small .mod-bakelite-image {
background-image:url(/resources/knobs/bakelite/_strip.png{{{ns}}});
background-position:left 0px;
background-repeat:no-repeat;
background-size:auto 36px;
height:36px;
margin-top:0px;
position:relative;
width:36px;
margin-left: 5px;
margin-right: 5px;
z-index:2;
}
.mod-rack-reaktor{{{cns}}} .mod-bakelite-small .mod-bakelite-title {
font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;
opacity: 0.5;
font-size:9px;
font-weight:bold;
height:16px;
left:0;
overflow:hidden;
position:absolute;
right:0;
text-transform:uppercase;
top:37px;
z-index:1;
}
/* MEDIUM CONTROL */
.mod-rack-reaktor{{{cns}}} .mod-bakelite {
float:left;
height:70px;
overflow:hidden;
position:relative;
text-align:center;
width:60px;
}
.mod-rack-reaktor{{{cns}}} .mod-bakelite .mod-bakelite-image {
background-image:url(/resources/knobs/bakelite/_strip.png{{{ns}}});
background-position:left 0px;
background-repeat:no-repeat;
background-size:auto 50px;
height:50px;
margin-top:0px;
position:relative;
width:50px;
margin-left: 5px;
margin-right: 5px;
z-index:2;
}
.mod-rack-reaktor{{{cns}}} .mod-bakelite .mod-bakelite-title {
font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;
opacity: 0.5;
font-size:10px;
font-weight:bold;
height:16px;
left:0;
overflow:hidden;
position:absolute;
right:0;
text-transform:uppercase;
top:49px;
z-index:1;
}
/* ENUMERATED LIST */
.mod-rack-reaktor{{{cns}}} .mod-enumerated {
display:inline-block;
overflow:hidden;
position:absolute;
top:-42px;
}
.mod-rack-reaktor{{{cns}}} .mod-enumerated.mod-enumerated-1 {
left:135px;
width:326px;
}
.mod-rack-reaktor{{{cns}}} .mod-enumerated.mod-enumerated-2 {
left:476px;
width:326px;
}
.mod-rack-reaktor{{{cns}}} .mod-enumerated.mod-enumerated-3 {
left:820px;
width:98px;
}
.mod-rack-reaktor{{{cns}}} .mod-enumerated .mod-enumerated-selected {
background-color:rgba(255,255,255,.2);
background-image:url(/resources/utils/dropdown-arrow-white.png{{{ns}}});
background-position:right center;
background-repeat:no-repeat;
border-radius:4px;
box-shadow:inset 1px 1px 5px #000;
color:#fff;
font-size:14px;
height:34px;
line-height:2.5;
margin-right:8px;
overflow:hidden;
padding:0 9px;
}
/* WHEN IS HOVER */
.mod-rack-reaktor{{{cns}}} .mod-enumerated:hover .mod-enumerated-selected {
border-radius:4px 4px 0 0;
}
/* THE LIST OF OPTIONS */
.mod-rack-reaktor{{{cns}}} .mod-enumerated .mod-enumerated-list {
display:none;
background:rgba(0,0,0,.9);
height:85px;
overflow:auto;
position:relative;
z-index:3;
font-weight:bold;
}
.mod-rack-reaktor{{{cns}}} .mod-enumerated .mod-enumerated-list > div {
padding:3px 9px;
}
.mod-rack-reaktor{{{cns}}} .mod-enumerated .mod-enumerated-list > div:hover {
background:rgba(255,255,255,.2);
cursor:pointer;
}
.mod-rack-reaktor{{{cns}}} .mod-enumerated.mod-enumerated-1:hover .mod-enumerated-list,
.mod-rack-reaktor{{{cns}}} .mod-enumerated.mod-enumerated-2:hover .mod-enumerated-list {
width:318px;
}
.mod-rack-reaktor{{{cns}}} .mod-enumerated.mod-enumerated-3:hover .mod-enumerated-list {
width:90px;
}
/* SEPARATOR */
.mod-rack-reaktor{{{cns}}} .mod-separator {
background:#bbb;
border-color:#000;
border-style:solid;
border-width:0 1px 0 0;
display:inline-block;
float:left;
height:69px;
margin-top:2px;
width:1px;
}
.toob_logo_head {
background-image:url(/resources/img/toob_logo.png{{{ns}}});
background-position:left 0px;
background-repeat:no-repeat;
background-size:auto 32px;
height:32px;
width: 20px;
margin-bottom: 0px;
z-index:2;
left:50px;
top: 20px;
margin:0;
position:absolute;
}
.toob_column {
display: flex;
flex-shrink: 0;
flex-grow: 0;
align-self: flex-end;
}
.toob_column_grid {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: flex-start;
align-items: flex-end;
}
.toob_column_row {
display: flex;
flex: 1;
align-self: center;
}
.toob_row_grid {
display: flex;
flex-direction: column;
flex-wrap: nowrap;
justify-content: center;
align-items: center;
}
.mod-rack-reaktor{{{cns}}} .toob_frequency_response {
position: relative;
width: 180px;
height: 60px;
background: #001414;
margin-bottom: 2px;
border-top: 1px solid Black;
border-bottom: 1px solid #666;
border-left: 1px solid #222;
border-right: 1px solid #333;
overflow: hidden;
}
.mod-rack-reaktor{{{cns}}} .toob_frequency_response .hasSVG {
overflow: hidden;
position: absolute;
top: 0px;
left: 0px;
width: 178px;
height: 58px;
}
.mod-rack-reaktor{{{cns}}} .toob_frequency_response svg {
overflow: hidden;
position: relative;
top: 0px;
left: 0px;
width: 178px;
height: 58px;
}
.mod-rack-reaktor{{{cns}}} .toob_cabsim_fresp {
position: relative;
width: 240px;
height: 60px;
margin-bottom: 2px;
margin-top: 8px;
}
.mod-rack-reaktor{{{cns}}} .toob_frequency_response.toob_tonestack_fresp {
margin-bottom: 10px;
height: 90px;
}
.mod-rack-reaktor{{{cns}}} .toob_cabsim_fresp .hasSVG {
width: 238px; height: 56px;
}
.mod-rack-reaktor{{{cns}}} .toob_cabsim_fresp svg {
width: 238px; height: 56px;
}
.mod-rack-reaktor{{{cns}}} .toob_tonestack_fresp .hasSVG {
width: 176px; height: 86px;
}
.mod-rack-reaktor{{{cns}}} .toob_tonestack_fresp svg {
width: 176px; height: 86px;
}
.mod-rack-reaktor{{{cns}}} .toob_scope_background {
stroke: #011;
stroke-width: 0.5;
fill: none;
}
.mod-rack-reaktor{{{cns}}} .toob_scope_line {
stroke: #AA0;
stroke-width: 0.5;
fill: none;
}
.mod-rack-reaktor{{{cns}}} .toob_yaxis_major {
stroke: #066;
stroke-width: 0.5;
fill: none;
}
.mod-rack-reaktor{{{cns}}} .toob_yaxis_major {
stroke: #066;
stroke-width: 0.25;
fill: none;
}
.mod-rack-reaktor{{{cns}}} .toob_vu {
width: 48px;
height: 130px;
margin-bottom: 4px;
background: transparent;
text-align: center;
position: relative;
}
.mod-rack-reaktor{{{cns}}} .toob_vu .hasSVG {
overflow: hidden;
position: absolute;
top: 0px;
left: 0px;
width: 48px;
height: 130px;
}
.mod-rack-reaktor{{{cns}}} .toob_vu svg {
overflow: hidden;
position: relative;
top: 0px;
left: 0px;
width: 48px;
height: 130px;
}
.mod-rack-reaktor{{{cns}}} .toob_micro_vu {
width: 20px; height:66px;
margin-right: 40px;
margin-bottom: 4px;
background: transparent;
text-align: center;
position: relative;
}
.mod-rack-reaktor{{{cns}}} .toob_micro_vu .hasSVG {
overflow: hidden;
position: absolute;
top: 0px;
left: 0px;
width: 20px; height:66px;
}
.mod-rack-reaktor{{{cns}}} .toob_micro_vu svg {
overflow: hidden;
position: relative;
top: 0px;
left: 0px;
width: 20px; height:66px;
}
.mod-rack-reaktor{{{cns}}} .toob_large_vu {
width: 48px; height:206px;
margin-bottom: 4px;
background: transparent;
text-align: center;
position: relative;
}
.mod-rack-reaktor{{{cns}}} .toob_large_vu .hasSVG {
overflow: hidden;
position: absolute;
top: 0px;
left: 0px;
width: 48px; height:206px;
}
.mod-rack-reaktor{{{cns}}} .toob_large_vu svg {
overflow: hidden;
position: relative;
top: 0px;
left: 0px;
width: 48px; height:206px;
}
.mod-rack-reaktor{{{cns}}} .toob_gain {
width: 50px;
height: 50px;
margin-bottom: 4px;
background: transparent;
text-align: center;
position: relative;
border-top: 1px solid Black;
border-bottom: 1px solid #666;
border-left: 1px solid #222;
border-right: 1px solid #333;
background: #001414;
}
.mod-rack-reaktor{{{cns}}} .toob_gain_power-stage {
margin-top: 16px;
margin-left: 5px;
margin-right: 5px;
}
.mod-rack-reaktor{{{cns}}} .toob_gain .hasSVG {
overflow: hidden;
position: absolute;
top: 0px;
left: 0px;
width: 48px;
height: 48px;
}
.mod-rack-reaktor{{{cns}}} .toob_gain svg {
overflow: hidden;
position: relative;
top: 0px;
left: 0px;
width: 48px;
height: 48px;
}
.mod-rack-reaktor{{{cns}}} .toob-amp-model{
width: 97px; height: 32px;
margin-bottom: 4px;
}
.mod-rack-reaktor{{{cns}}} .toob-amp-model-image {
background-image:url(/resources/switches/AmpModel.png{{{ns}}}) !important;
width: 97px; height: 32px;
background-repeat:no-repeat;
background-size: 97px 64px;
}
.mod-rack-reaktor{{{cns}}} .toob-amp-model-image.on {
background-position-y: -32px;
}
.mod-rack-reaktor{{{cns}}} .toob-sag-meter {
width: 4px; height: 46px; margin-top: 4px; margin-bottom: 22px; padding: 1px; background: #000;
}
.mod-rack-reaktor{{{cns}}} .toob-sag-meter.hasSVG {
}
.mod-rack-reaktor{{{cns}}} .toob-sag-meter svg {
width: 2px; height: 44px;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 977 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File
Executable
+1
View File
@@ -0,0 +1 @@
cp -R /usr/lib/lv2/ToobAmp.lv2/ ./lv2/aarch64/
+1 -1
View File
@@ -33,7 +33,7 @@ set(LIBNL3_LIBRARIES nl-3 nl-genl-3)
pkg_check_modules(SYSTEMD "systemd")
if(!SYSTEMD_FOUND)
message(ERROR "libsystemd-dev package not installed.")
message(STATUS "libsystemd-dev package not installed.")
endif()
+102 -31
View File
@@ -126,17 +126,6 @@ void StopService(bool excludeShutdownService = false)
}
}
void Uninstall()
{
StopService();
DisableService();
silentSysExec(SYSTEMCTL_BIN " stop jack");
silentSysExec(SYSTEMCTL_BIN " disable jack");
std::filesystem::remove("/usr/bin/systemd/system/" SHUTDOWN_SERVICE ".service");
std::filesystem::remove("/usr/bin/systemd/system/" NATIVE_SERVICE ".service");
std::filesystem::remove("/usr/bin/systemd/system/" JACK_SERVICE ".service");
}
void StartService(bool excludeShutdownService = false)
{
@@ -196,9 +185,63 @@ static bool userExists(const char *userName)
return true;
}
static void RemoveLine(const std::string&path, const std::string lineToRemove)
{
std::string newLine = PAM_LINE;
std::vector<std::string> lines;
try
{
if (std::filesystem::exists(path))
{
{
ifstream f(path);
if (!f.is_open())
{
throw PiPedalException((std::stringstream() << "Can't open " << path).str());
}
while (true)
{
std::string line;
if (f.eof())
break;
std::getline(f, line);
if (line != lineToRemove)
{
lines.push_back(line);
}
}
}
{
std::ofstream f(path);
if (!f.is_open())
{
throw PiPedalException("Can't write to file.");
}
for (auto&line: lines)
{
f << line << endl;
}
}
}
}
catch (const std::exception &e)
{
cout << "Failed to update " << path << ". " << e.what();
}
}
const std::string PAM_LINE = "JACK_PROMISCUOUS_SERVER DEFAULT=" JACK_SERVICE_GROUP_NAME;
void UninstallPamEnv()
{
RemoveLine(
"/etc/security/pam_env.conf",
PAM_LINE
);
}
void InstallPamEnv()
{
std::string newLine = "JACK_PROMISCUOUS_SERVER DEFAULT=" JACK_SERVICE_GROUP_NAME;
std::string newLine = PAM_LINE;
std::vector<std::string> lines;
std::filesystem::path path = "/etc/security/pam_env.conf";
try
@@ -209,7 +252,7 @@ void InstallPamEnv()
ifstream f(path);
if (!f.is_open())
{
throw PiPedalException("Can't open pam_env.conf");
throw PiPedalException((std::stringstream() << "Can't open " << path).str());
}
while (true)
{
@@ -256,7 +299,7 @@ void InstallLimits()
throw PiPedalException("Failed to create audio service group.");
}
std::filesystem::path limitsConfig = "/usr/security/audio.conf";
std::filesystem::path limitsConfig = "/usr/security/pipedal.conf";
if (!std::filesystem::exists(limitsConfig))
{
@@ -267,6 +310,16 @@ void InstallLimits()
}
}
void UninstallLimits()
{
std::filesystem::path limitsConfig = "/usr/security/pipedal.conf";
if (std::filesystem::exists(limitsConfig))
{
std::filesystem::remove(limitsConfig);
}
}
void MaybeStartJackService()
{
std::filesystem::path drcFile = "/etc/jackdrc";
@@ -315,6 +368,41 @@ void InstallJackService()
MaybeStartJackService();
}
int SudoExec(char **argv)
{
int pbPid;
int returnValue = 0;
if ((pbPid = fork()) == 0)
{
execv(argv[0], argv);
exit(-1);
}
else
{
waitpid(pbPid, &returnValue, 0);
int exitStatus = WEXITSTATUS(returnValue);
return exitStatus;
}
}
void Uninstall()
{
StopService();
DisableService();
silentSysExec(SYSTEMCTL_BIN " stop jack");
silentSysExec(SYSTEMCTL_BIN " disable jack");
std::filesystem::remove("/usr/bin/systemd/system/" SHUTDOWN_SERVICE ".service");
std::filesystem::remove("/usr/bin/systemd/system/" NATIVE_SERVICE ".service");
std::filesystem::remove("/usr/bin/systemd/system/" JACK_SERVICE ".service");
UninstallPamEnv();
UninstallLimits();
sysExec(SYSTEMCTL_BIN " daemon-reload");
}
void Install(const std::filesystem::path &programPrefix, const std::string endpointAddress)
{
if (sysExec(GROUPADD_BIN " -f " AUDIO_SERVICE_GROUP_NAME) != EXIT_SUCCESS)
@@ -473,23 +561,6 @@ void Install(const std::filesystem::path &programPrefix, const std::string endpo
cout << "Complete" << endl;
}
int SudoExec(char **argv)
{
int pbPid;
int returnValue = 0;
if ((pbPid = fork()) == 0)
{
execv(argv[0], argv);
exit(-1);
}
else
{
waitpid(pbPid, &returnValue, 0);
int exitStatus = WEXITSTATUS(returnValue);
return exitStatus;
}
}
int main(int argc, char **argv)
{