@@ -0,0 +1,56 @@ | |||||
@prefix mod: <http://moddevices.com/ns/mod#> . | |||||
@prefix modgui: <http://moddevices.com/ns/modgui#> . | |||||
@prefix lv2: <http://lv2plug.in/ns/lv2core#> . | |||||
@prefix ui: <http://lv2plug.in/ns/extensions/ui#> . | |||||
<http://distrho.sf.net/plugins/MVerb> | |||||
mod:brand "DISTRHO" ; | |||||
mod:label "MVerb" ; | |||||
modgui:gui [ | |||||
modgui:resourcesDirectory <modgui> ; | |||||
modgui:iconTemplate <modgui/icon-mverb.html> ; | |||||
modgui:stylesheet <modgui/stylesheet-mverb.css> ; | |||||
modgui:screenshot <modgui/screenshot-mverb.png> ; | |||||
modgui:thumbnail <modgui/thumbnail-mverb.png> ; | |||||
modgui:brand "Martin Eastwood" ; | |||||
modgui:label "MVerb" ; | |||||
modgui:model "combo-model-001" ; | |||||
modgui:panel "0930" ; | |||||
modgui:port [ | |||||
lv2:index 0 ; | |||||
lv2:symbol "mix" ; | |||||
lv2:name "MIX" ; | |||||
] , [ | |||||
lv2:index 1 ; | |||||
lv2:symbol "predelay" ; | |||||
lv2:name "PRE" ; | |||||
] , [ | |||||
lv2:index 2 ; | |||||
lv2:symbol "earlymix" ; | |||||
lv2:name "EL/MIX" ; | |||||
] , [ | |||||
lv2:index 3 ; | |||||
lv2:symbol "size" ; | |||||
lv2:name "SIZE" ; | |||||
] , [ | |||||
lv2:index 4 ; | |||||
lv2:symbol "density" ; | |||||
lv2:name "DENSITY" ; | |||||
] , [ | |||||
lv2:index 5 ; | |||||
lv2:symbol "bandwidth" ; | |||||
lv2:name "BAND" ; | |||||
] , [ | |||||
lv2:index 6 ; | |||||
lv2:symbol "decay" ; | |||||
lv2:name "DECAY" ; | |||||
] , [ | |||||
lv2:index 7 ; | |||||
lv2:symbol "damping" ; | |||||
lv2:name "DAMP" ; | |||||
] , [ | |||||
lv2:index 8 ; | |||||
lv2:symbol "gain" ; | |||||
lv2:name "GAIN" ; | |||||
] ; | |||||
] . |
@@ -0,0 +1,92 @@ | |||||
<div class="mod-pedal mod-combo-model-001{{{cns}}} mod-combo-model-001-0930{{{cns}}}"> | |||||
<div mod-role="drag-handle" class="mod-drag-handle"></div> | |||||
<div class="mod-plugin-brand"><h1>{{brand}}</h1></div> | |||||
<div class="mod-plugin-name"><h1>{{label}}</h1></div> | |||||
<div class="mod-control-group clearfix"> | |||||
<div class="mod-switch" mod-role="bypass"> | |||||
<div class="mod-switch-image" mod-role="bypass-light"></div> | |||||
</div> | |||||
<div class="mod-separator"></div> | |||||
{{#controls.0}} | |||||
<div class="mod-chicken-head"> | |||||
<div class="mod-chicken-head-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div> | |||||
<span class="mod-chicken-head-title">{{name}}</span> | |||||
</div> | |||||
{{/controls.0}} | |||||
<div class="mod-separator"></div> | |||||
{{#controls.1}} | |||||
<div class="mod-chicken-head"> | |||||
<div class="mod-chicken-head-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div> | |||||
<span class="mod-chicken-head-title">{{name}}</span> | |||||
</div> | |||||
{{/controls.1}} | |||||
{{#controls.2}} | |||||
<div class="mod-chicken-head"> | |||||
<div class="mod-chicken-head-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div> | |||||
<span class="mod-chicken-head-title">{{name}}</span> | |||||
</div> | |||||
{{/controls.2}} | |||||
<div class="mod-separator"></div> | |||||
{{#controls.3}} | |||||
<div class="mod-chicken-head"> | |||||
<div class="mod-chicken-head-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div> | |||||
<span class="mod-chicken-head-title">{{name}}</span> | |||||
</div> | |||||
{{/controls.3}} | |||||
{{#controls.4}} | |||||
<div class="mod-chicken-head"> | |||||
<div class="mod-chicken-head-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div> | |||||
<span class="mod-chicken-head-title">{{name}}</span> | |||||
</div> | |||||
{{/controls.4}} | |||||
{{#controls.5}} | |||||
<div class="mod-chicken-head"> | |||||
<div class="mod-chicken-head-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div> | |||||
<span class="mod-chicken-head-title">{{name}}</span> | |||||
</div> | |||||
{{/controls.5}} | |||||
{{#controls.6}} | |||||
<div class="mod-chicken-head"> | |||||
<div class="mod-chicken-head-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div> | |||||
<span class="mod-chicken-head-title">{{name}}</span> | |||||
</div> | |||||
{{/controls.6}} | |||||
{{#controls.7}} | |||||
<div class="mod-chicken-head"> | |||||
<div class="mod-chicken-head-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div> | |||||
<span class="mod-chicken-head-title">{{name}}</span> | |||||
</div> | |||||
{{/controls.7}} | |||||
<div class="mod-separator"></div> | |||||
{{#controls.8}} | |||||
<div class="mod-chicken-head"> | |||||
<div class="mod-chicken-head-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div> | |||||
<span class="mod-chicken-head-title">{{name}}</span> | |||||
</div> | |||||
{{/controls.8}} | |||||
</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}} | |||||
</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}} | |||||
</div> | |||||
</div> |
@@ -0,0 +1,220 @@ | |||||
/* SKINS */ | |||||
.mod-combo-model-001{{{cns}}} { | |||||
border-radius: 20px; | |||||
} | |||||
.mod-combo-model-001-0550{{{cns}}} { | |||||
background-image: url(/resources/combos/model-001/model-0550.png{{{ns}}}); | |||||
background-position: center center; | |||||
background-repeat: no-repeat; | |||||
height: 200px; | |||||
position: relative; | |||||
width: 550px; | |||||
} | |||||
.mod-combo-model-001-0625{{{cns}}} { | |||||
background-image: url(/resources/combos/model-001/model-0625.png{{{ns}}}); | |||||
background-position: center center; | |||||
background-repeat: no-repeat; | |||||
height: 200px; | |||||
position: relative; | |||||
width: 625px; | |||||
} | |||||
.mod-combo-model-001-0778{{{cns}}} { | |||||
background-image: url(/resources/combos/model-001/model-0778.png{{{ns}}}); | |||||
background-position: center center; | |||||
background-repeat: no-repeat; | |||||
height: 200px; | |||||
position: relative; | |||||
width: 778px; | |||||
} | |||||
.mod-combo-model-001-0930{{{cns}}} { | |||||
background-image: url(/resources/combos/model-001/model-0930.png{{{ns}}}); | |||||
background-position: center center; | |||||
background-repeat: no-repeat; | |||||
height: 200px; | |||||
position: relative; | |||||
width: 930px; | |||||
} | |||||
/* THE AUTHOR */ | |||||
.mod-combo-model-001{{{cns}}} .mod-plugin-brand h1 { | |||||
color: #333; | |||||
font-size: 18px; | |||||
font-weight: bold; | |||||
left: 80px; | |||||
line-height: 1; | |||||
margin: 0; | |||||
position: absolute; | |||||
top: 23px; | |||||
} | |||||
/* PLUGIN'S NAME */ | |||||
.mod-combo-model-001{{{cns}}} .mod-plugin-name h1 { | |||||
color: #333; | |||||
font-size: 18px; | |||||
font-weight: bold; | |||||
line-height: 1; | |||||
margin: 0; | |||||
position: absolute; | |||||
right: 80px; | |||||
top: 23px; | |||||
} | |||||
/* CONTROLS */ | |||||
.mod-combo-model-001{{{cns}}} .mod-control-group { | |||||
border-color: #000; | |||||
border-style: solid; | |||||
border-width: 1px 0 0 0; | |||||
bottom: 149px; | |||||
color: #000; | |||||
font-size: 10px; | |||||
font-weight: bold; | |||||
height: 71px; | |||||
left: 58px; | |||||
position: absolute; | |||||
right: 58px; | |||||
top: 47px; | |||||
} | |||||
.mod-combo-model-001{{{cns}}} .mod-control-group > div { | |||||
margin-right: 2px; | |||||
} | |||||
.mod-combo-model-001{{{cns}}} .mod-pedal-input, | |||||
.mod-combo-model-001{{{cns}}} .mod-pedal-output { | |||||
top: 30px; | |||||
} | |||||
/* SWITCH ON/OFF GENERAL */ | |||||
.mod-combo-model-001{{{cns}}} .mod-switch { | |||||
cursor: pointer; | |||||
float: left; | |||||
height: 71px; | |||||
position: relative; | |||||
width: 130px; | |||||
} | |||||
.mod-combo-model-001{{{cns}}} .mod-switch-image { | |||||
background-image: url(/resources/switches/switch-001.png{{{ns}}}); | |||||
background-position: -9px 0px; | |||||
background-repeat: no-repeat; | |||||
background-size: auto 71px; | |||||
height: 71px; | |||||
width: 71px; | |||||
} | |||||
.mod-combo-model-001{{{cns}}} .mod-switch-image.on { | |||||
background-position: -80px 0px; | |||||
} | |||||
.mod-combo-model-001{{{cns}}} .mod-switch-image.off { | |||||
background-position: -9px 0px; | |||||
} | |||||
/* CHICKEN HEAD */ | |||||
.mod-combo-model-001{{{cns}}} .mod-chicken-head { | |||||
float: left; | |||||
height: 71px; | |||||
overflow: hidden; | |||||
position: relative; | |||||
text-align: center; | |||||
width: 71px; | |||||
} | |||||
.mod-combo-model-001{{{cns}}} .mod-chicken-head .mod-chicken-head-image { | |||||
background-image: url(/resources/knobs/chicken-head/_strip.png{{{ns}}}); | |||||
background-position: left 0px; | |||||
background-repeat: no-repeat; | |||||
background-size: auto 71px; | |||||
height: 71px; | |||||
margin-top: 3px; | |||||
position: relative; | |||||
width: 71px; | |||||
z-index: 2; | |||||
} | |||||
.mod-combo-model-001{{{cns}}} .mod-chicken-head .mod-chicken-head-title { | |||||
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; | |||||
font-size: 10px; | |||||
font-weight: bold; | |||||
height:18px; | |||||
left: 0; | |||||
overflow:hidden; | |||||
position: absolute; | |||||
right: 0; | |||||
text-transform: uppercase; | |||||
top: 0; | |||||
z-index: 1; | |||||
} | |||||
/* ENUMERATED LIST */ | |||||
.mod-combo-model-001{{{cns}}} .mod-enumerated { | |||||
color:#fff; | |||||
display:inline-block; | |||||
left:132px; | |||||
overflow:hidden; | |||||
position:absolute; | |||||
top:-27px; | |||||
width:240px; | |||||
} | |||||
.mod-combo-model-001{{{cns}}} .mod-enumerated .mod-enumerated-selected { | |||||
background-color:rgba(0,0,0,.8); | |||||
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:12px; | |||||
height:24px; | |||||
line-height:2; | |||||
margin-right:8px; | |||||
overflow:hidden; | |||||
padding:0 9px; | |||||
} | |||||
/* WHEN IS HOVER */ | |||||
.mod-combo-model-001{{{cns}}} .mod-enumerated:hover .mod-enumerated-selected { | |||||
border-radius:4px 4px 0 0; | |||||
} | |||||
/* THE LIST OF OPTIONS */ | |||||
.mod-combo-model-001{{{cns}}} .mod-enumerated .mod-enumerated-list { | |||||
display:none; | |||||
font-weight:bold; | |||||
} | |||||
.mod-combo-model-001{{{cns}}} .mod-enumerated .mod-enumerated-list > div { | |||||
padding:3px 9px; | |||||
} | |||||
.mod-combo-model-001{{{cns}}} .mod-enumerated .mod-enumerated-list > div:hover { | |||||
background:rgba(255,255,255,.2); | |||||
cursor:pointer; | |||||
} | |||||
/* WHEN THE LIST IS SHOWING */ | |||||
.mod-combo-model-001{{{cns}}} .mod-enumerated .mod-enumerated-list { | |||||
background:rgba(0,0,0,.9); | |||||
display:none; | |||||
height:85px; | |||||
overflow:auto; | |||||
position:relative; | |||||
width:232px; | |||||
z-index:3; | |||||
} | |||||
/* SEPARATOR */ | |||||
.mod-combo-model-001{{{cns}}} .mod-separator { | |||||
background: #000; | |||||
display: inline-block; | |||||
float: left; | |||||
height: 69px; | |||||
margin-top: 2px; | |||||
width: 1px; | |||||
} |
@@ -0,0 +1,46 @@ | |||||
@prefix modgui: <http://moddevices.com/ns/modgui#> . | |||||
@prefix lv2: <http://lv2plug.in/ns/lv2core#> . | |||||
<http://distrho.sf.net/plugins/Modulay> | |||||
modgui:gui [ | |||||
modgui:resourcesDirectory <modgui> ; | |||||
modgui:iconTemplate <modgui/icon-modulay.html> ; | |||||
modgui:stylesheet <modgui/stylesheet-modulay.css> ; | |||||
modgui:screenshot <modgui/screenshot-modulay.png> ; | |||||
modgui:thumbnail <modgui/thumbnail-modulay.png> ; | |||||
modgui:brand "Shiro" ; | |||||
modgui:label "Modulay" ; | |||||
modgui:model "boxy" ; | |||||
modgui:panel "7-knobs" ; | |||||
modgui:color "racing" ; | |||||
modgui:knob "black" ; | |||||
modgui:port [ | |||||
lv2:index 0 ; | |||||
lv2:symbol "time" ; | |||||
lv2:name "time" ; | |||||
] , [ | |||||
lv2:index 1 ; | |||||
lv2:symbol "repeats" ; | |||||
lv2:name "repeats" ; | |||||
] , [ | |||||
lv2:index 2 ; | |||||
lv2:symbol "cutoff" ; | |||||
lv2:name "cutoff" ; | |||||
] , [ | |||||
lv2:index 3 ; | |||||
lv2:symbol "mix" ; | |||||
lv2:name "mix" ; | |||||
] , [ | |||||
lv2:index 4 ; | |||||
lv2:symbol "depth" ; | |||||
lv2:name "depth" ; | |||||
] , [ | |||||
lv2:index 5 ; | |||||
lv2:symbol "rate" ; | |||||
lv2:name "rate" ; | |||||
] , [ | |||||
lv2:index 6 ; | |||||
lv2:symbol "delay" ; | |||||
lv2:name "delay" ; | |||||
] ; | |||||
] . |
@@ -0,0 +1,49 @@ | |||||
<div class="mod-pedal mod-pedal-boxy{{{cns}}} mod-seven-knobs mod-boxy75 mod-{{color}} {{color}}"> | |||||
<div mod-role="drag-handle" class="mod-drag-handle"></div> | |||||
<div class="mod-plugin-brand"><h1>{{brand}}</h1></div> | |||||
<div class="mod-plugin-name"><h1>{{label}}</h1></div> | |||||
<div class="mod-light on" mod-role="bypass-light"></div> | |||||
<div class="mod-control-group mod-{{knob}} clearfix"> | |||||
{{#controls}} | |||||
<div class="mod-knob"> | |||||
<div class="mod-knob-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div> | |||||
<span class="mod-knob-title">{{name}}</span> | |||||
</div> | |||||
{{/controls}} | |||||
</div> | |||||
<div class="mod-footswitch" mod-role="bypass"></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,13 @@ | |||||
@prefix mod: <http://moddevices.com/ns/mod#>. | |||||
@prefix modgui: <http://moddevices.com/ns/modgui#>. | |||||
<http://distrho.sf.net/plugins/PingPongPan> | |||||
mod:brand "DISTRHO"; | |||||
mod:label "PingPongPan"; | |||||
modgui:gui [ | |||||
modgui:resourcesDirectory <modgui>; | |||||
modgui:iconTemplate <modgui/icon-ppp.html>; | |||||
modgui:stylesheet <modgui/stylesheet-ppp.css>; | |||||
modgui:screenshot <modgui/screenshot-ppp.png>; | |||||
modgui:thumbnail <modgui/thumb-ppp.png>; | |||||
]. |
@@ -0,0 +1,41 @@ | |||||
<div class="pingpongpan mod-pedal mod-pedal-boxy{{{cns}}}"> | |||||
<div mod-role="drag-handle" class="mod-drag-handle"></div> | |||||
<div class="mod-light on" mod-role="bypass-light"></div> | |||||
<div class="mod-control-group clearfix"> | |||||
<div class="mod-knob pingpongpan-knob_freq"> | |||||
<div class="mod-knob-image" mod-role="input-control-port" mod-port-symbol="freq"></div> | |||||
</div> | |||||
<div class="mod-knob pingpongpan-knob_width"> | |||||
<div class="mod-knob-image" mod-role="input-control-port" mod-port-symbol="width"></div> | |||||
</div> | |||||
</div> | |||||
<div class="mod-footswitch" mod-role="bypass"></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}} | |||||
</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-input-image"></div> | |||||
</div> | |||||
{{/effect.ports.midi.output}} | |||||
</div> | |||||
</div> |
@@ -0,0 +1,228 @@ | |||||
/* STYLES FOR THE BOXY PEDAL */ | |||||
@import url(/fonts/nexa/stylesheet.css); | |||||
@import url(/fonts/questrial/stylesheet.css); | |||||
/* = CONTAINER | |||||
================================================ */ | |||||
.mod-pedal-boxy{{{cns}}} { | |||||
background-position:center center; | |||||
background-repeat:no-repeat; | |||||
background-size:230px 431px; | |||||
height:431px; | |||||
position:absolute; | |||||
width:230px; | |||||
border-radius: 26px; | |||||
} | |||||
/* = PLUGIN'S AUTHOR | |||||
================================================ */ | |||||
.mod-pedal-boxy{{{cns}}} .mod-plugin-brand { | |||||
left:0; | |||||
position:absolute; | |||||
right:0; | |||||
text-align:center; | |||||
text-transform:uppercase; | |||||
top:160px; | |||||
} | |||||
.mod-pedal-boxy{{{cns}}} .mod-plugin-brand h1 { | |||||
border-color:#000; | |||||
border-radius:12px; | |||||
border-style:solid; | |||||
border-width:4px; | |||||
display:inline-block; | |||||
font-family:"Nexa"; | |||||
font-size:32px; | |||||
padding:3px 9px 0; | |||||
} | |||||
/* = PLUGIN'S NAME | |||||
================================================ */ | |||||
.mod-pedal-boxy{{{cns}}} .mod-plugin-name { | |||||
left:30px; | |||||
overflow:hidden; | |||||
position:absolute; | |||||
right:30px; | |||||
text-align:center; | |||||
top:340px; | |||||
} | |||||
.mod-pedal-boxy{{{cns}}} .mod-plugin-name h1 { | |||||
font-family:"Questrial"; | |||||
font-size:21px; | |||||
line-height:1; | |||||
} | |||||
/* = LIGHT ON/OFF | |||||
================================================ */ | |||||
.mod-pedal-boxy{{{cns}}} .mod-light { | |||||
background-position:center center; | |||||
background-repeat:no-repeat; | |||||
height:32px; | |||||
left:10px; | |||||
position:absolute; | |||||
right:10px; | |||||
top:235px; | |||||
} | |||||
/* = KNOBS | |||||
================================================ */ | |||||
.mod-pedal-boxy{{{cns}}} .mod-control-group { | |||||
margin:20px; | |||||
position:relative; | |||||
text-align:center; | |||||
z-index:30; | |||||
} | |||||
.mod-pedal-boxy{{{cns}}} .mod-control-group .mod-knob { | |||||
overflow:hidden; | |||||
position:relative; | |||||
} | |||||
.mod-pedal-boxy{{{cns}}} .mod-control-group .mod-knob { | |||||
height:110px; | |||||
} | |||||
.mod-pedal-boxy{{{cns}}} .mod-control-group .mod-knob > span.mod-knob-title { | |||||
bottom:0px; | |||||
display:block; | |||||
font-size:11px; | |||||
font-weight:bold; | |||||
height:12px; | |||||
left:0; | |||||
line-height:1; | |||||
margin:0; | |||||
overflow:hidden; | |||||
padding:0; | |||||
position:absolute; | |||||
right:0; | |||||
text-transform:uppercase; | |||||
} | |||||
/* = ENUMERATED LIST | |||||
================================================ */ | |||||
.mod-pedal-boxy{{{cns}}} .mod-enumerated-group { | |||||
height:31px; | |||||
margin:20px auto 0 !important; | |||||
position:relative; | |||||
width:190px; | |||||
z-index:35; | |||||
} | |||||
.mod-pedal-boxy{{{cns}}} .mod-enumerated { | |||||
background-position:right center; | |||||
background-repeat:no-repeat; | |||||
font-size:11px; | |||||
font-weight:bold; | |||||
left:0; | |||||
line-height:2; | |||||
overflow:hidden; | |||||
position:absolute; | |||||
right:0; | |||||
text-align:left; | |||||
} | |||||
.mod-pedal-boxy{{{cns}}} .mod-enumerated .mod-enumerated-selected { | |||||
background-color:rgba(0,0,0,.3); | |||||
box-shadow:inset 0 0 4px rgba(0,0,0,.3); | |||||
border-radius:4px; | |||||
padding:3px 9px; | |||||
} | |||||
.mod-pedal-boxy{{{cns}}} .mod-enumerated .mod-enumerated-selected { | |||||
border-radius:4px 4px 0 0; | |||||
} | |||||
.mod-pedal-boxy{{{cns}}} .mod-enumerated .mod-enumerated-list { | |||||
display:none; | |||||
color:#fff; | |||||
} | |||||
.mod-pedal-boxy{{{cns}}} .mod-enumerated .mod-enumerated-list { | |||||
background-color:rgba(0,0,0,.9); | |||||
display:none; | |||||
height:115px; | |||||
overflow:auto; | |||||
position:relative; | |||||
} | |||||
.mod-pedal-boxy{{{cns}}} .mod-enumerated .mod-enumerated-list > div { | |||||
padding:3px 9px; | |||||
} | |||||
.mod-pedal-boxy{{{cns}}} .mod-enumerated .mod-enumerated-list > div:hover { | |||||
background-color:rgba(255,255,255,.2); | |||||
cursor:pointer; | |||||
} | |||||
/* STYLES FOR THE PLUGIN */ | |||||
.pingpongpan * { | |||||
color:black !important; | |||||
} | |||||
.pingpongpan { | |||||
background-image:url(/resources/background.png{{{ns}}}) !important; | |||||
background-size:615px 344px; | |||||
width:615px; | |||||
height:344px; | |||||
border-radius: 0; | |||||
} | |||||
.pingpongpan .mod-control-group { | |||||
width:500px; | |||||
height:220px; | |||||
} | |||||
.pingpongpan .mod-control-group .mod-knob { | |||||
height:220px !important; | |||||
} | |||||
.pingpongpan .mod-control-group .mod-knob .mod-knob-image { | |||||
background-image:url(/resources/knob.png{{{ns}}}); | |||||
background-position:left center; | |||||
background-repeat:no-repeat; | |||||
background-size:auto 220px; | |||||
height:220px; | |||||
width:220px; | |||||
margin:0 auto; | |||||
cursor:pointer; | |||||
position:relative; | |||||
overflow:hidden; | |||||
} | |||||
.pingpongpan .mod-control-group .pingpongpan-knob_freq { | |||||
top:55px; | |||||
left:58px; | |||||
position:absolute; | |||||
} | |||||
.pingpongpan .mod-control-group .pingpongpan-knob_width { | |||||
top:55px; | |||||
left:302px; | |||||
position:absolute; | |||||
} | |||||
.pingpongpan .mod-light { | |||||
top:32px; | |||||
left:320px; | |||||
} | |||||
.pingpongpan .mod-footswitch { | |||||
background-image:url(/resources/footswitch.png{{{ns}}}); | |||||
background-position:top center; | |||||
background-repeat:no-repeat; | |||||
background-size:auto 132px; | |||||
top:15px; | |||||
right:55px; | |||||
cursor:pointer; | |||||
height:66px; | |||||
width: 66px; | |||||
position:absolute; | |||||
} | |||||
.pingpongpan .mod-footswitch.on { | |||||
background-position:top center; | |||||
} | |||||
.pingpongpan .mod-footswitch.off { | |||||
background-position:bottom center; | |||||
} | |||||
.pingpongpan .mod-pedal-input , .pingpongpan .mod-pedal-output { | |||||
top: 60px; | |||||
} | |||||
.pingpongpan .mod-pedal-input .mod-input , .pingpongpan .mod-pedal-output .mod-output { | |||||
margin-bottom: 40px !important | |||||
} |
@@ -0,0 +1,42 @@ | |||||
@prefix modgui: <http://moddevices.com/ns/modgui#> . | |||||
@prefix lv2: <http://lv2plug.in/ns/lv2core#> . | |||||
<http://distrho.sf.net/plugins/Pitchotto> | |||||
modgui:gui [ | |||||
modgui:resourcesDirectory <modgui> ; | |||||
modgui:iconTemplate <modgui/icon-pitchotto.html> ; | |||||
modgui:stylesheet <modgui/stylesheet-pitchotto.css> ; | |||||
modgui:screenshot <modgui/screenshot-pitchotto.png> ; | |||||
modgui:thumbnail <modgui/thumbnail-pitchotto.png> ; | |||||
modgui:brand "Shiro" ; | |||||
modgui:label "Pitchotto" ; | |||||
modgui:model "boxy" ; | |||||
modgui:panel "6-knobs" ; | |||||
modgui:color "red" ; | |||||
modgui:knob "black" ; | |||||
modgui:port [ | |||||
lv2:index 0 ; | |||||
lv2:symbol "ratio1" ; | |||||
lv2:name "ratio1" ; | |||||
] , [ | |||||
lv2:index 1 ; | |||||
lv2:symbol "ratio2" ; | |||||
lv2:name "ratio2" ; | |||||
] , [ | |||||
lv2:index 2 ; | |||||
lv2:symbol "mix" ; | |||||
lv2:name "mix" ; | |||||
] , [ | |||||
lv2:index 3 ; | |||||
lv2:symbol "delay1" ; | |||||
lv2:name "delay1" ; | |||||
] , [ | |||||
lv2:index 4 ; | |||||
lv2:symbol "delay2" ; | |||||
lv2:name "delay2" ; | |||||
] , [ | |||||
lv2:index 5 ; | |||||
lv2:symbol "cutoff" ; | |||||
lv2:name "cutoff" ; | |||||
] ; | |||||
] . |
@@ -0,0 +1,49 @@ | |||||
<div class="mod-pedal mod-pedal-boxy{{{cns}}} mod-six-knobs mod-{{color}} {{color}}"> | |||||
<div mod-role="drag-handle" class="mod-drag-handle"></div> | |||||
<div class="mod-plugin-brand"><h1>{{brand}}</h1></div> | |||||
<div class="mod-plugin-name"><h1>{{label}}</h1></div> | |||||
<div class="mod-light on" mod-role="bypass-light"></div> | |||||
<div class="mod-control-group mod-{{knob}} clearfix"> | |||||
{{#controls}} | |||||
<div class="mod-knob"> | |||||
<div class="mod-knob-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div> | |||||
<span class="mod-knob-title">{{name}}</span> | |||||
</div> | |||||
{{/controls}} | |||||
</div> | |||||
<div class="mod-footswitch" mod-role="bypass"></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,50 @@ | |||||
@prefix modgui: <http://moddevices.com/ns/modgui#> . | |||||
@prefix lv2: <http://lv2plug.in/ns/lv2core#> . | |||||
<http://distrho.sf.net/plugins/Shiroverb> | |||||
modgui:gui [ | |||||
modgui:resourcesDirectory <modgui> ; | |||||
modgui:iconTemplate <modgui/icon-shiroverb.html> ; | |||||
modgui:stylesheet <modgui/stylesheet-shiroverb.css> ; | |||||
modgui:screenshot <modgui/screenshot-shiroverb.png> ; | |||||
modgui:thumbnail <modgui/thumbnail-shiroverb.png> ; | |||||
modgui:brand "Shiro" ; | |||||
modgui:label "Shiroverb" ; | |||||
modgui:model "boxy" ; | |||||
modgui:panel "8-knobs" ; | |||||
modgui:color "petrol" ; | |||||
modgui:knob "black" ; | |||||
modgui:port [ | |||||
lv2:index 0 ; | |||||
lv2:symbol "decay" ; | |||||
lv2:name "decay" ; | |||||
] , [ | |||||
lv2:index 1 ; | |||||
lv2:symbol "tail" ; | |||||
lv2:name "tail" ; | |||||
] , [ | |||||
lv2:index 2 ; | |||||
lv2:symbol "damping" ; | |||||
lv2:name "damping" ; | |||||
] , [ | |||||
lv2:index 3 ; | |||||
lv2:symbol "mix" ; | |||||
lv2:name "mix" ; | |||||
] , [ | |||||
lv2:index 4 ; | |||||
lv2:symbol "roomsize" ; | |||||
lv2:name "roomsize" ; | |||||
] , [ | |||||
lv2:index 5 ; | |||||
lv2:symbol "ratio" ; | |||||
lv2:name "ratio" ; | |||||
] , [ | |||||
lv2:index 6 ; | |||||
lv2:symbol "cutoff" ; | |||||
lv2:name "cutoff" ; | |||||
] , [ | |||||
lv2:index 7 ; | |||||
lv2:symbol "shimmer" ; | |||||
lv2:name "shimmer" ; | |||||
] ; | |||||
] . |
@@ -0,0 +1,49 @@ | |||||
<div class="mod-pedal mod-pedal-boxy{{{cns}}} mod-eight-knobs mod-boxy75 mod-{{color}} {{color}}"> | |||||
<div mod-role="drag-handle" class="mod-drag-handle"></div> | |||||
<div class="mod-plugin-brand"><h1>{{brand}}</h1></div> | |||||
<div class="mod-plugin-name"><h1>{{label}}</h1></div> | |||||
<div class="mod-light on" mod-role="bypass-light"></div> | |||||
<div class="mod-control-group mod-{{knob}} clearfix"> | |||||
{{#controls}} | |||||
<div class="mod-knob"> | |||||
<div class="mod-knob-image" mod-role="input-control-port" mod-port-symbol="{{symbol}}"></div> | |||||
<span class="mod-knob-title">{{name}}</span> | |||||
</div> | |||||
{{/controls}} | |||||
</div> | |||||
<div class="mod-footswitch" mod-role="bypass"></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,40 @@ | |||||
/* (Auto-generated binary data file). */ | |||||
#ifndef BINARY_DISTRHOARTWORK3BANDEQ_HPP | |||||
#define BINARY_DISTRHOARTWORK3BANDEQ_HPP | |||||
namespace DistrhoArtwork3BandEQ | |||||
{ | |||||
extern const char* aboutData; | |||||
const unsigned int aboutDataSize = 172710; | |||||
const unsigned int aboutWidth = 303; | |||||
const unsigned int aboutHeight = 190; | |||||
extern const char* aboutButtonHoverData; | |||||
const unsigned int aboutButtonHoverDataSize = 5888; | |||||
const unsigned int aboutButtonHoverWidth = 92; | |||||
const unsigned int aboutButtonHoverHeight = 16; | |||||
extern const char* aboutButtonNormalData; | |||||
const unsigned int aboutButtonNormalDataSize = 5888; | |||||
const unsigned int aboutButtonNormalWidth = 92; | |||||
const unsigned int aboutButtonNormalHeight = 16; | |||||
extern const char* backgroundData; | |||||
const unsigned int backgroundDataSize = 437472; | |||||
const unsigned int backgroundWidth = 392; | |||||
const unsigned int backgroundHeight = 372; | |||||
extern const char* knobData; | |||||
const unsigned int knobDataSize = 15376; | |||||
const unsigned int knobWidth = 62; | |||||
const unsigned int knobHeight = 62; | |||||
extern const char* sliderData; | |||||
const unsigned int sliderDataSize = 6000; | |||||
const unsigned int sliderWidth = 50; | |||||
const unsigned int sliderHeight = 30; | |||||
} | |||||
#endif // BINARY_DISTRHOARTWORK3BANDEQ_HPP | |||||
@@ -0,0 +1,264 @@ | |||||
/* | |||||
* DISTRHO 3BandEQ Plugin, based on 3BandEQ by Michael Gruhn | |||||
* Copyright (C) 2007 Michael Gruhn <michael-gruhn@web.de> | |||||
* Copyright (C) 2012-2015 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* This program is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation. | |||||
* | |||||
* This program is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* GNU Lesser General Public License for more details. | |||||
* | |||||
* For a full copy of the license see the LICENSE file. | |||||
*/ | |||||
#include "DistrhoPlugin3BandEQ.hpp" | |||||
#include <cmath> | |||||
static const float kAMP_DB = 8.656170245f; | |||||
static const float kDC_ADD = 1e-30f; | |||||
static const float kPI = 3.141592654f; | |||||
START_NAMESPACE_DISTRHO | |||||
// ----------------------------------------------------------------------- | |||||
DistrhoPlugin3BandEQ::DistrhoPlugin3BandEQ() | |||||
: Plugin(paramCount, 1, 0) // 1 program, 0 states | |||||
{ | |||||
// set default values | |||||
loadProgram(0); | |||||
// reset | |||||
deactivate(); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
// Init | |||||
void DistrhoPlugin3BandEQ::initParameter(uint32_t index, Parameter& parameter) | |||||
{ | |||||
switch (index) | |||||
{ | |||||
case paramLow: | |||||
parameter.hints = kParameterIsAutomable; | |||||
parameter.name = "Low"; | |||||
parameter.symbol = "low"; | |||||
parameter.unit = "dB"; | |||||
parameter.ranges.def = 0.0f; | |||||
parameter.ranges.min = -24.0f; | |||||
parameter.ranges.max = 24.0f; | |||||
break; | |||||
case paramMid: | |||||
parameter.hints = kParameterIsAutomable; | |||||
parameter.name = "Mid"; | |||||
parameter.symbol = "mid"; | |||||
parameter.unit = "dB"; | |||||
parameter.ranges.def = 0.0f; | |||||
parameter.ranges.min = -24.0f; | |||||
parameter.ranges.max = 24.0f; | |||||
break; | |||||
case paramHigh: | |||||
parameter.hints = kParameterIsAutomable; | |||||
parameter.name = "High"; | |||||
parameter.symbol = "high"; | |||||
parameter.unit = "dB"; | |||||
parameter.ranges.def = 0.0f; | |||||
parameter.ranges.min = -24.0f; | |||||
parameter.ranges.max = 24.0f; | |||||
break; | |||||
case paramMaster: | |||||
parameter.hints = kParameterIsAutomable; | |||||
parameter.name = "Master"; | |||||
parameter.symbol = "master"; | |||||
parameter.unit = "dB"; | |||||
parameter.ranges.def = 0.0f; | |||||
parameter.ranges.min = -24.0f; | |||||
parameter.ranges.max = 24.0f; | |||||
break; | |||||
case paramLowMidFreq: | |||||
parameter.hints = kParameterIsAutomable; | |||||
parameter.name = "Low-Mid Freq"; | |||||
parameter.symbol = "low_mid"; | |||||
parameter.unit = "Hz"; | |||||
parameter.ranges.def = 440.0f; | |||||
parameter.ranges.min = 0.0f; | |||||
parameter.ranges.max = 1000.0f; | |||||
break; | |||||
case paramMidHighFreq: | |||||
parameter.hints = kParameterIsAutomable; | |||||
parameter.name = "Mid-High Freq"; | |||||
parameter.symbol = "mid_high"; | |||||
parameter.unit = "Hz"; | |||||
parameter.ranges.def = 1000.0f; | |||||
parameter.ranges.min = 1000.0f; | |||||
parameter.ranges.max = 20000.0f; | |||||
break; | |||||
} | |||||
} | |||||
void DistrhoPlugin3BandEQ::initProgramName(uint32_t index, String& programName) | |||||
{ | |||||
if (index != 0) | |||||
return; | |||||
programName = "Default"; | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
// Internal data | |||||
float DistrhoPlugin3BandEQ::getParameterValue(uint32_t index) const | |||||
{ | |||||
switch (index) | |||||
{ | |||||
case paramLow: | |||||
return fLow; | |||||
case paramMid: | |||||
return fMid; | |||||
case paramHigh: | |||||
return fHigh; | |||||
case paramMaster: | |||||
return fMaster; | |||||
case paramLowMidFreq: | |||||
return fLowMidFreq; | |||||
case paramMidHighFreq: | |||||
return fMidHighFreq; | |||||
default: | |||||
return 0.0f; | |||||
} | |||||
} | |||||
void DistrhoPlugin3BandEQ::setParameterValue(uint32_t index, float value) | |||||
{ | |||||
if (getSampleRate() <= 0.0) | |||||
return; | |||||
switch (index) | |||||
{ | |||||
case paramLow: | |||||
fLow = value; | |||||
lowVol = std::exp( (fLow/48.0f) * 48.0f / kAMP_DB); | |||||
break; | |||||
case paramMid: | |||||
fMid = value; | |||||
midVol = std::exp( (fMid/48.0f) * 48.0f / kAMP_DB); | |||||
break; | |||||
case paramHigh: | |||||
fHigh = value; | |||||
highVol = std::exp( (fHigh/48.0f) * 48.0f / kAMP_DB); | |||||
break; | |||||
case paramMaster: | |||||
fMaster = value; | |||||
outVol = std::exp( (fMaster/48.0f) * 48.0f / kAMP_DB); | |||||
break; | |||||
case paramLowMidFreq: | |||||
fLowMidFreq = std::fmin(value, fMidHighFreq); | |||||
freqLP = fLowMidFreq; | |||||
xLP = std::exp(-2.0f * kPI * freqLP / (float)getSampleRate()); | |||||
a0LP = 1.0f - xLP; | |||||
b1LP = -xLP; | |||||
break; | |||||
case paramMidHighFreq: | |||||
fMidHighFreq = std::fmax(value, fLowMidFreq); | |||||
freqHP = fMidHighFreq; | |||||
xHP = std::exp(-2.0f * kPI * freqHP / (float)getSampleRate()); | |||||
a0HP = 1.0f - xHP; | |||||
b1HP = -xHP; | |||||
break; | |||||
} | |||||
} | |||||
void DistrhoPlugin3BandEQ::loadProgram(uint32_t index) | |||||
{ | |||||
if (index != 0) | |||||
return; | |||||
// Default values | |||||
fLow = 0.0f; | |||||
fMid = 0.0f; | |||||
fHigh = 0.0f; | |||||
fMaster = 0.0f; | |||||
fLowMidFreq = 220.0f; | |||||
fMidHighFreq = 2000.0f; | |||||
// Internal stuff | |||||
lowVol = midVol = highVol = outVol = 1.0f; | |||||
freqLP = 200.0f; | |||||
freqHP = 2000.0f; | |||||
// reset filter values | |||||
activate(); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
// Process | |||||
void DistrhoPlugin3BandEQ::activate() | |||||
{ | |||||
const float sr = (float)getSampleRate(); | |||||
xLP = std::exp(-2.0f * kPI * freqLP / sr); | |||||
#ifdef DISTRHO_OS_WINDOWS | |||||
// don't ask me why, but this fixes a crash/exception below on windows... | |||||
printf("%f\n", -xLP); | |||||
#endif | |||||
a0LP = 1.0f - xLP; | |||||
b1LP = -xLP; | |||||
xHP = std::exp(-2.0f * kPI * freqHP / sr); | |||||
a0HP = 1.0f - xHP; | |||||
b1HP = -xHP; | |||||
} | |||||
void DistrhoPlugin3BandEQ::deactivate() | |||||
{ | |||||
out1LP = out2LP = out1HP = out2HP = 0.0f; | |||||
tmp1LP = tmp2LP = tmp1HP = tmp2HP = 0.0f; | |||||
} | |||||
void DistrhoPlugin3BandEQ::run(const float** inputs, float** outputs, uint32_t frames) | |||||
{ | |||||
const float* in1 = inputs[0]; | |||||
const float* in2 = inputs[1]; | |||||
float* out1 = outputs[0]; | |||||
float* out2 = outputs[1]; | |||||
for (uint32_t i=0; i < frames; ++i) | |||||
{ | |||||
tmp1LP = a0LP * in1[i] - b1LP * tmp1LP + kDC_ADD; | |||||
tmp2LP = a0LP * in2[i] - b1LP * tmp2LP + kDC_ADD; | |||||
out1LP = tmp1LP - kDC_ADD; | |||||
out2LP = tmp2LP - kDC_ADD; | |||||
tmp1HP = a0HP * in1[i] - b1HP * tmp1HP + kDC_ADD; | |||||
tmp2HP = a0HP * in2[i] - b1HP * tmp2HP + kDC_ADD; | |||||
out1HP = in1[i] - tmp1HP - kDC_ADD; | |||||
out2HP = in2[i] - tmp2HP - kDC_ADD; | |||||
out1[i] = (out1LP*lowVol + (in1[i] - out1LP - out1HP)*midVol + out1HP*highVol) * outVol; | |||||
out2[i] = (out2LP*lowVol + (in2[i] - out2LP - out2HP)*midVol + out2HP*highVol) * outVol; | |||||
} | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
Plugin* createPlugin() | |||||
{ | |||||
return new DistrhoPlugin3BandEQ(); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
END_NAMESPACE_DISTRHO |
@@ -0,0 +1,123 @@ | |||||
/* | |||||
* DISTRHO 3BandEQ Plugin, based on 3BandEQ by Michael Gruhn | |||||
* Copyright (C) 2007 Michael Gruhn <michael-gruhn@web.de> | |||||
* Copyright (C) 2012-2015 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* This program is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation. | |||||
* | |||||
* This program is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* GNU Lesser General Public License for more details. | |||||
* | |||||
* For a full copy of the license see the LICENSE file. | |||||
*/ | |||||
#ifndef DISTRHO_PLUGIN_3BANDEQ_HPP_INCLUDED | |||||
#define DISTRHO_PLUGIN_3BANDEQ_HPP_INCLUDED | |||||
#include "DistrhoPlugin.hpp" | |||||
START_NAMESPACE_DISTRHO | |||||
// ----------------------------------------------------------------------- | |||||
class DistrhoPlugin3BandEQ : public Plugin | |||||
{ | |||||
public: | |||||
enum Parameters | |||||
{ | |||||
paramLow = 0, | |||||
paramMid, | |||||
paramHigh, | |||||
paramMaster, | |||||
paramLowMidFreq, | |||||
paramMidHighFreq, | |||||
paramCount | |||||
}; | |||||
DistrhoPlugin3BandEQ(); | |||||
protected: | |||||
// ------------------------------------------------------------------- | |||||
// Information | |||||
const char* getLabel() const noexcept override | |||||
{ | |||||
return "3BandEQ"; | |||||
} | |||||
const char* getDescription() const override | |||||
{ | |||||
return "3 Band Equalizer, stereo version."; | |||||
} | |||||
const char* getMaker() const noexcept override | |||||
{ | |||||
return "DISTRHO"; | |||||
} | |||||
const char* getHomePage() const override | |||||
{ | |||||
return "https://github.com/DISTRHO/Mini-Series"; | |||||
} | |||||
const char* getLicense() const noexcept override | |||||
{ | |||||
return "LGPL"; | |||||
} | |||||
uint32_t getVersion() const noexcept override | |||||
{ | |||||
return d_version(1, 0, 0); | |||||
} | |||||
int64_t getUniqueId() const noexcept override | |||||
{ | |||||
return d_cconst('D', '3', 'E', 'Q'); | |||||
} | |||||
// ------------------------------------------------------------------- | |||||
// Init | |||||
void initParameter(uint32_t index, Parameter& parameter) override; | |||||
void initProgramName(uint32_t index, String& programName) override; | |||||
// ------------------------------------------------------------------- | |||||
// Internal data | |||||
float getParameterValue(uint32_t index) const override; | |||||
void setParameterValue(uint32_t index, float value) override; | |||||
void loadProgram(uint32_t index) override; | |||||
// ------------------------------------------------------------------- | |||||
// Process | |||||
void activate() override; | |||||
void deactivate() override; | |||||
void run(const float** inputs, float** outputs, uint32_t frames) override; | |||||
// ------------------------------------------------------------------- | |||||
private: | |||||
float fLow, fMid, fHigh, fMaster, fLowMidFreq, fMidHighFreq; | |||||
float lowVol, midVol, highVol, outVol; | |||||
float freqLP, freqHP; | |||||
float xLP, a0LP, b1LP; | |||||
float xHP, a0HP, b1HP; | |||||
float out1LP, out2LP, out1HP, out2HP; | |||||
float tmp1LP, tmp2LP, tmp1HP, tmp2HP; | |||||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistrhoPlugin3BandEQ) | |||||
}; | |||||
// ----------------------------------------------------------------------- | |||||
END_NAMESPACE_DISTRHO | |||||
#endif // DISTRHO_PLUGIN_3BANDEQ_HPP_INCLUDED |
@@ -0,0 +1,32 @@ | |||||
/* | |||||
* DISTRHO 3BandEQ Plugin, based on 3BandEQ by Michael Gruhn | |||||
* Copyright (C) 2012-2015 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* This program is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation. | |||||
* | |||||
* This program is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* GNU Lesser General Public License for more details. | |||||
* | |||||
* For a full copy of the license see the LICENSE file. | |||||
*/ | |||||
#ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | |||||
#define DISTRHO_PLUGIN_INFO_H_INCLUDED | |||||
#define DISTRHO_PLUGIN_BRAND "DISTRHO" | |||||
#define DISTRHO_PLUGIN_NAME "3 Band EQ" | |||||
#define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/3BandEQ" | |||||
#define DISTRHO_PLUGIN_HAS_UI 1 | |||||
#define DISTRHO_PLUGIN_IS_RT_SAFE 1 | |||||
#define DISTRHO_PLUGIN_NUM_INPUTS 2 | |||||
#define DISTRHO_PLUGIN_NUM_OUTPUTS 2 | |||||
#define DISTRHO_PLUGIN_WANT_PROGRAMS 1 | |||||
#define DISTRHO_PLUGIN_LV2_CATEGORY "lv2:EQPlugin" | |||||
#endif // DISTRHO_PLUGIN_INFO_H_INCLUDED |
@@ -0,0 +1,211 @@ | |||||
/* | |||||
* DISTRHO 3BandEQ Plugin, based on 3BandEQ by Michael Gruhn | |||||
* Copyright (C) 2012-2015 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* This program is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation. | |||||
* | |||||
* This program is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* GNU Lesser General Public License for more details. | |||||
* | |||||
* For a full copy of the license see the LICENSE file. | |||||
*/ | |||||
#include "DistrhoPlugin3BandEQ.hpp" | |||||
#include "DistrhoUI3BandEQ.hpp" | |||||
START_NAMESPACE_DISTRHO | |||||
namespace Art = DistrhoArtwork3BandEQ; | |||||
// ----------------------------------------------------------------------- | |||||
DistrhoUI3BandEQ::DistrhoUI3BandEQ() | |||||
: UI(Art::backgroundWidth, Art::backgroundHeight), | |||||
fImgBackground(Art::backgroundData, Art::backgroundWidth, Art::backgroundHeight, GL_BGR), | |||||
fAboutWindow(this) | |||||
{ | |||||
// about | |||||
Image aboutImage(Art::aboutData, Art::aboutWidth, Art::aboutHeight, GL_BGR); | |||||
fAboutWindow.setImage(aboutImage); | |||||
// sliders | |||||
Image sliderImage(Art::sliderData, Art::sliderWidth, Art::sliderHeight); | |||||
Point<int> sliderPosStart(57, 43); | |||||
Point<int> sliderPosEnd(57, 43 + 160); | |||||
// slider Low | |||||
fSliderLow = new ImageSlider(this, sliderImage); | |||||
fSliderLow->setId(DistrhoPlugin3BandEQ::paramLow); | |||||
fSliderLow->setInverted(true); | |||||
fSliderLow->setStartPos(sliderPosStart); | |||||
fSliderLow->setEndPos(sliderPosEnd); | |||||
fSliderLow->setRange(-24.0f, 24.0f); | |||||
fSliderLow->setCallback(this); | |||||
// slider Mid | |||||
sliderPosStart.setX(120); | |||||
sliderPosEnd.setX(120); | |||||
fSliderMid = new ImageSlider(this, sliderImage); | |||||
fSliderMid->setId(DistrhoPlugin3BandEQ::paramMid); | |||||
fSliderMid->setInverted(true); | |||||
fSliderMid->setStartPos(sliderPosStart); | |||||
fSliderMid->setEndPos(sliderPosEnd); | |||||
fSliderMid->setRange(-24.0f, 24.0f); | |||||
fSliderMid->setCallback(this); | |||||
// slider High | |||||
sliderPosStart.setX(183); | |||||
sliderPosEnd.setX(183); | |||||
fSliderHigh = new ImageSlider(this, sliderImage); | |||||
fSliderHigh->setId(DistrhoPlugin3BandEQ::paramHigh); | |||||
fSliderHigh->setInverted(true); | |||||
fSliderHigh->setStartPos(sliderPosStart); | |||||
fSliderHigh->setEndPos(sliderPosEnd); | |||||
fSliderHigh->setRange(-24.0f, 24.0f); | |||||
fSliderHigh->setCallback(this); | |||||
// slider Master | |||||
sliderPosStart.setX(287); | |||||
sliderPosEnd.setX(287); | |||||
fSliderMaster = new ImageSlider(this, sliderImage); | |||||
fSliderMaster->setId(DistrhoPlugin3BandEQ::paramMaster); | |||||
fSliderMaster->setInverted(true); | |||||
fSliderMaster->setStartPos(sliderPosStart); | |||||
fSliderMaster->setEndPos(sliderPosEnd); | |||||
fSliderMaster->setRange(-24.0f, 24.0f); | |||||
fSliderMaster->setCallback(this); | |||||
// knobs | |||||
Image knobImage(Art::knobData, Art::knobWidth, Art::knobHeight); | |||||
// knob Low-Mid | |||||
fKnobLowMid = new ImageKnob(this, knobImage, ImageKnob::Vertical); | |||||
fKnobLowMid->setId(DistrhoPlugin3BandEQ::paramLowMidFreq); | |||||
fKnobLowMid->setAbsolutePos(65, 269); | |||||
fKnobLowMid->setRange(0.0f, 1000.0f); | |||||
fKnobLowMid->setDefault(440.0f); | |||||
fKnobLowMid->setRotationAngle(270); | |||||
fKnobLowMid->setCallback(this); | |||||
// knob Mid-High | |||||
fKnobMidHigh = new ImageKnob(this, knobImage, ImageKnob::Vertical); | |||||
fKnobMidHigh->setId(DistrhoPlugin3BandEQ::paramMidHighFreq); | |||||
fKnobMidHigh->setAbsolutePos(159, 269); | |||||
fKnobMidHigh->setRange(1000.0f, 20000.0f); | |||||
fKnobMidHigh->setDefault(1000.0f); | |||||
fKnobMidHigh->setRotationAngle(270); | |||||
fKnobMidHigh->setCallback(this); | |||||
// about button | |||||
Image aboutImageNormal(Art::aboutButtonNormalData, Art::aboutButtonNormalWidth, Art::aboutButtonNormalHeight); | |||||
Image aboutImageHover(Art::aboutButtonHoverData, Art::aboutButtonHoverWidth, Art::aboutButtonHoverHeight); | |||||
fButtonAbout = new ImageButton(this, aboutImageNormal, aboutImageHover, aboutImageHover); | |||||
fButtonAbout->setAbsolutePos(264, 300); | |||||
fButtonAbout->setCallback(this); | |||||
// set default values | |||||
programLoaded(0); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
// DSP Callbacks | |||||
void DistrhoUI3BandEQ::parameterChanged(uint32_t index, float value) | |||||
{ | |||||
switch (index) | |||||
{ | |||||
case DistrhoPlugin3BandEQ::paramLow: | |||||
fSliderLow->setValue(value); | |||||
break; | |||||
case DistrhoPlugin3BandEQ::paramMid: | |||||
fSliderMid->setValue(value); | |||||
break; | |||||
case DistrhoPlugin3BandEQ::paramHigh: | |||||
fSliderHigh->setValue(value); | |||||
break; | |||||
case DistrhoPlugin3BandEQ::paramMaster: | |||||
fSliderMaster->setValue(value); | |||||
break; | |||||
case DistrhoPlugin3BandEQ::paramLowMidFreq: | |||||
fKnobLowMid->setValue(value); | |||||
break; | |||||
case DistrhoPlugin3BandEQ::paramMidHighFreq: | |||||
fKnobMidHigh->setValue(value); | |||||
break; | |||||
} | |||||
} | |||||
void DistrhoUI3BandEQ::programLoaded(uint32_t index) | |||||
{ | |||||
if (index != 0) | |||||
return; | |||||
// Default values | |||||
fSliderLow->setValue(0.0f); | |||||
fSliderMid->setValue(0.0f); | |||||
fSliderHigh->setValue(0.0f); | |||||
fSliderMaster->setValue(0.0f); | |||||
fKnobLowMid->setValue(220.0f); | |||||
fKnobMidHigh->setValue(2000.0f); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
// Widget Callbacks | |||||
void DistrhoUI3BandEQ::imageButtonClicked(ImageButton* button, int) | |||||
{ | |||||
if (button != fButtonAbout) | |||||
return; | |||||
fAboutWindow.exec(); | |||||
} | |||||
void DistrhoUI3BandEQ::imageKnobDragStarted(ImageKnob* knob) | |||||
{ | |||||
editParameter(knob->getId(), true); | |||||
} | |||||
void DistrhoUI3BandEQ::imageKnobDragFinished(ImageKnob* knob) | |||||
{ | |||||
editParameter(knob->getId(), false); | |||||
} | |||||
void DistrhoUI3BandEQ::imageKnobValueChanged(ImageKnob* knob, float value) | |||||
{ | |||||
setParameterValue(knob->getId(), value); | |||||
} | |||||
void DistrhoUI3BandEQ::imageSliderDragStarted(ImageSlider* slider) | |||||
{ | |||||
editParameter(slider->getId(), true); | |||||
} | |||||
void DistrhoUI3BandEQ::imageSliderDragFinished(ImageSlider* slider) | |||||
{ | |||||
editParameter(slider->getId(), false); | |||||
} | |||||
void DistrhoUI3BandEQ::imageSliderValueChanged(ImageSlider* slider, float value) | |||||
{ | |||||
setParameterValue(slider->getId(), value); | |||||
} | |||||
void DistrhoUI3BandEQ::onDisplay() | |||||
{ | |||||
fImgBackground.draw(); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
UI* createUI() | |||||
{ | |||||
return new DistrhoUI3BandEQ(); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
END_NAMESPACE_DISTRHO |
@@ -0,0 +1,72 @@ | |||||
/* | |||||
* DISTRHO 3BandEQ Plugin, based on 3BandEQ by Michael Gruhn | |||||
* Copyright (C) 2012-2015 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* This program is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation. | |||||
* | |||||
* This program is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* GNU Lesser General Public License for more details. | |||||
* | |||||
* For a full copy of the license see the LICENSE file. | |||||
*/ | |||||
#ifndef DISTRHO_UI_3BANDEQ_HPP_INCLUDED | |||||
#define DISTRHO_UI_3BANDEQ_HPP_INCLUDED | |||||
#include "DistrhoUI.hpp" | |||||
#include "ImageWidgets.hpp" | |||||
#include "DistrhoArtwork3BandEQ.hpp" | |||||
START_NAMESPACE_DISTRHO | |||||
// ----------------------------------------------------------------------- | |||||
class DistrhoUI3BandEQ : public UI, | |||||
public ImageButton::Callback, | |||||
public ImageKnob::Callback, | |||||
public ImageSlider::Callback | |||||
{ | |||||
public: | |||||
DistrhoUI3BandEQ(); | |||||
protected: | |||||
// ------------------------------------------------------------------- | |||||
// DSP Callbacks | |||||
void parameterChanged(uint32_t index, float value) override; | |||||
void programLoaded(uint32_t index) override; | |||||
// ------------------------------------------------------------------- | |||||
// Widget Callbacks | |||||
void imageButtonClicked(ImageButton* button, int) override; | |||||
void imageKnobDragStarted(ImageKnob* knob) override; | |||||
void imageKnobDragFinished(ImageKnob* knob) override; | |||||
void imageKnobValueChanged(ImageKnob* knob, float value) override; | |||||
void imageSliderDragStarted(ImageSlider* slider) override; | |||||
void imageSliderDragFinished(ImageSlider* slider) override; | |||||
void imageSliderValueChanged(ImageSlider* slider, float value) override; | |||||
void onDisplay() override; | |||||
private: | |||||
Image fImgBackground; | |||||
ImageAboutWindow fAboutWindow; | |||||
ScopedPointer<ImageButton> fButtonAbout; | |||||
ScopedPointer<ImageKnob> fKnobLowMid, fKnobMidHigh; | |||||
ScopedPointer<ImageSlider> fSliderLow, fSliderMid, fSliderHigh, fSliderMaster; | |||||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistrhoUI3BandEQ) | |||||
}; | |||||
// ----------------------------------------------------------------------- | |||||
END_NAMESPACE_DISTRHO | |||||
#endif // DISTRHO_UI_3BANDEQ_HPP_INCLUDED |
@@ -0,0 +1,55 @@ | |||||
#!/usr/bin/make -f | |||||
# Makefile for DISTRHO Plugins # | |||||
# ---------------------------- # | |||||
# Created by falkTX | |||||
# | |||||
# -------------------------------------------------------------- | |||||
# Project name, used for binaries | |||||
NAME = 3BandEQ | |||||
# -------------------------------------------------------------- | |||||
# Files to build | |||||
OBJS_DSP = \ | |||||
DistrhoPlugin3BandEQ.cpp.o | |||||
OBJS_UI = \ | |||||
DistrhoArtwork3BandEQ.cpp.o \ | |||||
DistrhoUI3BandEQ.cpp.o | |||||
# -------------------------------------------------------------- | |||||
# Do some magic | |||||
include ../Makefile.Mini-Series.mk | |||||
# -------------------------------------------------------------- | |||||
# Enable all possible plugin types | |||||
ifeq ($(HAVE_DGL),true) | |||||
ifeq ($(HAVE_JACK),true) | |||||
TARGETS += jack | |||||
endif | |||||
endif | |||||
ifeq ($(LINUX),true) | |||||
TARGETS += ladspa | |||||
ifeq ($(HAVE_DGL),true) | |||||
ifeq ($(HAVE_LIBLO),true) | |||||
TARGETS += dssi | |||||
endif | |||||
endif | |||||
endif | |||||
ifeq ($(HAVE_DGL),true) | |||||
TARGETS += lv2_sep | |||||
else | |||||
TARGETS += lv2_dsp | |||||
endif | |||||
TARGETS += vst | |||||
all: $(TARGETS) | |||||
# -------------------------------------------------------------- |
@@ -0,0 +1,40 @@ | |||||
/* (Auto-generated binary data file). */ | |||||
#ifndef BINARY_DISTRHOARTWORK3BANDSPLITTER_HPP | |||||
#define BINARY_DISTRHOARTWORK3BANDSPLITTER_HPP | |||||
namespace DistrhoArtwork3BandSplitter | |||||
{ | |||||
extern const char* aboutData; | |||||
const unsigned int aboutDataSize = 172710; | |||||
const unsigned int aboutWidth = 303; | |||||
const unsigned int aboutHeight = 190; | |||||
extern const char* aboutButtonHoverData; | |||||
const unsigned int aboutButtonHoverDataSize = 5888; | |||||
const unsigned int aboutButtonHoverWidth = 92; | |||||
const unsigned int aboutButtonHoverHeight = 16; | |||||
extern const char* aboutButtonNormalData; | |||||
const unsigned int aboutButtonNormalDataSize = 5888; | |||||
const unsigned int aboutButtonNormalWidth = 92; | |||||
const unsigned int aboutButtonNormalHeight = 16; | |||||
extern const char* backgroundData; | |||||
const unsigned int backgroundDataSize = 437472; | |||||
const unsigned int backgroundWidth = 392; | |||||
const unsigned int backgroundHeight = 372; | |||||
extern const char* knobData; | |||||
const unsigned int knobDataSize = 15376; | |||||
const unsigned int knobWidth = 62; | |||||
const unsigned int knobHeight = 62; | |||||
extern const char* sliderData; | |||||
const unsigned int sliderDataSize = 6000; | |||||
const unsigned int sliderWidth = 50; | |||||
const unsigned int sliderHeight = 30; | |||||
} | |||||
#endif // BINARY_DISTRHOARTWORK3BANDSPLITTER_HPP | |||||
@@ -0,0 +1,272 @@ | |||||
/* | |||||
* DISTRHO 3BandSplitter Plugin, based on 3BandSplitter by Michael Gruhn | |||||
* Copyright (C) 2007 Michael Gruhn <michael-gruhn@web.de> | |||||
* Copyright (C) 2012-2015 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* This program is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation. | |||||
* | |||||
* This program is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* GNU Lesser General Public License for more details. | |||||
* | |||||
* For a full copy of the license see the LICENSE file. | |||||
*/ | |||||
#include "DistrhoPlugin3BandSplitter.hpp" | |||||
#include <cmath> | |||||
static const float kAMP_DB = 8.656170245f; | |||||
static const float kDC_ADD = 1e-30f; | |||||
static const float kPI = 3.141592654f; | |||||
START_NAMESPACE_DISTRHO | |||||
// ----------------------------------------------------------------------- | |||||
DistrhoPlugin3BandSplitter::DistrhoPlugin3BandSplitter() | |||||
: Plugin(paramCount, 1, 0) // 1 program, 0 states | |||||
{ | |||||
// set default values | |||||
loadProgram(0); | |||||
// reset | |||||
deactivate(); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
// Init | |||||
void DistrhoPlugin3BandSplitter::initParameter(uint32_t index, Parameter& parameter) | |||||
{ | |||||
switch (index) | |||||
{ | |||||
case paramLow: | |||||
parameter.hints = kParameterIsAutomable; | |||||
parameter.name = "Low"; | |||||
parameter.symbol = "low"; | |||||
parameter.unit = "dB"; | |||||
parameter.ranges.def = 0.0f; | |||||
parameter.ranges.min = -24.0f; | |||||
parameter.ranges.max = 24.0f; | |||||
break; | |||||
case paramMid: | |||||
parameter.hints = kParameterIsAutomable; | |||||
parameter.name = "Mid"; | |||||
parameter.symbol = "mid"; | |||||
parameter.unit = "dB"; | |||||
parameter.ranges.def = 0.0f; | |||||
parameter.ranges.min = -24.0f; | |||||
parameter.ranges.max = 24.0f; | |||||
break; | |||||
case paramHigh: | |||||
parameter.hints = kParameterIsAutomable; | |||||
parameter.name = "High"; | |||||
parameter.symbol = "high"; | |||||
parameter.unit = "dB"; | |||||
parameter.ranges.def = 0.0f; | |||||
parameter.ranges.min = -24.0f; | |||||
parameter.ranges.max = 24.0f; | |||||
break; | |||||
case paramMaster: | |||||
parameter.hints = kParameterIsAutomable; | |||||
parameter.name = "Master"; | |||||
parameter.symbol = "master"; | |||||
parameter.unit = "dB"; | |||||
parameter.ranges.def = 0.0f; | |||||
parameter.ranges.min = -24.0f; | |||||
parameter.ranges.max = 24.0f; | |||||
break; | |||||
case paramLowMidFreq: | |||||
parameter.hints = kParameterIsAutomable; | |||||
parameter.name = "Low-Mid Freq"; | |||||
parameter.symbol = "low_mid"; | |||||
parameter.unit = "Hz"; | |||||
parameter.ranges.def = 440.0f; | |||||
parameter.ranges.min = 0.0f; | |||||
parameter.ranges.max = 1000.0f; | |||||
break; | |||||
case paramMidHighFreq: | |||||
parameter.hints = kParameterIsAutomable; | |||||
parameter.name = "Mid-High Freq"; | |||||
parameter.symbol = "mid_high"; | |||||
parameter.unit = "Hz"; | |||||
parameter.ranges.def = 1000.0f; | |||||
parameter.ranges.min = 1000.0f; | |||||
parameter.ranges.max = 20000.0f; | |||||
break; | |||||
} | |||||
} | |||||
void DistrhoPlugin3BandSplitter::initProgramName(uint32_t index, String& programName) | |||||
{ | |||||
if (index != 0) | |||||
return; | |||||
programName = "Default"; | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
// Internal data | |||||
float DistrhoPlugin3BandSplitter::getParameterValue(uint32_t index) const | |||||
{ | |||||
switch (index) | |||||
{ | |||||
case paramLow: | |||||
return fLow; | |||||
case paramMid: | |||||
return fMid; | |||||
case paramHigh: | |||||
return fHigh; | |||||
case paramMaster: | |||||
return fMaster; | |||||
case paramLowMidFreq: | |||||
return fLowMidFreq; | |||||
case paramMidHighFreq: | |||||
return fMidHighFreq; | |||||
default: | |||||
return 0.0f; | |||||
} | |||||
} | |||||
void DistrhoPlugin3BandSplitter::setParameterValue(uint32_t index, float value) | |||||
{ | |||||
if (getSampleRate() <= 0.0) | |||||
return; | |||||
switch (index) | |||||
{ | |||||
case paramLow: | |||||
fLow = value; | |||||
lowVol = std::exp( (fLow/48.0f) * 48.0f / kAMP_DB); | |||||
break; | |||||
case paramMid: | |||||
fMid = value; | |||||
midVol = std::exp( (fMid/48.0f) * 48.0f / kAMP_DB); | |||||
break; | |||||
case paramHigh: | |||||
fHigh = value; | |||||
highVol = std::exp( (fHigh/48.0f) * 48.0f / kAMP_DB); | |||||
break; | |||||
case paramMaster: | |||||
fMaster = value; | |||||
outVol = std::exp( (fMaster/48.0f) * 48.0f / kAMP_DB); | |||||
break; | |||||
case paramLowMidFreq: | |||||
fLowMidFreq = std::fmin(value, fMidHighFreq); | |||||
freqLP = fLowMidFreq; | |||||
xLP = std::exp(-2.0f * kPI * freqLP / (float)getSampleRate()); | |||||
a0LP = 1.0f - xLP; | |||||
b1LP = -xLP; | |||||
break; | |||||
case paramMidHighFreq: | |||||
fMidHighFreq = std::fmax(value, fLowMidFreq); | |||||
freqHP = fMidHighFreq; | |||||
xHP = std::exp(-2.0f * kPI * freqHP / (float)getSampleRate()); | |||||
a0HP = 1.0f - xHP; | |||||
b1HP = -xHP; | |||||
break; | |||||
} | |||||
} | |||||
void DistrhoPlugin3BandSplitter::loadProgram(uint32_t index) | |||||
{ | |||||
if (index != 0) | |||||
return; | |||||
// Default values | |||||
fLow = 0.0f; | |||||
fMid = 0.0f; | |||||
fHigh = 0.0f; | |||||
fMaster = 0.0f; | |||||
fLowMidFreq = 220.0f; | |||||
fMidHighFreq = 2000.0f; | |||||
// Internal stuff | |||||
lowVol = midVol = highVol = outVol = 1.0f; | |||||
freqLP = 200.0f; | |||||
freqHP = 2000.0f; | |||||
// reset filter values | |||||
activate(); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
// Process | |||||
void DistrhoPlugin3BandSplitter::activate() | |||||
{ | |||||
const float sr = (float)getSampleRate(); | |||||
xLP = std::exp(-2.0f * kPI * freqLP / sr); | |||||
#ifdef DISTRHO_OS_WINDOWS | |||||
// don't ask me why, but this fixes a crash/exception below on windows... | |||||
printf("%f\n", -xLP); | |||||
#endif | |||||
a0LP = 1.0f - xLP; | |||||
b1LP = -xLP; | |||||
xHP = std::exp(-2.0f * kPI * freqHP / sr); | |||||
a0HP = 1.0f - xHP; | |||||
b1HP = -xHP; | |||||
} | |||||
void DistrhoPlugin3BandSplitter::deactivate() | |||||
{ | |||||
out1LP = out2LP = out1HP = out2HP = 0.0f; | |||||
tmp1LP = tmp2LP = tmp1HP = tmp2HP = 0.0f; | |||||
} | |||||
void DistrhoPlugin3BandSplitter::run(const float** inputs, float** outputs, uint32_t frames) | |||||
{ | |||||
const float* in1 = inputs[0]; | |||||
const float* in2 = inputs[1]; | |||||
float* out1 = outputs[0]; | |||||
float* out2 = outputs[1]; | |||||
float* out3 = outputs[2]; | |||||
float* out4 = outputs[3]; | |||||
float* out5 = outputs[4]; | |||||
float* out6 = outputs[5]; | |||||
for (uint32_t i=0; i < frames; ++i) | |||||
{ | |||||
tmp1LP = a0LP * in1[i] - b1LP * tmp1LP + kDC_ADD; | |||||
tmp2LP = a0LP * in2[i] - b1LP * tmp2LP + kDC_ADD; | |||||
out1LP = tmp1LP - kDC_ADD; | |||||
out2LP = tmp2LP - kDC_ADD; | |||||
tmp1HP = a0HP * in1[i] - b1HP * tmp1HP + kDC_ADD; | |||||
tmp2HP = a0HP * in2[i] - b1HP * tmp2HP + kDC_ADD; | |||||
out1HP = in1[i] - tmp1HP - kDC_ADD; | |||||
out2HP = in2[i] - tmp2HP - kDC_ADD; | |||||
out6[i] = out2HP*highVol * outVol; | |||||
out5[i] = out1HP*highVol * outVol; | |||||
out4[i] = (in2[i] - out2LP - out2HP)*midVol * outVol; | |||||
out3[i] = (in1[i] - out1LP - out1HP)*midVol * outVol; | |||||
out2[i] = out2LP*lowVol * outVol; | |||||
out1[i] = out1LP*lowVol * outVol; | |||||
} | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
Plugin* createPlugin() | |||||
{ | |||||
return new DistrhoPlugin3BandSplitter(); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
END_NAMESPACE_DISTRHO |
@@ -0,0 +1,123 @@ | |||||
/* | |||||
* DISTRHO 3BandSplitter Plugin, based on 3BandSplitter by Michael Gruhn | |||||
* Copyright (C) 2007 Michael Gruhn <michael-gruhn@web.de> | |||||
* Copyright (C) 2012-2015 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* This program is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation. | |||||
* | |||||
* This program is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* GNU Lesser General Public License for more details. | |||||
* | |||||
* For a full copy of the license see the LICENSE file. | |||||
*/ | |||||
#ifndef DISTRHO_PLUGIN_3BANDSPLITTER_HPP_INCLUDED | |||||
#define DISTRHO_PLUGIN_3BANDSPLITTER_HPP_INCLUDED | |||||
#include "DistrhoPlugin.hpp" | |||||
START_NAMESPACE_DISTRHO | |||||
// ----------------------------------------------------------------------- | |||||
class DistrhoPlugin3BandSplitter : public Plugin | |||||
{ | |||||
public: | |||||
enum Parameters | |||||
{ | |||||
paramLow = 0, | |||||
paramMid, | |||||
paramHigh, | |||||
paramMaster, | |||||
paramLowMidFreq, | |||||
paramMidHighFreq, | |||||
paramCount | |||||
}; | |||||
DistrhoPlugin3BandSplitter(); | |||||
protected: | |||||
// ------------------------------------------------------------------- | |||||
// Information | |||||
const char* getLabel() const noexcept override | |||||
{ | |||||
return "3BandSplitter"; | |||||
} | |||||
const char* getDescription() const override | |||||
{ | |||||
return "3 Band Equalizer, splitted output version."; | |||||
} | |||||
const char* getMaker() const noexcept override | |||||
{ | |||||
return "DISTRHO"; | |||||
} | |||||
const char* getHomePage() const override | |||||
{ | |||||
return "https://github.com/DISTRHO/Mini-Series"; | |||||
} | |||||
const char* getLicense() const noexcept override | |||||
{ | |||||
return "LGPL"; | |||||
} | |||||
uint32_t getVersion() const noexcept override | |||||
{ | |||||
return d_version(1, 0, 0); | |||||
} | |||||
int64_t getUniqueId() const noexcept override | |||||
{ | |||||
return d_cconst('D', '3', 'E', 'S'); | |||||
} | |||||
// ------------------------------------------------------------------- | |||||
// Init | |||||
void initParameter(uint32_t index, Parameter& parameter) override; | |||||
void initProgramName(uint32_t index, String& programName) override; | |||||
// ------------------------------------------------------------------- | |||||
// Internal data | |||||
float getParameterValue(uint32_t index) const override; | |||||
void setParameterValue(uint32_t index, float value) override; | |||||
void loadProgram(uint32_t index) override; | |||||
// ------------------------------------------------------------------- | |||||
// Process | |||||
void activate() override; | |||||
void deactivate() override; | |||||
void run(const float** inputs, float** outputs, uint32_t frames) override; | |||||
// ------------------------------------------------------------------- | |||||
private: | |||||
float fLow, fMid, fHigh, fMaster, fLowMidFreq, fMidHighFreq; | |||||
float lowVol, midVol, highVol, outVol; | |||||
float freqLP, freqHP; | |||||
float xLP, a0LP, b1LP; | |||||
float xHP, a0HP, b1HP; | |||||
float out1LP, out2LP, out1HP, out2HP; | |||||
float tmp1LP, tmp2LP, tmp1HP, tmp2HP; | |||||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistrhoPlugin3BandSplitter) | |||||
}; | |||||
// ----------------------------------------------------------------------- | |||||
END_NAMESPACE_DISTRHO | |||||
#endif // DISTRHO_PLUGIN_3BANDSPLITTER_HPP_INCLUDED |
@@ -0,0 +1,32 @@ | |||||
/* | |||||
* DISTRHO 3BandSplitter Plugin, based on 3BandSplitter by Michael Gruhn | |||||
* Copyright (C) 2012-2015 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* This program is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation. | |||||
* | |||||
* This program is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* GNU Lesser General Public License for more details. | |||||
* | |||||
* For a full copy of the license see the LICENSE file. | |||||
*/ | |||||
#ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | |||||
#define DISTRHO_PLUGIN_INFO_H_INCLUDED | |||||
#define DISTRHO_PLUGIN_BRAND "DISTRHO" | |||||
#define DISTRHO_PLUGIN_NAME "3 Band Splitter" | |||||
#define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/3BandSplitter" | |||||
#define DISTRHO_PLUGIN_HAS_UI 1 | |||||
#define DISTRHO_PLUGIN_IS_RT_SAFE 1 | |||||
#define DISTRHO_PLUGIN_NUM_INPUTS 2 | |||||
#define DISTRHO_PLUGIN_NUM_OUTPUTS 6 | |||||
#define DISTRHO_PLUGIN_WANT_PROGRAMS 1 | |||||
#define DISTRHO_PLUGIN_LV2_CATEGORY "lv2:EQPlugin" | |||||
#endif // DISTRHO_PLUGIN_INFO_H_INCLUDED |
@@ -0,0 +1,213 @@ | |||||
/* | |||||
* DISTRHO 3BandSplitter Plugin, based on 3BandSplitter by Michael Gruhn | |||||
* Copyright (C) 2012-2015 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* This program is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation. | |||||
* | |||||
* This program is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* GNU Lesser General Public License for more details. | |||||
* | |||||
* For a full copy of the license see the LICENSE file. | |||||
*/ | |||||
#include "DistrhoPlugin3BandSplitter.hpp" | |||||
#include "DistrhoUI3BandSplitter.hpp" | |||||
using DGL::Point; | |||||
START_NAMESPACE_DISTRHO | |||||
namespace Art = DistrhoArtwork3BandSplitter; | |||||
// ----------------------------------------------------------------------- | |||||
DistrhoUI3BandSplitter::DistrhoUI3BandSplitter() | |||||
: UI(Art::backgroundWidth, Art::backgroundHeight), | |||||
fImgBackground(Art::backgroundData, Art::backgroundWidth, Art::backgroundHeight, GL_BGR), | |||||
fAboutWindow(this) | |||||
{ | |||||
// about | |||||
Image aboutImage(Art::aboutData, Art::aboutWidth, Art::aboutHeight, GL_BGR); | |||||
fAboutWindow.setImage(aboutImage); | |||||
// sliders | |||||
Image sliderImage(Art::sliderData, Art::sliderWidth, Art::sliderHeight); | |||||
Point<int> sliderPosStart(57, 43); | |||||
Point<int> sliderPosEnd(57, 43 + 160); | |||||
// slider Low | |||||
fSliderLow = new ImageSlider(this, sliderImage); | |||||
fSliderLow->setId(DistrhoPlugin3BandSplitter::paramLow); | |||||
fSliderLow->setInverted(true); | |||||
fSliderLow->setStartPos(sliderPosStart); | |||||
fSliderLow->setEndPos(sliderPosEnd); | |||||
fSliderLow->setRange(-24.0f, 24.0f); | |||||
fSliderLow->setCallback(this); | |||||
// slider Mid | |||||
sliderPosStart.setX(120); | |||||
sliderPosEnd.setX(120); | |||||
fSliderMid = new ImageSlider(this, sliderImage); | |||||
fSliderMid->setId(DistrhoPlugin3BandSplitter::paramMid); | |||||
fSliderMid->setInverted(true); | |||||
fSliderMid->setStartPos(sliderPosStart); | |||||
fSliderMid->setEndPos(sliderPosEnd); | |||||
fSliderMid->setRange(-24.0f, 24.0f); | |||||
fSliderMid->setCallback(this); | |||||
// slider High | |||||
sliderPosStart.setX(183); | |||||
sliderPosEnd.setX(183); | |||||
fSliderHigh = new ImageSlider(this, sliderImage); | |||||
fSliderHigh->setId(DistrhoPlugin3BandSplitter::paramHigh); | |||||
fSliderHigh->setInverted(true); | |||||
fSliderHigh->setStartPos(sliderPosStart); | |||||
fSliderHigh->setEndPos(sliderPosEnd); | |||||
fSliderHigh->setRange(-24.0f, 24.0f); | |||||
fSliderHigh->setCallback(this); | |||||
// slider Master | |||||
sliderPosStart.setX(287); | |||||
sliderPosEnd.setX(287); | |||||
fSliderMaster = new ImageSlider(this, sliderImage); | |||||
fSliderMaster->setId(DistrhoPlugin3BandSplitter::paramMaster); | |||||
fSliderMaster->setInverted(true); | |||||
fSliderMaster->setStartPos(sliderPosStart); | |||||
fSliderMaster->setEndPos(sliderPosEnd); | |||||
fSliderMaster->setRange(-24.0f, 24.0f); | |||||
fSliderMaster->setCallback(this); | |||||
// knobs | |||||
Image knobImage(Art::knobData, Art::knobWidth, Art::knobHeight); | |||||
// knob Low-Mid | |||||
fKnobLowMid = new ImageKnob(this, knobImage, ImageKnob::Vertical); | |||||
fKnobLowMid->setId(DistrhoPlugin3BandSplitter::paramLowMidFreq); | |||||
fKnobLowMid->setAbsolutePos(65, 269); | |||||
fKnobLowMid->setRange(0.0f, 1000.0f); | |||||
fKnobLowMid->setDefault(440.0f); | |||||
fKnobLowMid->setRotationAngle(270); | |||||
fKnobLowMid->setCallback(this); | |||||
// knob Mid-High | |||||
fKnobMidHigh = new ImageKnob(this, knobImage, ImageKnob::Vertical); | |||||
fKnobMidHigh->setId(DistrhoPlugin3BandSplitter::paramMidHighFreq); | |||||
fKnobMidHigh->setAbsolutePos(159, 269); | |||||
fKnobMidHigh->setRange(1000.0f, 20000.0f); | |||||
fKnobMidHigh->setDefault(1000.0f); | |||||
fKnobMidHigh->setRotationAngle(270); | |||||
fKnobMidHigh->setCallback(this); | |||||
// about button | |||||
Image aboutImageNormal(Art::aboutButtonNormalData, Art::aboutButtonNormalWidth, Art::aboutButtonNormalHeight); | |||||
Image aboutImageHover(Art::aboutButtonHoverData, Art::aboutButtonHoverWidth, Art::aboutButtonHoverHeight); | |||||
fButtonAbout = new ImageButton(this, aboutImageNormal, aboutImageHover, aboutImageHover); | |||||
fButtonAbout->setAbsolutePos(264, 300); | |||||
fButtonAbout->setCallback(this); | |||||
// set default values | |||||
programLoaded(0); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
// DSP Callbacks | |||||
void DistrhoUI3BandSplitter::parameterChanged(uint32_t index, float value) | |||||
{ | |||||
switch (index) | |||||
{ | |||||
case DistrhoPlugin3BandSplitter::paramLow: | |||||
fSliderLow->setValue(value); | |||||
break; | |||||
case DistrhoPlugin3BandSplitter::paramMid: | |||||
fSliderMid->setValue(value); | |||||
break; | |||||
case DistrhoPlugin3BandSplitter::paramHigh: | |||||
fSliderHigh->setValue(value); | |||||
break; | |||||
case DistrhoPlugin3BandSplitter::paramMaster: | |||||
fSliderMaster->setValue(value); | |||||
break; | |||||
case DistrhoPlugin3BandSplitter::paramLowMidFreq: | |||||
fKnobLowMid->setValue(value); | |||||
break; | |||||
case DistrhoPlugin3BandSplitter::paramMidHighFreq: | |||||
fKnobMidHigh->setValue(value); | |||||
break; | |||||
} | |||||
} | |||||
void DistrhoUI3BandSplitter::programLoaded(uint32_t index) | |||||
{ | |||||
if (index != 0) | |||||
return; | |||||
// Default values | |||||
fSliderLow->setValue(0.0f); | |||||
fSliderMid->setValue(0.0f); | |||||
fSliderHigh->setValue(0.0f); | |||||
fSliderMaster->setValue(0.0f); | |||||
fKnobLowMid->setValue(220.0f); | |||||
fKnobMidHigh->setValue(2000.0f); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
// Widget Callbacks | |||||
void DistrhoUI3BandSplitter::imageButtonClicked(ImageButton* button, int) | |||||
{ | |||||
if (button != fButtonAbout) | |||||
return; | |||||
fAboutWindow.exec(); | |||||
} | |||||
void DistrhoUI3BandSplitter::imageKnobDragStarted(ImageKnob* knob) | |||||
{ | |||||
editParameter(knob->getId(), true); | |||||
} | |||||
void DistrhoUI3BandSplitter::imageKnobDragFinished(ImageKnob* knob) | |||||
{ | |||||
editParameter(knob->getId(), false); | |||||
} | |||||
void DistrhoUI3BandSplitter::imageKnobValueChanged(ImageKnob* knob, float value) | |||||
{ | |||||
setParameterValue(knob->getId(), value); | |||||
} | |||||
void DistrhoUI3BandSplitter::imageSliderDragStarted(ImageSlider* slider) | |||||
{ | |||||
editParameter(slider->getId(), true); | |||||
} | |||||
void DistrhoUI3BandSplitter::imageSliderDragFinished(ImageSlider* slider) | |||||
{ | |||||
editParameter(slider->getId(), false); | |||||
} | |||||
void DistrhoUI3BandSplitter::imageSliderValueChanged(ImageSlider* slider, float value) | |||||
{ | |||||
setParameterValue(slider->getId(), value); | |||||
} | |||||
void DistrhoUI3BandSplitter::onDisplay() | |||||
{ | |||||
fImgBackground.draw(); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
UI* createUI() | |||||
{ | |||||
return new DistrhoUI3BandSplitter(); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
END_NAMESPACE_DISTRHO |
@@ -0,0 +1,72 @@ | |||||
/* | |||||
* DISTRHO 3BandSplitter Plugin, based on 3BandSplitter by Michael Gruhn | |||||
* Copyright (C) 2012-2015 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* This program is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation. | |||||
* | |||||
* This program is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* GNU Lesser General Public License for more details. | |||||
* | |||||
* For a full copy of the license see the LICENSE file. | |||||
*/ | |||||
#ifndef DISTRHO_UI_3BANDSPLITTER_HPP_INCLUDED | |||||
#define DISTRHO_UI_3BANDSPLITTER_HPP_INCLUDED | |||||
#include "DistrhoUI.hpp" | |||||
#include "ImageWidgets.hpp" | |||||
#include "DistrhoArtwork3BandSplitter.hpp" | |||||
START_NAMESPACE_DISTRHO | |||||
// ----------------------------------------------------------------------- | |||||
class DistrhoUI3BandSplitter : public UI, | |||||
public ImageButton::Callback, | |||||
public ImageKnob::Callback, | |||||
public ImageSlider::Callback | |||||
{ | |||||
public: | |||||
DistrhoUI3BandSplitter(); | |||||
protected: | |||||
// ------------------------------------------------------------------- | |||||
// DSP Callbacks | |||||
void parameterChanged(uint32_t index, float value) override; | |||||
void programLoaded(uint32_t index) override; | |||||
// ------------------------------------------------------------------- | |||||
// Widget Callbacks | |||||
void imageButtonClicked(ImageButton* button, int) override; | |||||
void imageKnobDragStarted(ImageKnob* knob) override; | |||||
void imageKnobDragFinished(ImageKnob* knob) override; | |||||
void imageKnobValueChanged(ImageKnob* knob, float value) override; | |||||
void imageSliderDragStarted(ImageSlider* slider) override; | |||||
void imageSliderDragFinished(ImageSlider* slider) override; | |||||
void imageSliderValueChanged(ImageSlider* slider, float value) override; | |||||
void onDisplay() override; | |||||
private: | |||||
Image fImgBackground; | |||||
ImageAboutWindow fAboutWindow; | |||||
ScopedPointer<ImageButton> fButtonAbout; | |||||
ScopedPointer<ImageKnob> fKnobLowMid, fKnobMidHigh; | |||||
ScopedPointer<ImageSlider> fSliderLow, fSliderMid, fSliderHigh, fSliderMaster; | |||||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistrhoUI3BandSplitter) | |||||
}; | |||||
// ----------------------------------------------------------------------- | |||||
END_NAMESPACE_DISTRHO | |||||
#endif // DISTRHO_UI_3BANDSPLITTER_HPP_INCLUDED |
@@ -0,0 +1,55 @@ | |||||
#!/usr/bin/make -f | |||||
# Makefile for DISTRHO Plugins # | |||||
# ---------------------------- # | |||||
# Created by falkTX | |||||
# | |||||
# -------------------------------------------------------------- | |||||
# Project name, used for binaries | |||||
NAME = 3BandSplitter | |||||
# -------------------------------------------------------------- | |||||
# Files to build | |||||
OBJS_DSP = \ | |||||
DistrhoPlugin3BandSplitter.cpp.o | |||||
OBJS_UI = \ | |||||
DistrhoArtwork3BandSplitter.cpp.o \ | |||||
DistrhoUI3BandSplitter.cpp.o | |||||
# -------------------------------------------------------------- | |||||
# Do some magic | |||||
include ../Makefile.Mini-Series.mk | |||||
# -------------------------------------------------------------- | |||||
# Enable all possible plugin types | |||||
ifeq ($(HAVE_DGL),true) | |||||
ifeq ($(HAVE_JACK),true) | |||||
TARGETS += jack | |||||
endif | |||||
endif | |||||
ifeq ($(LINUX),true) | |||||
TARGETS += ladspa | |||||
ifeq ($(HAVE_DGL),true) | |||||
ifeq ($(HAVE_LIBLO),true) | |||||
TARGETS += dssi | |||||
endif | |||||
endif | |||||
endif | |||||
ifeq ($(HAVE_DGL),true) | |||||
TARGETS += lv2_sep | |||||
else | |||||
TARGETS += lv2_dsp | |||||
endif | |||||
TARGETS += vst | |||||
all: $(TARGETS) | |||||
# -------------------------------------------------------------- |
@@ -0,0 +1,20 @@ | |||||
/* (Auto-generated binary data file). */ | |||||
#ifndef BINARY_DISTRHOARTWORKAMPLITUDEIMPOSER_HPP | |||||
#define BINARY_DISTRHOARTWORKAMPLITUDEIMPOSER_HPP | |||||
namespace DistrhoArtworkAmplitudeImposer | |||||
{ | |||||
extern const char* backData; | |||||
const unsigned int backDataSize = 90000; | |||||
const unsigned int backWidth = 300; | |||||
const unsigned int backHeight = 150; | |||||
extern const char* sliderData; | |||||
const unsigned int sliderDataSize = 512; | |||||
const unsigned int sliderWidth = 16; | |||||
const unsigned int sliderHeight = 16; | |||||
} | |||||
#endif // BINARY_DISTRHOARTWORKAMPLITUDEIMPOSER_HPP | |||||
@@ -0,0 +1,270 @@ | |||||
/* | |||||
* DISTRHO AmplitudeImposer, a DPF'ied AmplitudeImposer. | |||||
* Copyright (C) 2004 Niall Moody | |||||
* Copyright (C) 2015 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* Permission is hereby granted, free of charge, to any person obtaining a | |||||
* copy of this software and associated documentation files (the "Software"), | |||||
* to deal in the Software without restriction, including without limitation | |||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||||
* and/or sell copies of the Software, and to permit persons to whom the | |||||
* Software is furnished to do so, subject to the following conditions: | |||||
* | |||||
* The above copyright notice and this permission notice shall be included in | |||||
* all copies or substantial portions of the Software. | |||||
* | |||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |||||
* DEALINGS IN THE SOFTWARE. | |||||
*/ | |||||
#include "DistrhoPluginAmplitudeImposer.hpp" | |||||
START_NAMESPACE_DISTRHO | |||||
// ----------------------------------------------------------------------- | |||||
struct twofloats { | |||||
float left; | |||||
float right; | |||||
}; | |||||
// ----------------------------------------------------------------------- | |||||
DistrhoPluginAmplitudeImposer::DistrhoPluginAmplitudeImposer() | |||||
: Plugin(kParameterCount, 1, 0), // 1 program, 0 states | |||||
fDepth(1.0f), | |||||
fThreshold(0.5f), | |||||
ampEnvelope_l(0.0f), | |||||
ampEnvelope_r(0.0f), | |||||
audioEnvelope_l(0.0f), | |||||
audioEnvelope_r(0.0f), | |||||
envDecay(0.0001f) {} | |||||
// ----------------------------------------------------------------------- | |||||
// Init | |||||
void DistrhoPluginAmplitudeImposer::initAudioPort(bool input, uint32_t index, AudioPort& port) | |||||
{ | |||||
port.hints = 0x0; | |||||
if (input) | |||||
{ | |||||
switch (index) | |||||
{ | |||||
case 0: | |||||
port.name = "Input Left (Amp Env)"; | |||||
port.symbol = "in_left_amp"; | |||||
break; | |||||
case 1: | |||||
port.name = "Input Right (Amp Env)"; | |||||
port.symbol = "in_right_amp"; | |||||
break; | |||||
case 2: | |||||
port.name = "Input Left (Audio)"; | |||||
port.symbol = "in_left_audio"; | |||||
break; | |||||
case 3: | |||||
port.name = "Input Right (Audio)"; | |||||
port.symbol = "in_right_audio"; | |||||
break; | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
switch (index) | |||||
{ | |||||
case 0: | |||||
port.name = "Output Left"; | |||||
port.symbol = "out_left"; | |||||
break; | |||||
case 1: | |||||
port.name = "Output Right"; | |||||
port.symbol = "out_right"; | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
void DistrhoPluginAmplitudeImposer::initParameter(uint32_t index, Parameter& parameter) | |||||
{ | |||||
parameter.hints = kParameterIsAutomable; | |||||
parameter.ranges.min = 0.0f; | |||||
parameter.ranges.max = 1.0f; | |||||
switch (index) | |||||
{ | |||||
case kParameterDepth: | |||||
parameter.name = "Depth"; | |||||
parameter.symbol = "depth"; | |||||
parameter.ranges.def = 1.0f; | |||||
break; | |||||
case kParameterThreshold: | |||||
parameter.name = "Thres"; | |||||
parameter.symbol = "thres"; | |||||
parameter.ranges.def = 0.5f; | |||||
break; | |||||
} | |||||
} | |||||
void DistrhoPluginAmplitudeImposer::initProgramName(uint32_t index, String& programName) | |||||
{ | |||||
if (index != 0) | |||||
return; | |||||
programName = "Default"; | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
// Internal data | |||||
float DistrhoPluginAmplitudeImposer::getParameterValue(uint32_t index) const | |||||
{ | |||||
switch(index) | |||||
{ | |||||
case kParameterDepth: | |||||
return fDepth; | |||||
case kParameterThreshold: | |||||
return fThreshold; | |||||
default: | |||||
return 0.0f; | |||||
} | |||||
} | |||||
void DistrhoPluginAmplitudeImposer::setParameterValue(uint32_t index, float value) | |||||
{ | |||||
switch(index) | |||||
{ | |||||
case kParameterDepth: | |||||
fDepth = value; | |||||
break; | |||||
case kParameterThreshold: | |||||
fThreshold = value; | |||||
break; | |||||
} | |||||
} | |||||
void DistrhoPluginAmplitudeImposer::loadProgram(uint32_t index) | |||||
{ | |||||
if (index != 0) | |||||
return; | |||||
fDepth = 1.0f; | |||||
fThreshold = 0.5f; | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
// Process | |||||
void DistrhoPluginAmplitudeImposer::activate() | |||||
{ | |||||
ampEnvelope_l = 0.0f; | |||||
ampEnvelope_r = 0.0f; | |||||
audioEnvelope_l = 0.0f; | |||||
audioEnvelope_r = 0.0f; | |||||
envDecay = 0.0001f; | |||||
} | |||||
void DistrhoPluginAmplitudeImposer::run(const float** inputs, float** outputs, uint32_t frames) | |||||
{ | |||||
const float* const in1 = inputs[0]; | |||||
const float* const in2 = inputs[1]; | |||||
const float* const in3 = inputs[2]; | |||||
const float* const in4 = inputs[3]; | |||||
/* */ float* const out1 = outputs[0]; | |||||
/* */ float* const out2 = outputs[1]; | |||||
float tmp; | |||||
twofloats tempf; | |||||
twofloats tempin; | |||||
for (uint32_t i=0; i<frames; ++i) | |||||
{ | |||||
// calculate envelope from 1st two inputs | |||||
tmp = std::abs(in1[i]); | |||||
/**/ if (tmp > ampEnvelope_l) | |||||
ampEnvelope_l = tmp; | |||||
else if (tmp < ampEnvelope_l) | |||||
ampEnvelope_l -= envDecay; | |||||
tmp = std::abs(in2[i]); | |||||
/**/ if (tmp > ampEnvelope_r) | |||||
ampEnvelope_r = tmp; | |||||
else if (tmp < ampEnvelope_r) | |||||
ampEnvelope_r -= envDecay; | |||||
// calculate envelope from 2nd two inputs | |||||
tmp = std::abs(in3[i]); | |||||
/**/ if (tmp > audioEnvelope_l) | |||||
audioEnvelope_l = tmp; | |||||
else if (tmp < audioEnvelope_l) | |||||
audioEnvelope_l -= envDecay; | |||||
tmp = std::abs(in4[i]); | |||||
/**/ if (tmp > audioEnvelope_r) | |||||
audioEnvelope_r = tmp; | |||||
else if (tmp < audioEnvelope_r) | |||||
audioEnvelope_r -= envDecay; | |||||
// make sure we're not multiplying by a negative number | |||||
if (ampEnvelope_l < 0.0f) | |||||
ampEnvelope_l = 0.0f; | |||||
if (ampEnvelope_r < 0.0f) | |||||
ampEnvelope_r = 0.0f; | |||||
if (audioEnvelope_l < 0.0f) | |||||
audioEnvelope_l = 0.0f; | |||||
if (audioEnvelope_r < 0.0f) | |||||
audioEnvelope_r = 0.0f; | |||||
// work out whether we need to multiply audio input | |||||
if (audioEnvelope_l > fThreshold) | |||||
{ | |||||
tempin.left = in3[i]; | |||||
} | |||||
else | |||||
{ | |||||
if (audioEnvelope_l > 0.001f) | |||||
tempin.left = in3[i] * (fThreshold/audioEnvelope_l); | |||||
else | |||||
tempin.left = in3[i] * (fThreshold/0.001f); //so it'll decay away smoothly | |||||
} | |||||
if (audioEnvelope_r > fThreshold) | |||||
{ | |||||
tempin.right = in4[i]; | |||||
} | |||||
else | |||||
{ | |||||
if (audioEnvelope_r > 0.001f) | |||||
tempin.right = in4[i] * (fThreshold/audioEnvelope_r); | |||||
else | |||||
tempin.right = in4[i] * (fThreshold/0.001f); | |||||
} | |||||
// calculate output | |||||
tempf.left = tempin.left * ampEnvelope_l; | |||||
tempf.left *= fDepth; | |||||
tempf.left = tempf.left + ((1.0f-fDepth)*tempin.left); | |||||
tempf.right = tempin.right * ampEnvelope_r; | |||||
tempf.right *= fDepth; | |||||
tempf.right = tempf.right + ((1.0f-fDepth)*tempin.right); | |||||
out1[i] = tempf.left; | |||||
out2[i] = tempf.right; | |||||
} | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
Plugin* createPlugin() | |||||
{ | |||||
return new DistrhoPluginAmplitudeImposer(); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
END_NAMESPACE_DISTRHO |
@@ -0,0 +1,127 @@ | |||||
/* | |||||
* DISTRHO AmplitudeImposer, a DPF'ied AmplitudeImposer. | |||||
* Copyright (C) 2004 Niall Moody | |||||
* Copyright (C) 2015 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* Permission is hereby granted, free of charge, to any person obtaining a | |||||
* copy of this software and associated documentation files (the "Software"), | |||||
* to deal in the Software without restriction, including without limitation | |||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||||
* and/or sell copies of the Software, and to permit persons to whom the | |||||
* Software is furnished to do so, subject to the following conditions: | |||||
* | |||||
* The above copyright notice and this permission notice shall be included in | |||||
* all copies or substantial portions of the Software. | |||||
* | |||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |||||
* DEALINGS IN THE SOFTWARE. | |||||
*/ | |||||
#ifndef DISTRHO_PLUGIN_AMPLITUDE_IMPOSER_HPP_INCLUDED | |||||
#define DISTRHO_PLUGIN_AMPLITUDE_IMPOSER_HPP_INCLUDED | |||||
#include "DistrhoPlugin.hpp" | |||||
START_NAMESPACE_DISTRHO | |||||
// ----------------------------------------------------------------------- | |||||
class DistrhoPluginAmplitudeImposer : public Plugin | |||||
{ | |||||
public: | |||||
enum Parameters { | |||||
kParameterDepth, | |||||
kParameterThreshold, | |||||
kParameterCount | |||||
}; | |||||
DistrhoPluginAmplitudeImposer(); | |||||
protected: | |||||
// ------------------------------------------------------------------- | |||||
// Information | |||||
const char* getName() const noexcept override | |||||
{ | |||||
return "Amplitude Imposer"; | |||||
} | |||||
const char* getLabel() const noexcept override | |||||
{ | |||||
return "AmplitudeImposer"; | |||||
} | |||||
const char* getDescription() const override | |||||
{ | |||||
return "Takes 2 stereo inputs and imposes the amplitude envelope of the first one on the second one.\n\ | |||||
Also has a threshold level for the second input, so that when the signal falls below it, it is amplified up to the threshold, to give a greater signal to be amplitude modulated."; | |||||
} | |||||
const char* getMaker() const noexcept override | |||||
{ | |||||
return "ndc Plugs"; | |||||
} | |||||
const char* getHomePage() const override | |||||
{ | |||||
return "https://github.com/DISTRHO/ndc-Plugs"; | |||||
} | |||||
const char* getLicense() const noexcept override | |||||
{ | |||||
return "MIT"; | |||||
} | |||||
uint32_t getVersion() const noexcept override | |||||
{ | |||||
return d_version(0, 1, 0); | |||||
} | |||||
int64_t getUniqueId() const noexcept override | |||||
{ | |||||
return d_cconst('A', 'm', 'I', 'm'); | |||||
} | |||||
// ------------------------------------------------------------------- | |||||
// Init | |||||
void initAudioPort(bool input, uint32_t index, AudioPort& port) override; | |||||
void initParameter(uint32_t index, Parameter& parameter) override; | |||||
void initProgramName(uint32_t index, String& programName) override; | |||||
// ------------------------------------------------------------------- | |||||
// Internal data | |||||
float getParameterValue(uint32_t index) const override; | |||||
void setParameterValue(uint32_t index, float value) override; | |||||
void loadProgram(uint32_t index) override; | |||||
// ------------------------------------------------------------------- | |||||
// Process | |||||
void activate() override; | |||||
void run(const float** inputs, float** outputs, uint32_t frames) override; | |||||
// ------------------------------------------------------------------- | |||||
private: | |||||
float fDepth; | |||||
float fThreshold; | |||||
float ampEnvelope_l, ampEnvelope_r; | |||||
float audioEnvelope_l, audioEnvelope_r; | |||||
float envDecay; | |||||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistrhoPluginAmplitudeImposer) | |||||
}; | |||||
// ----------------------------------------------------------------------- | |||||
END_NAMESPACE_DISTRHO | |||||
#endif // DISTRHO_PLUGIN_AMPLITUDE_IMPOSER_HPP_INCLUDED |
@@ -0,0 +1,40 @@ | |||||
/* | |||||
* DISTRHO AmplitudeImposer, a DPF'ied AmplitudeImposer. | |||||
* Copyright (C) 2004 Niall Moody | |||||
* Copyright (C) 2015 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* Permission is hereby granted, free of charge, to any person obtaining a | |||||
* copy of this software and associated documentation files (the "Software"), | |||||
* to deal in the Software without restriction, including without limitation | |||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||||
* and/or sell copies of the Software, and to permit persons to whom the | |||||
* Software is furnished to do so, subject to the following conditions: | |||||
* | |||||
* The above copyright notice and this permission notice shall be included in | |||||
* all copies or substantial portions of the Software. | |||||
* | |||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |||||
* DEALINGS IN THE SOFTWARE. | |||||
*/ | |||||
#ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | |||||
#define DISTRHO_PLUGIN_INFO_H_INCLUDED | |||||
#define DISTRHO_PLUGIN_BRAND "DISTRHO" | |||||
#define DISTRHO_PLUGIN_NAME "Amplitude Imposr" | |||||
#define DISTRHO_PLUGIN_URI "http://www.niallmoody.com/ndcplugs/ampimposer.htm" | |||||
#define DISTRHO_PLUGIN_HAS_UI 1 | |||||
#define DISTRHO_PLUGIN_IS_RT_SAFE 1 | |||||
#define DISTRHO_PLUGIN_NUM_INPUTS 4 | |||||
#define DISTRHO_PLUGIN_NUM_OUTPUTS 2 | |||||
#define DISTRHO_PLUGIN_WANT_PROGRAMS 1 | |||||
#define DISTRHO_PLUGIN_LV2_CATEGORY "lv2:AmplifierPlugin" | |||||
#endif // DISTRHO_PLUGIN_INFO_H_INCLUDED |
@@ -0,0 +1,116 @@ | |||||
/* | |||||
* DISTRHO AmplitudeImposer, a DPF'ied AmplitudeImposer. | |||||
* Copyright (C) 2004 Niall Moody | |||||
* Copyright (C) 2015 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* Permission is hereby granted, free of charge, to any person obtaining a | |||||
* copy of this software and associated documentation files (the "Software"), | |||||
* to deal in the Software without restriction, including without limitation | |||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||||
* and/or sell copies of the Software, and to permit persons to whom the | |||||
* Software is furnished to do so, subject to the following conditions: | |||||
* | |||||
* The above copyright notice and this permission notice shall be included in | |||||
* all copies or substantial portions of the Software. | |||||
* | |||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |||||
* DEALINGS IN THE SOFTWARE. | |||||
*/ | |||||
#include "DistrhoUIAmplitudeImposer.hpp" | |||||
#include "DistrhoPluginAmplitudeImposer.hpp" | |||||
START_NAMESPACE_DISTRHO | |||||
namespace Art = DistrhoArtworkAmplitudeImposer; | |||||
// ----------------------------------------------------------------------- | |||||
DistrhoUIAmplitudeImposer::DistrhoUIAmplitudeImposer() | |||||
: UI(Art::backWidth, Art::backHeight), | |||||
fImgBackground(Art::backData, Art::backWidth, Art::backHeight, GL_LUMINANCE) | |||||
{ | |||||
// sliders | |||||
Image sliderImage(Art::sliderData, Art::sliderWidth, Art::sliderHeight, GL_LUMINANCE); | |||||
fSliderDepth = new ImageSlider(this, sliderImage); | |||||
fSliderDepth->setId(DistrhoPluginAmplitudeImposer::kParameterDepth); | |||||
fSliderDepth->setStartPos(108, 71); | |||||
fSliderDepth->setEndPos(268, 71); | |||||
fSliderDepth->setRange(0.0f, 1.0f); | |||||
fSliderDepth->setCallback(this); | |||||
fSliderThres = new ImageSlider(this, sliderImage); | |||||
fSliderThres->setId(DistrhoPluginAmplitudeImposer::kParameterThreshold); | |||||
fSliderThres->setStartPos(108, 110); | |||||
fSliderThres->setEndPos(268, 110); | |||||
fSliderThres->setRange(0.0f, 1.0f); | |||||
fSliderThres->setCallback(this); | |||||
// set initial values | |||||
programLoaded(0); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
// DSP Callbacks | |||||
void DistrhoUIAmplitudeImposer::parameterChanged(uint32_t index, float value) | |||||
{ | |||||
switch (index) | |||||
{ | |||||
case DistrhoPluginAmplitudeImposer::kParameterDepth: | |||||
fSliderDepth->setValue(value); | |||||
break; | |||||
case DistrhoPluginAmplitudeImposer::kParameterThreshold: | |||||
fSliderThres->setValue(value); | |||||
break; | |||||
} | |||||
} | |||||
void DistrhoUIAmplitudeImposer::programLoaded(uint32_t index) | |||||
{ | |||||
if (index != 0) | |||||
return; | |||||
fSliderDepth->setValue(1.0f); | |||||
fSliderThres->setValue(0.5f); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
// Widget Callbacks | |||||
void DistrhoUIAmplitudeImposer::imageSliderDragStarted(ImageSlider* slider) | |||||
{ | |||||
editParameter(slider->getId(), true); | |||||
} | |||||
void DistrhoUIAmplitudeImposer::imageSliderDragFinished(ImageSlider* slider) | |||||
{ | |||||
editParameter(slider->getId(), false); | |||||
} | |||||
void DistrhoUIAmplitudeImposer::imageSliderValueChanged(ImageSlider* slider, float value) | |||||
{ | |||||
setParameterValue(slider->getId(), value); | |||||
} | |||||
void DistrhoUIAmplitudeImposer::onDisplay() | |||||
{ | |||||
fImgBackground.draw(); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
UI* createUI() | |||||
{ | |||||
return new DistrhoUIAmplitudeImposer(); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
END_NAMESPACE_DISTRHO |
@@ -0,0 +1,70 @@ | |||||
/* | |||||
* DISTRHO AmplitudeImposer, a DPF'ied AmplitudeImposer. | |||||
* Copyright (C) 2004 Niall Moody | |||||
* Copyright (C) 2015 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* Permission is hereby granted, free of charge, to any person obtaining a | |||||
* copy of this software and associated documentation files (the "Software"), | |||||
* to deal in the Software without restriction, including without limitation | |||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||||
* and/or sell copies of the Software, and to permit persons to whom the | |||||
* Software is furnished to do so, subject to the following conditions: | |||||
* | |||||
* The above copyright notice and this permission notice shall be included in | |||||
* all copies or substantial portions of the Software. | |||||
* | |||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |||||
* DEALINGS IN THE SOFTWARE. | |||||
*/ | |||||
#ifndef DISTRHO_UI_AMPLITUDE_IMPOSER_HPP_INCLUDED | |||||
#define DISTRHO_UI_AMPLITUDE_IMPOSER_HPP_INCLUDED | |||||
#include "DistrhoUI.hpp" | |||||
#include "ImageWidgets.hpp" | |||||
#include "DistrhoArtworkAmplitudeImposer.hpp" | |||||
START_NAMESPACE_DISTRHO | |||||
// ----------------------------------------------------------------------- | |||||
class DistrhoUIAmplitudeImposer : public UI, | |||||
public ImageSlider::Callback | |||||
{ | |||||
public: | |||||
DistrhoUIAmplitudeImposer(); | |||||
protected: | |||||
// ------------------------------------------------------------------- | |||||
// DSP Callbacks | |||||
void parameterChanged(uint32_t index, float value) override; | |||||
void programLoaded(uint32_t index) override; | |||||
// ------------------------------------------------------------------- | |||||
// Widget Callbacks | |||||
void imageSliderDragStarted(ImageSlider* slider) override; | |||||
void imageSliderDragFinished(ImageSlider* slider) override; | |||||
void imageSliderValueChanged(ImageSlider* slider, float value) override; | |||||
void onDisplay() override; | |||||
private: | |||||
Image fImgBackground; | |||||
ScopedPointer<ImageSlider> fSliderDepth, fSliderThres; | |||||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistrhoUIAmplitudeImposer) | |||||
}; | |||||
// ----------------------------------------------------------------------- | |||||
END_NAMESPACE_DISTRHO | |||||
#endif // DISTRHO_UI_AMPLITUDE_IMPOSER_HPP_INCLUDED |
@@ -0,0 +1,53 @@ | |||||
#!/usr/bin/make -f | |||||
# Makefile for DISTRHO Plugins # | |||||
# ---------------------------- # | |||||
# Created by falkTX | |||||
# | |||||
# -------------------------------------------------------------- | |||||
# Project name, used for binaries | |||||
NAME = AmplitudeImposer | |||||
# -------------------------------------------------------------- | |||||
# Files to build | |||||
OBJS_DSP = \ | |||||
DistrhoPluginAmplitudeImposer.cpp.o | |||||
OBJS_UI = \ | |||||
DistrhoArtworkAmplitudeImposer.cpp.o \ | |||||
DistrhoUIAmplitudeImposer.cpp.o | |||||
# -------------------------------------------------------------- | |||||
# Do some magic | |||||
include ../Makefile.ndc-Plugs.mk | |||||
# -------------------------------------------------------------- | |||||
# Enable all possible plugin types | |||||
ifeq ($(HAVE_JACK),true) | |||||
TARGETS += jack | |||||
endif | |||||
ifeq ($(LINUX),true) | |||||
TARGETS += ladspa | |||||
ifeq ($(HAVE_DGL),true) | |||||
ifeq ($(HAVE_LIBLO),true) | |||||
TARGETS += dssi | |||||
endif | |||||
endif | |||||
endif | |||||
ifeq ($(HAVE_DGL),true) | |||||
TARGETS += lv2_sep | |||||
else | |||||
TARGETS += lv2_dsp | |||||
endif | |||||
TARGETS += vst | |||||
all: $(TARGETS) | |||||
# -------------------------------------------------------------- |
@@ -0,0 +1,20 @@ | |||||
/* (Auto-generated binary data file). */ | |||||
#ifndef BINARY_DISTRHOARTWORKCYCLESHIFTER_HPP | |||||
#define BINARY_DISTRHOARTWORKCYCLESHIFTER_HPP | |||||
namespace DistrhoArtworkCycleShifter | |||||
{ | |||||
extern const char* backData; | |||||
const unsigned int backDataSize = 57352; | |||||
const unsigned int backWidth = 268; | |||||
const unsigned int backHeight = 107; | |||||
extern const char* sliderData; | |||||
const unsigned int sliderDataSize = 392; | |||||
const unsigned int sliderWidth = 14; | |||||
const unsigned int sliderHeight = 14; | |||||
} | |||||
#endif // BINARY_DISTRHOARTWORKCYCLESHIFTER_HPP | |||||
@@ -0,0 +1,193 @@ | |||||
/* | |||||
* DISTRHO CycleShifter, a DPF'ied CycleShifter. | |||||
* Copyright (C) 2004 Niall Moody | |||||
* Copyright (C) 2015 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* Permission is hereby granted, free of charge, to any person obtaining a | |||||
* copy of this software and associated documentation files (the "Software"), | |||||
* to deal in the Software without restriction, including without limitation | |||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||||
* and/or sell copies of the Software, and to permit persons to whom the | |||||
* Software is furnished to do so, subject to the following conditions: | |||||
* | |||||
* The above copyright notice and this permission notice shall be included in | |||||
* all copies or substantial portions of the Software. | |||||
* | |||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |||||
* DEALINGS IN THE SOFTWARE. | |||||
*/ | |||||
#include "DistrhoPluginCycleShifter.hpp" | |||||
START_NAMESPACE_DISTRHO | |||||
// ----------------------------------------------------------------------- | |||||
DistrhoPluginCycleShifter::DistrhoPluginCycleShifter() | |||||
: Plugin(kParameterCount, 1, 0), // 1 program, 0 states | |||||
fNewCycleVolume(1.0f), | |||||
fInputVolume(1.0f), | |||||
OutIndex(0), | |||||
InCount(0), | |||||
ReadWrite(false), | |||||
EnvOld(0.0f) | |||||
{ | |||||
std::memset(CycleBuffer, 0, sizeof(float)*BUFFER_SIZE); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
// Init | |||||
void DistrhoPluginCycleShifter::initParameter(uint32_t index, Parameter& parameter) | |||||
{ | |||||
parameter.hints = kParameterIsAutomable; | |||||
parameter.ranges.min = 0.0f; | |||||
parameter.ranges.max = 1.0f; | |||||
switch (index) | |||||
{ | |||||
case kParameterNewCycleVolume: | |||||
parameter.name = "New Cycle Vol"; | |||||
parameter.symbol = "ncvolume"; | |||||
parameter.ranges.def = 1.0f; | |||||
break; | |||||
case kParameterInputVolume: | |||||
parameter.name = "Input Vol"; | |||||
parameter.symbol = "ipvolume"; | |||||
parameter.ranges.def = 1.0f; | |||||
break; | |||||
} | |||||
} | |||||
void DistrhoPluginCycleShifter::initProgramName(uint32_t index, String& programName) | |||||
{ | |||||
if (index != 0) | |||||
return; | |||||
programName = "Default"; | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
// Internal data | |||||
float DistrhoPluginCycleShifter::getParameterValue(uint32_t index) const | |||||
{ | |||||
switch(index) | |||||
{ | |||||
case kParameterNewCycleVolume: | |||||
return fNewCycleVolume; | |||||
case kParameterInputVolume: | |||||
return fInputVolume; | |||||
default: | |||||
return 0.0f; | |||||
} | |||||
} | |||||
void DistrhoPluginCycleShifter::setParameterValue(uint32_t index, float value) | |||||
{ | |||||
switch(index) | |||||
{ | |||||
case kParameterNewCycleVolume: | |||||
fNewCycleVolume = value; | |||||
break; | |||||
case kParameterInputVolume: | |||||
fInputVolume = value; | |||||
break; | |||||
} | |||||
} | |||||
void DistrhoPluginCycleShifter::loadProgram(uint32_t index) | |||||
{ | |||||
if (index != 0) | |||||
return; | |||||
fNewCycleVolume = 1.0f; | |||||
fInputVolume = 1.0f; | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
// Process | |||||
void DistrhoPluginCycleShifter::activate() | |||||
{ | |||||
std::memset(CycleBuffer, 0, sizeof(float)*BUFFER_SIZE); | |||||
OutIndex = 0; | |||||
InCount = 0; | |||||
ReadWrite = false; | |||||
EnvOld = 0.0f; | |||||
} | |||||
void DistrhoPluginCycleShifter::run(const float** inputs, float** outputs, uint32_t frames) | |||||
{ | |||||
const float* in = inputs[0]; | |||||
/**/ float* out = outputs[0]; | |||||
for (uint32_t i=0; i<frames; ++i) | |||||
*out++ = DoProcess(*in++); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
// Borrowed this from Toby Bear's Delphi template - it maybe adds a bit to cpu | |||||
// usage, but it makes things simpler... | |||||
// ----------------------------------------------------------------------- | |||||
float DistrhoPluginCycleShifter::DoProcess(float a) | |||||
{ | |||||
const float tempval = a; | |||||
if (! ReadWrite) // if we're in read mode | |||||
{ | |||||
if (InCount == 0) // if we're waiting for the start of a new cycle to read | |||||
{ | |||||
if (EnvOld < 0.0f && tempval >= 0.0f) // as soon as the input goes past 0 we start reading | |||||
{ | |||||
CycleBuffer[InCount++] = tempval; | |||||
} | |||||
} | |||||
else if (! (EnvOld < 0.0f && tempval >= 0.0f)) // if we've not reached the end of the cycle yet | |||||
{ | |||||
CycleBuffer[InCount] = tempval; | |||||
if (++InCount >= BUFFER_SIZE) // if we've reached the end of the buffer | |||||
{ | |||||
InCount = BUFFER_SIZE; | |||||
ReadWrite = true; // we're in write mode now | |||||
} | |||||
} | |||||
else // we've reached the end of the cycle | |||||
{ | |||||
CycleBuffer[InCount++] = 0.0f; | |||||
ReadWrite = true; | |||||
} | |||||
a *= fInputVolume; | |||||
} | |||||
else // we're in write mode | |||||
{ | |||||
a = (a*fInputVolume) + (CycleBuffer[OutIndex]*fNewCycleVolume); | |||||
if (++OutIndex == InCount) // we've reached the end of our stored cycle | |||||
{ | |||||
InCount = 0; | |||||
OutIndex = 0; | |||||
ReadWrite = false; | |||||
} | |||||
} | |||||
EnvOld = tempval; | |||||
return a; | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
Plugin* createPlugin() | |||||
{ | |||||
return new DistrhoPluginCycleShifter(); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
END_NAMESPACE_DISTRHO |
@@ -0,0 +1,127 @@ | |||||
/* | |||||
* DISTRHO CycleShifter, a DPF'ied CycleShifter. | |||||
* Copyright (C) 2004 Niall Moody | |||||
* Copyright (C) 2015 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* Permission is hereby granted, free of charge, to any person obtaining a | |||||
* copy of this software and associated documentation files (the "Software"), | |||||
* to deal in the Software without restriction, including without limitation | |||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||||
* and/or sell copies of the Software, and to permit persons to whom the | |||||
* Software is furnished to do so, subject to the following conditions: | |||||
* | |||||
* The above copyright notice and this permission notice shall be included in | |||||
* all copies or substantial portions of the Software. | |||||
* | |||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |||||
* DEALINGS IN THE SOFTWARE. | |||||
*/ | |||||
#ifndef DISTRHO_PLUGIN_CYCLE_SHIFTER_HPP_INCLUDED | |||||
#define DISTRHO_PLUGIN_CYCLE_SHIFTER_HPP_INCLUDED | |||||
#include "DistrhoPlugin.hpp" | |||||
#define BUFFER_SIZE 11025 | |||||
START_NAMESPACE_DISTRHO | |||||
// ----------------------------------------------------------------------- | |||||
class DistrhoPluginCycleShifter : public Plugin | |||||
{ | |||||
public: | |||||
enum Parameters { | |||||
kParameterNewCycleVolume, | |||||
kParameterInputVolume, | |||||
kParameterCount | |||||
}; | |||||
DistrhoPluginCycleShifter(); | |||||
protected: | |||||
// ------------------------------------------------------------------- | |||||
// Information | |||||
const char* getLabel() const noexcept override | |||||
{ | |||||
return "CycleShifter"; | |||||
} | |||||
const char* getDescription() const override | |||||
{ | |||||
return "Reads in a cycle's-worth of the input signal, then (once the whole cycle's been read in) outputs it again, on top of the current output.\n\ | |||||
Works best with long/sustained sounds (e.g. strings, pads etc.), sounds like a weird kind of gentle distortion."; | |||||
} | |||||
const char* getMaker() const noexcept override | |||||
{ | |||||
return "ndc Plugs"; | |||||
} | |||||
const char* getHomePage() const override | |||||
{ | |||||
return "https://github.com/DISTRHO/ndc-Plugs"; | |||||
} | |||||
const char* getLicense() const noexcept override | |||||
{ | |||||
return "MIT"; | |||||
} | |||||
uint32_t getVersion() const noexcept override | |||||
{ | |||||
return d_version(0, 1, 0); | |||||
} | |||||
int64_t getUniqueId() const noexcept override | |||||
{ | |||||
return d_cconst('C', 'S', 'f', 't'); | |||||
} | |||||
// ------------------------------------------------------------------- | |||||
// Init | |||||
void initParameter(uint32_t index, Parameter& parameter) override; | |||||
void initProgramName(uint32_t index, String& programName) override; | |||||
// ------------------------------------------------------------------- | |||||
// Internal data | |||||
float getParameterValue(uint32_t index) const override; | |||||
void setParameterValue(uint32_t index, float value) override; | |||||
void loadProgram(uint32_t index) override; | |||||
// ------------------------------------------------------------------- | |||||
// Process | |||||
void activate() override; | |||||
void run(const float** inputs, float** outputs, uint32_t frames) override; | |||||
// ------------------------------------------------------------------- | |||||
private: | |||||
float fNewCycleVolume; | |||||
float fInputVolume; | |||||
float CycleBuffer[BUFFER_SIZE]; // buffer to store the cycle in | |||||
int OutIndex; // index for playing the buffer | |||||
int InCount; // counts how many samples we've recorded | |||||
bool ReadWrite; // 0=read, 1=write | |||||
float EnvOld; // last (input) sample - used to determine zero-crossings | |||||
float DoProcess(float a); | |||||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistrhoPluginCycleShifter) | |||||
}; | |||||
// ----------------------------------------------------------------------- | |||||
END_NAMESPACE_DISTRHO | |||||
#endif // DISTRHO_PLUGIN_CYCLE_SHIFTER_HPP_INCLUDED |
@@ -0,0 +1,38 @@ | |||||
/* | |||||
* DISTRHO CycleShifter, a DPF'ied CycleShifter. | |||||
* Copyright (C) 2004 Niall Moody | |||||
* Copyright (C) 2015 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* Permission is hereby granted, free of charge, to any person obtaining a | |||||
* copy of this software and associated documentation files (the "Software"), | |||||
* to deal in the Software without restriction, including without limitation | |||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||||
* and/or sell copies of the Software, and to permit persons to whom the | |||||
* Software is furnished to do so, subject to the following conditions: | |||||
* | |||||
* The above copyright notice and this permission notice shall be included in | |||||
* all copies or substantial portions of the Software. | |||||
* | |||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |||||
* DEALINGS IN THE SOFTWARE. | |||||
*/ | |||||
#ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | |||||
#define DISTRHO_PLUGIN_INFO_H_INCLUDED | |||||
#define DISTRHO_PLUGIN_BRAND "DISTRHO" | |||||
#define DISTRHO_PLUGIN_NAME "Cycle Shifter" | |||||
#define DISTRHO_PLUGIN_URI "http://www.niallmoody.com/ndcplugs/cycleshifter.htm" | |||||
#define DISTRHO_PLUGIN_HAS_UI 1 | |||||
#define DISTRHO_PLUGIN_IS_RT_SAFE 1 | |||||
#define DISTRHO_PLUGIN_NUM_INPUTS 1 | |||||
#define DISTRHO_PLUGIN_NUM_OUTPUTS 1 | |||||
#define DISTRHO_PLUGIN_WANT_PROGRAMS 1 | |||||
#endif // DISTRHO_PLUGIN_INFO_H_INCLUDED |
@@ -0,0 +1,116 @@ | |||||
/* | |||||
* DISTRHO CycleShifter, a DPF'ied CycleShifter. | |||||
* Copyright (C) 2004 Niall Moody | |||||
* Copyright (C) 2015 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* Permission is hereby granted, free of charge, to any person obtaining a | |||||
* copy of this software and associated documentation files (the "Software"), | |||||
* to deal in the Software without restriction, including without limitation | |||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||||
* and/or sell copies of the Software, and to permit persons to whom the | |||||
* Software is furnished to do so, subject to the following conditions: | |||||
* | |||||
* The above copyright notice and this permission notice shall be included in | |||||
* all copies or substantial portions of the Software. | |||||
* | |||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |||||
* DEALINGS IN THE SOFTWARE. | |||||
*/ | |||||
#include "DistrhoUICycleShifter.hpp" | |||||
#include "DistrhoPluginCycleShifter.hpp" | |||||
START_NAMESPACE_DISTRHO | |||||
namespace Art = DistrhoArtworkCycleShifter; | |||||
// ----------------------------------------------------------------------- | |||||
DistrhoUICycleShifter::DistrhoUICycleShifter() | |||||
: UI(Art::backWidth, Art::backHeight), | |||||
fImgBackground(Art::backData, Art::backWidth, Art::backHeight, GL_LUMINANCE) | |||||
{ | |||||
// sliders | |||||
Image sliderImage(Art::sliderData, Art::sliderWidth, Art::sliderHeight, GL_LUMINANCE); | |||||
fSliderNewCycleVol = new ImageSlider(this, sliderImage); | |||||
fSliderNewCycleVol->setId(DistrhoPluginCycleShifter::kParameterNewCycleVolume); | |||||
fSliderNewCycleVol->setStartPos(6, 49); | |||||
fSliderNewCycleVol->setEndPos(247, 49); | |||||
fSliderNewCycleVol->setRange(0.0f, 1.0f); | |||||
fSliderNewCycleVol->setCallback(this); | |||||
fSliderInputVol = new ImageSlider(this, sliderImage); | |||||
fSliderInputVol->setId(DistrhoPluginCycleShifter::kParameterInputVolume); | |||||
fSliderInputVol->setStartPos(6, 80); | |||||
fSliderInputVol->setEndPos(247, 80); | |||||
fSliderInputVol->setRange(0.0f, 1.0f); | |||||
fSliderInputVol->setCallback(this); | |||||
// set initial values | |||||
programLoaded(0); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
// DSP Callbacks | |||||
void DistrhoUICycleShifter::parameterChanged(uint32_t index, float value) | |||||
{ | |||||
switch (index) | |||||
{ | |||||
case DistrhoPluginCycleShifter::kParameterNewCycleVolume: | |||||
fSliderNewCycleVol->setValue(value); | |||||
break; | |||||
case DistrhoPluginCycleShifter::kParameterInputVolume: | |||||
fSliderInputVol->setValue(value); | |||||
break; | |||||
} | |||||
} | |||||
void DistrhoUICycleShifter::programLoaded(uint32_t index) | |||||
{ | |||||
if (index != 0) | |||||
return; | |||||
fSliderNewCycleVol->setValue(1.0f); | |||||
fSliderInputVol->setValue(1.0f); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
// Widget Callbacks | |||||
void DistrhoUICycleShifter::imageSliderDragStarted(ImageSlider* slider) | |||||
{ | |||||
editParameter(slider->getId(), true); | |||||
} | |||||
void DistrhoUICycleShifter::imageSliderDragFinished(ImageSlider* slider) | |||||
{ | |||||
editParameter(slider->getId(), false); | |||||
} | |||||
void DistrhoUICycleShifter::imageSliderValueChanged(ImageSlider* slider, float value) | |||||
{ | |||||
setParameterValue(slider->getId(), value); | |||||
} | |||||
void DistrhoUICycleShifter::onDisplay() | |||||
{ | |||||
fImgBackground.draw(); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
UI* createUI() | |||||
{ | |||||
return new DistrhoUICycleShifter(); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
END_NAMESPACE_DISTRHO |
@@ -0,0 +1,70 @@ | |||||
/* | |||||
* DISTRHO CycleShifter, a DPF'ied CycleShifter. | |||||
* Copyright (C) 2004 Niall Moody | |||||
* Copyright (C) 2015 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* Permission is hereby granted, free of charge, to any person obtaining a | |||||
* copy of this software and associated documentation files (the "Software"), | |||||
* to deal in the Software without restriction, including without limitation | |||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||||
* and/or sell copies of the Software, and to permit persons to whom the | |||||
* Software is furnished to do so, subject to the following conditions: | |||||
* | |||||
* The above copyright notice and this permission notice shall be included in | |||||
* all copies or substantial portions of the Software. | |||||
* | |||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |||||
* DEALINGS IN THE SOFTWARE. | |||||
*/ | |||||
#ifndef DISTRHO_UI_CYCLE_SHIFTER_HPP_INCLUDED | |||||
#define DISTRHO_UI_CYCLE_SHIFTER_HPP_INCLUDED | |||||
#include "DistrhoUI.hpp" | |||||
#include "ImageWidgets.hpp" | |||||
#include "DistrhoArtworkCycleShifter.hpp" | |||||
START_NAMESPACE_DISTRHO | |||||
// ----------------------------------------------------------------------- | |||||
class DistrhoUICycleShifter : public UI, | |||||
public ImageSlider::Callback | |||||
{ | |||||
public: | |||||
DistrhoUICycleShifter(); | |||||
protected: | |||||
// ------------------------------------------------------------------- | |||||
// DSP Callbacks | |||||
void parameterChanged(uint32_t index, float value) override; | |||||
void programLoaded(uint32_t index) override; | |||||
// ------------------------------------------------------------------- | |||||
// Widget Callbacks | |||||
void imageSliderDragStarted(ImageSlider* slider) override; | |||||
void imageSliderDragFinished(ImageSlider* slider) override; | |||||
void imageSliderValueChanged(ImageSlider* slider, float value) override; | |||||
void onDisplay() override; | |||||
private: | |||||
Image fImgBackground; | |||||
ScopedPointer<ImageSlider> fSliderNewCycleVol, fSliderInputVol; | |||||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistrhoUICycleShifter) | |||||
}; | |||||
// ----------------------------------------------------------------------- | |||||
END_NAMESPACE_DISTRHO | |||||
#endif // DISTRHO_UI_CYCLE_SHIFTER_HPP_INCLUDED |
@@ -0,0 +1,53 @@ | |||||
#!/usr/bin/make -f | |||||
# Makefile for DISTRHO Plugins # | |||||
# ---------------------------- # | |||||
# Created by falkTX | |||||
# | |||||
# -------------------------------------------------------------- | |||||
# Project name, used for binaries | |||||
NAME = CycleShifter | |||||
# -------------------------------------------------------------- | |||||
# Files to build | |||||
OBJS_DSP = \ | |||||
DistrhoPluginCycleShifter.cpp.o | |||||
OBJS_UI = \ | |||||
DistrhoArtworkCycleShifter.cpp.o \ | |||||
DistrhoUICycleShifter.cpp.o | |||||
# -------------------------------------------------------------- | |||||
# Do some magic | |||||
include ../Makefile.ndc-Plugs.mk | |||||
# -------------------------------------------------------------- | |||||
# Enable all possible plugin types | |||||
ifeq ($(HAVE_JACK),true) | |||||
TARGETS += jack | |||||
endif | |||||
ifeq ($(LINUX),true) | |||||
TARGETS += ladspa | |||||
ifeq ($(HAVE_DGL),true) | |||||
ifeq ($(HAVE_LIBLO),true) | |||||
TARGETS += dssi | |||||
endif | |||||
endif | |||||
endif | |||||
ifeq ($(HAVE_DGL),true) | |||||
TARGETS += lv2_sep | |||||
else | |||||
TARGETS += lv2_dsp | |||||
endif | |||||
TARGETS += vst | |||||
all: $(TARGETS) | |||||
# -------------------------------------------------------------- |
@@ -22,7 +22,7 @@ OBJS_UI = \ | |||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
# Do some magic | # Do some magic | ||||
include ../Makefile.mk | |||||
include ../Makefile.Kars.mk | |||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
# Enable all possible plugin types | # Enable all possible plugin types | ||||