@@ -38,6 +38,9 @@ ifneq (,$(wildcard $(CURDIR)/bin/vst/cabbage-Additive.so)) | |||
cp -r bin/vst/* $(DESTDIR)$(PREFIX)/lib/vst/ | |||
endif | |||
# install protoplug files | |||
cp -r ports/protoplug/ProtoplugFiles $(DESTDIR)$(PREFIX)/share/ | |||
# ----------------------------------------- | |||
# clean | |||
@@ -14,6 +14,8 @@ lv2: | |||
$(MAKE) -C cabbage/LV2-fx | |||
$(MAKE) -C cabbage/LV2-ins | |||
$(MAKE) -C cabbage/LV2-midi | |||
$(MAKE) -C protoplug/LV2-fx | |||
$(MAKE) -C protoplug/LV2-gen | |||
# ----------------------------------------- | |||
# vst | |||
@@ -24,6 +26,8 @@ vst: | |||
$(MAKE) -C cabbage/VST-fx | |||
$(MAKE) -C cabbage/VST-ins | |||
$(MAKE) -C cabbage/VST-midi | |||
$(MAKE) -C protoplug/VST-fx | |||
$(MAKE) -C protoplug/VST-gen | |||
# ----------------------------------------- | |||
# clean | |||
@@ -34,12 +38,16 @@ clean: | |||
$(MAKE) clean -C cabbage/LV2-fx | |||
$(MAKE) clean -C cabbage/LV2-ins | |||
$(MAKE) clean -C cabbage/LV2-midi | |||
$(MAKE) clean -C protoplug/LV2-fx | |||
$(MAKE) clean -C protoplug/LV2-gen | |||
# VST | |||
$(MAKE) clean -C argotlunar/VST | |||
$(MAKE) clean -C cabbage/VST-fx | |||
$(MAKE) clean -C cabbage/VST-ins | |||
$(MAKE) clean -C cabbage/VST-midi | |||
$(MAKE) clean -C protoplug/VST-fx | |||
$(MAKE) clean -C protoplug/VST-gen | |||
rm -rf */LV2/intermediate | |||
rm -rf */VST/intermediate | |||
@@ -0,0 +1,24 @@ | |||
dofile("../../../scripts/make-project.lua") | |||
package = make_juce_lv2_project("protoplug-fx") | |||
package.defines = { | |||
package.defines, | |||
"PROTOPLUGFX=1" | |||
} | |||
package.includepaths = { | |||
package.includepaths, | |||
"../Source", | |||
"../JuceLibraryCode" | |||
} | |||
package.files = { | |||
matchfiles ( | |||
"../Source/*.cpp", | |||
"../Source/guiclasses/*.cpp", | |||
"../Source/vflib/*.cpp", | |||
"../../../libs/juce-plugin/JucePluginMain.cpp" | |||
) | |||
} |
@@ -0,0 +1,24 @@ | |||
dofile("../../../scripts/make-project.lua") | |||
package = make_juce_lv2_project("protoplug-gen") | |||
package.defines = { | |||
package.defines, | |||
"PROTOPLUGFX=0" | |||
} | |||
package.includepaths = { | |||
package.includepaths, | |||
"../Source", | |||
"../JuceLibraryCode" | |||
} | |||
package.files = { | |||
matchfiles ( | |||
"../Source/*.cpp", | |||
"../Source/guiclasses/*.cpp", | |||
"../Source/vflib/*.cpp", | |||
"../../../libs/juce-plugin/JucePluginMain.cpp" | |||
) | |||
} |
@@ -0,0 +1,469 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Class juce.AffineTransform</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Contents</h2> | |||
<ul> | |||
<li><a href="#Constructors">Constructors</a></li> | |||
<li><a href="#Methods">Methods</a></li> | |||
<li><a href="#Fields">Fields</a></li> | |||
<li><a href="#Predefined_values">Predefined values</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><strong>juce.AffineTransform</strong></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<h1>Class <code>juce.AffineTransform</code></h1> | |||
<p>A geometric transformation.</p> | |||
<p> | |||
<p> Is converted to a <a href="http://www.juce.com/api/classAffineTransform.html">JUCE AffineTransform</a>.</p> | |||
<p> The default constructor makes an <a href="../classes/juce.AffineTransform.html#juce.AffineTransform.identity">identity</a> transform, so all kinds of | |||
transformations can be created as follows :</p> | |||
<pre><code>rot180 = juce.AffineTransform():rotated(math.pi) | |||
chainey = juce.AffineTransform():scaled(2.5):translated(140,140) | |||
</code></pre> | |||
</p> | |||
<h2><a href="#Constructors">Constructors</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.AffineTransform.AffineTransform"><span class="proto_prefix">juce</span>.AffineTransform (mat00, mat01, mat02, mat10, mat11, mat12)</a></td> | |||
<td class="summary">Constuctor.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Methods">Methods</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.AffineTransform:translated"><span class="proto_prefix">juce.AffineTransform</span>:translated (dx, dy)</a></td> | |||
<td class="summary">Translated.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.AffineTransform:rotated"><span class="proto_prefix">juce.AffineTransform</span>:rotated (rad)</a></td> | |||
<td class="summary">Rotated.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.AffineTransform:scaled"><span class="proto_prefix">juce.AffineTransform</span>:scaled (scaleX[, scaleY=scaleX])</a></td> | |||
<td class="summary">Scaled.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.AffineTransform:followedBy"><span class="proto_prefix">juce.AffineTransform</span>:followedBy (other)</a></td> | |||
<td class="summary">Followed by.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Fields">Fields</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.AffineTransform.mat00"><span class="proto_prefix">juce.AffineTransform</span>.mat00</a></td> | |||
<td class="summary">Matrix [0] [0]</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.AffineTransform.mat01"><span class="proto_prefix">juce.AffineTransform</span>.mat01</a></td> | |||
<td class="summary">Matrix [0] [1]</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.AffineTransform.mat02"><span class="proto_prefix">juce.AffineTransform</span>.mat02</a></td> | |||
<td class="summary">Matrix [0] [2]</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.AffineTransform.mat10"><span class="proto_prefix">juce.AffineTransform</span>.mat10</a></td> | |||
<td class="summary">Matrix [1] [0]</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.AffineTransform.mat11"><span class="proto_prefix">juce.AffineTransform</span>.mat11</a></td> | |||
<td class="summary">Matrix [1] [1]</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.AffineTransform.mat12"><span class="proto_prefix">juce.AffineTransform</span>.mat12</a></td> | |||
<td class="summary">Matrix [1] [2]</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Predefined_values">Predefined values</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.AffineTransform.identity"><span class="proto_prefix">juce.AffineTransform</span>.identity</a></td> | |||
<td class="summary">Identity.</td> | |||
</tr> | |||
</table> | |||
<br/> | |||
<br/> | |||
<h2><a name="Constructors"></a>Constructors</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.AffineTransform.AffineTransform"></a> | |||
<strong><span class="proto_prefix">juce</span>.AffineTransform (mat00, mat01, mat02, mat10, mat11, mat12)</strong> | |||
</dt> | |||
<dd> | |||
<p>Constuctor. | |||
parameters thusly define a transformation matrix :</p> | |||
<pre><code>(mat00 mat01 mat02) | |||
(mat10 mat11 mat12) | |||
(0 0 1) | |||
</code></pre> | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">mat00</span> | |||
</li> | |||
<li><span class="parameter">mat01</span> | |||
</li> | |||
<li><span class="parameter">mat02</span> | |||
</li> | |||
<li><span class="parameter">mat10</span> | |||
</li> | |||
<li><span class="parameter">mat11</span> | |||
</li> | |||
<li><span class="parameter">mat12</span> | |||
</li> | |||
</ul> | |||
</dd> | |||
</dl> | |||
<h2><a name="Methods"></a>Methods</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.AffineTransform:translated"></a> | |||
<strong><span class="proto_prefix">juce.AffineTransform</span>:translated (dx, dy)</strong> | |||
</dt> | |||
<dd> | |||
Translated. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">dx</span> | |||
the horizontal offset | |||
</li> | |||
<li><span class="parameter">dy</span> | |||
the vertical offset | |||
</li> | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
a translated version of this transform | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "juce.AffineTransform:rotated"></a> | |||
<strong><span class="proto_prefix">juce.AffineTransform</span>:rotated (rad)</strong> | |||
</dt> | |||
<dd> | |||
Rotated. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">rad</span> | |||
the degree of rotation in radians | |||
</li> | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
a rotated version of this transform | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "juce.AffineTransform:scaled"></a> | |||
<strong><span class="proto_prefix">juce.AffineTransform</span>:scaled (scaleX[, scaleY=scaleX])</strong> | |||
</dt> | |||
<dd> | |||
Scaled. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">scaleX</span> | |||
</li> | |||
<li><span class="parameter">scaleY</span> | |||
(<em>default</em> scaleX) | |||
</li> | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
a scaled version of this transform | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "juce.AffineTransform:followedBy"></a> | |||
<strong><span class="proto_prefix">juce.AffineTransform</span>:followedBy (other)</strong> | |||
</dt> | |||
<dd> | |||
Followed by. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">other</span> | |||
</li> | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
a version of this transform followed by another | |||
</ol> | |||
</dd> | |||
</dl> | |||
<h2><a name="Fields"></a>Fields</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.AffineTransform.mat00"></a> | |||
<strong><span class="proto_prefix">juce.AffineTransform</span>.mat00</strong> | |||
</dt> | |||
<dd> | |||
Matrix [0] [0] | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.AffineTransform.mat01"></a> | |||
<strong><span class="proto_prefix">juce.AffineTransform</span>.mat01</strong> | |||
</dt> | |||
<dd> | |||
Matrix [0] [1] | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.AffineTransform.mat02"></a> | |||
<strong><span class="proto_prefix">juce.AffineTransform</span>.mat02</strong> | |||
</dt> | |||
<dd> | |||
Matrix [0] [2] | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.AffineTransform.mat10"></a> | |||
<strong><span class="proto_prefix">juce.AffineTransform</span>.mat10</strong> | |||
</dt> | |||
<dd> | |||
Matrix [1] [0] | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.AffineTransform.mat11"></a> | |||
<strong><span class="proto_prefix">juce.AffineTransform</span>.mat11</strong> | |||
</dt> | |||
<dd> | |||
Matrix [1] [1] | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.AffineTransform.mat12"></a> | |||
<strong><span class="proto_prefix">juce.AffineTransform</span>.mat12</strong> | |||
</dt> | |||
<dd> | |||
Matrix [1] [2] | |||
</ul> | |||
</dd> | |||
</dl> | |||
<h2><a name="Predefined_values"></a>Predefined values</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.AffineTransform.identity"></a> | |||
<strong><span class="proto_prefix">juce.AffineTransform</span>.identity</strong> | |||
</dt> | |||
<dd> | |||
Identity. | |||
The non-transform. | |||
</ul> | |||
</dd> | |||
</dl> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,389 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Class juce.AudioFormatReader</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Contents</h2> | |||
<ul> | |||
<li><a href="#Constructors">Constructors</a></li> | |||
<li><a href="#Methods">Methods</a></li> | |||
<li><a href="#Fields">Fields</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><strong>juce.AudioFormatReader</strong></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<h1>Class <code>juce.AudioFormatReader</code></h1> | |||
<p>Class to read audio files.</p> | |||
<p> Example usage: <a href="../examples/soundfile-test.lua.html#">soundfile-test.lua</a>.</p> | |||
<p> Reads the formats that JUCE supports, namely: WAV, AIFF, Flac, Ogg-Vorbis, Windows Media codecs, | |||
CoreAudio codecs, MP3. </p> | |||
<p> Is a pointer to a <a href="http://www.juce.com/api/classAudioFormatReader.html">JUCE AudioFormatReader</a>, | |||
and wraps some <a href="http://www.juce.com/api/classAudioFormatManager.html">AudioFormatManager</a> | |||
functionality. </p> | |||
<h2><a href="#Constructors">Constructors</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.AudioFormatReader.AudioFormatReader"><span class="proto_prefix">juce</span>.AudioFormatReader (filename)</a></td> | |||
<td class="summary">Load a sound file as an AudioFormatReader.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Methods">Methods</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.AudioFormatReader:read"><span class="wrapman"><span class="proto_prefix">juce.AudioFormatReader</span>:read<br> (destSamples, numDestChannels, startSampleInSource, numSamplesToRead[, fillLeftoverChannelsWithCopies=true])</span></a></td> | |||
<td class="summary">Read samples.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.AudioFormatReader:readToFloat"><span class="proto_prefix">juce.AudioFormatReader</span>:readToFloat<br> ([nChannels=2[, resample=true]])</a></td> | |||
<td class="summary">Read entire wave to float array.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.AudioFormatReader:readToDouble"><span class="proto_prefix">juce.AudioFormatReader</span>:readToDouble<br> ([nChannels=2[, resample=true]])</a></td> | |||
<td class="summary">Read entire wave to double array.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Fields">Fields</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.AudioFormatReader.sampleRate"><span class="proto_prefix">juce.AudioFormatReader</span>.sampleRate</a></td> | |||
<td class="summary">Sample rate</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.AudioFormatReader.bitsPerSample"><span class="proto_prefix">juce.AudioFormatReader</span>.bitsPerSample</a></td> | |||
<td class="summary">Bits per sample</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.AudioFormatReader.lengthInSamples"><span class="proto_prefix">juce.AudioFormatReader</span>.lengthInSamples</a></td> | |||
<td class="summary">Length in samples</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.AudioFormatReader.numChannels"><span class="proto_prefix">juce.AudioFormatReader</span>.numChannels</a></td> | |||
<td class="summary">Number of channels</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.AudioFormatReader.usesFloatingPointData"><span class="proto_prefix">juce.AudioFormatReader</span>.usesFloatingPointData</a></td> | |||
<td class="summary">Uses floating point data (boolean)</td> | |||
</tr> | |||
</table> | |||
<br/> | |||
<br/> | |||
<h2><a name="Constructors"></a>Constructors</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.AudioFormatReader.AudioFormatReader"></a> | |||
<strong><span class="proto_prefix">juce</span>.AudioFormatReader (filename)</strong> | |||
</dt> | |||
<dd> | |||
Load a sound file as an AudioFormatReader. | |||
The path can be absolute or relative to the protoplug directory. | |||
Returns <code>nil</code> if unsuccessful. The file will remain open until the | |||
AudioFormatReader is unset or otherwise garbage-collected. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">filename</span> | |||
</li> | |||
</ul> | |||
</dd> | |||
</dl> | |||
<h2><a name="Methods"></a>Methods</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.AudioFormatReader:read"></a> | |||
<strong><span class="wrapman"><span class="proto_prefix">juce.AudioFormatReader</span>:read<br> (destSamples, numDestChannels, startSampleInSource, numSamplesToRead[, fillLeftoverChannelsWithCopies=true])</span></strong> | |||
</dt> | |||
<dd> | |||
Read samples. <br/> | |||
Copies a number of samples from the file into the provided array. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">destSamples</span> | |||
a cdata array of pointers to buffers for each channel (<code>int * const *</code>) | |||
</li> | |||
<li><span class="parameter">numDestChannels</span> | |||
the number of elements in <code>destSamples</code> | |||
</li> | |||
<li><span class="parameter">startSampleInSource</span> | |||
</li> | |||
<li><span class="parameter">numSamplesToRead</span> | |||
</li> | |||
<li><span class="parameter">fillLeftoverChannelsWithCopies</span> | |||
<span class="types"><span class="type">boolean</span></span> | |||
used if <code>destSamples</code> has more channels than the source. | |||
(<em>default</em> true) | |||
</li> | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<span class="types"><span class="type">boolean</span></span> | |||
success | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "juce.AudioFormatReader:readToFloat"></a> | |||
<strong><span class="proto_prefix">juce.AudioFormatReader</span>:readToFloat<br> ([nChannels=2[, resample=true]])</strong> | |||
</dt> | |||
<dd> | |||
Read entire wave to float array. <br/> | |||
A simplified wrapper function for <a href="../classes/juce.AudioFormatReader.html#juce.AudioFormatReader:read">read</a> | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">nChannels</span> | |||
number of channels to be returned | |||
(<em>default</em> 2) | |||
</li> | |||
<li><span class="parameter">resample</span> | |||
whether to perform samplerate conversion to match the host's sample rate. | |||
If <code>true</code>, the length of the returned array may not be the wave's original <a href="../classes/juce.AudioFormatReader.html#juce.AudioFormatReader.lengthInSamples">lengthInSamples</a> . | |||
It will be given by the second returned value. | |||
(<em>default</em> true) | |||
</li> | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<li> | |||
a two-dimensional cdata array of channels containing samples (<code>float [nChannels][nSamples]</code>)</li> | |||
<li> | |||
the number of samples in each channel of the returned array</li> | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "juce.AudioFormatReader:readToDouble"></a> | |||
<strong><span class="proto_prefix">juce.AudioFormatReader</span>:readToDouble<br> ([nChannels=2[, resample=true]])</strong> | |||
</dt> | |||
<dd> | |||
Read entire wave to double array. <br/> | |||
This wraps <a href="../classes/juce.AudioFormatReader.html#juce.AudioFormatReader:readToFloat">readToFloat</a> and returns an array containing <code>double</code>-precision numbers. | |||
This takes twice as much space, but it may be faster to use, as this is the native Lua type. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">nChannels</span> | |||
number of channels to be returned | |||
(<em>default</em> 2) | |||
</li> | |||
<li><span class="parameter">resample</span> | |||
whether to perform samplerate conversion to match the host's sample rate. | |||
If <code>true</code>, the length of the returned array may not be the wave's original <a href="../classes/juce.AudioFormatReader.html#juce.AudioFormatReader.lengthInSamples">lengthInSamples</a> . | |||
It will be given by the second returned value. | |||
(<em>default</em> true) | |||
</li> | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<li> | |||
a two-dimensional cdata array of channels containing samples (<code>double [nChannels][nSamples]</code>)</li> | |||
<li> | |||
the number of samples in each channel of the returned array</li> | |||
</ol> | |||
</dd> | |||
</dl> | |||
<h2><a name="Fields"></a>Fields</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.AudioFormatReader.sampleRate"></a> | |||
<strong><span class="proto_prefix">juce.AudioFormatReader</span>.sampleRate</strong> | |||
</dt> | |||
<dd> | |||
Sample rate | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.AudioFormatReader.bitsPerSample"></a> | |||
<strong><span class="proto_prefix">juce.AudioFormatReader</span>.bitsPerSample</strong> | |||
</dt> | |||
<dd> | |||
Bits per sample | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.AudioFormatReader.lengthInSamples"></a> | |||
<strong><span class="proto_prefix">juce.AudioFormatReader</span>.lengthInSamples</strong> | |||
</dt> | |||
<dd> | |||
Length in samples | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.AudioFormatReader.numChannels"></a> | |||
<strong><span class="proto_prefix">juce.AudioFormatReader</span>.numChannels</strong> | |||
</dt> | |||
<dd> | |||
Number of channels | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.AudioFormatReader.usesFloatingPointData"></a> | |||
<strong><span class="proto_prefix">juce.AudioFormatReader</span>.usesFloatingPointData</strong> | |||
</dt> | |||
<dd> | |||
Uses floating point data (boolean) | |||
</ul> | |||
</dd> | |||
</dl> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,381 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Class juce.Colour</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Contents</h2> | |||
<ul> | |||
<li><a href="#Constructors">Constructors</a></li> | |||
<li><a href="#Fields">Fields</a></li> | |||
<li><a href="#Predefined_values">Predefined values</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><strong>juce.Colour</strong></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<h1>Class <code>juce.Colour</code></h1> | |||
<p>A simple colour class.</p> | |||
<p> Is converted to a <a href="http://www.juce.com/api/classColour.html">JUCE Colour</a></p> | |||
<h2><a href="#Constructors">Constructors</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Colour.Colour"><span class="proto_prefix">juce</span>.Colour (r, g, b[, a])</a></td> | |||
<td class="summary">Constuctor with classical arguments.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Colour.Colour"><span class="proto_prefix">juce</span>.Colour (args)</a></td> | |||
<td class="summary">Constuctor with named arguments.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Fields">Fields</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Colour.r"><span class="proto_prefix">juce.Colour</span>.r</a></td> | |||
<td class="summary">Red (0-255)</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Colour.g"><span class="proto_prefix">juce.Colour</span>.g</a></td> | |||
<td class="summary">Green (0-255)</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Colour.b"><span class="proto_prefix">juce.Colour</span>.b</a></td> | |||
<td class="summary">Blue (0-255)</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Colour.a"><span class="proto_prefix">juce.Colour</span>.a</a></td> | |||
<td class="summary">Alpha (0-255)</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Predefined_values">Predefined values</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Colour.black"><span class="proto_prefix">juce.Colour</span>.black</a></td> | |||
<td class="summary"> | |||
</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Colour.white"><span class="proto_prefix">juce.Colour</span>.white</a></td> | |||
<td class="summary"> | |||
</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Colour.red"><span class="proto_prefix">juce.Colour</span>.red</a></td> | |||
<td class="summary"> | |||
</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Colour.green"><span class="proto_prefix">juce.Colour</span>.green</a></td> | |||
<td class="summary"> | |||
</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Colour.blue"><span class="proto_prefix">juce.Colour</span>.blue</a></td> | |||
<td class="summary"> | |||
</td> | |||
</tr> | |||
</table> | |||
<br/> | |||
<br/> | |||
<h2><a name="Constructors"></a>Constructors</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.Colour.Colour"></a> | |||
<strong><span class="proto_prefix">juce</span>.Colour (r, g, b[, a])</strong> | |||
</dt> | |||
<dd> | |||
Constuctor with classical arguments. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">r</span> | |||
red | |||
</li> | |||
<li><span class="parameter">g</span> | |||
green | |||
</li> | |||
<li><span class="parameter">b</span> | |||
blue | |||
</li> | |||
<li><span class="parameter">a</span> | |||
alpha | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Colour.Colour"></a> | |||
<strong><span class="proto_prefix">juce</span>.Colour (args)</strong> | |||
</dt> | |||
<dd> | |||
Constuctor with named arguments. | |||
Every field is optional. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">args</span> | |||
<ul> | |||
<li><span class="parameter">r</span> | |||
red | |||
</li> | |||
<li><span class="parameter">g</span> | |||
green | |||
</li> | |||
<li><span class="parameter">b</span> | |||
blue, | |||
</li> | |||
<li><span class="parameter">a</span> | |||
alpha | |||
</li> | |||
</li></ul> | |||
</ul> | |||
</dd> | |||
</dl> | |||
<h2><a name="Fields"></a>Fields</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.Colour.r"></a> | |||
<strong><span class="proto_prefix">juce.Colour</span>.r</strong> | |||
</dt> | |||
<dd> | |||
Red (0-255) | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Colour.g"></a> | |||
<strong><span class="proto_prefix">juce.Colour</span>.g</strong> | |||
</dt> | |||
<dd> | |||
Green (0-255) | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Colour.b"></a> | |||
<strong><span class="proto_prefix">juce.Colour</span>.b</strong> | |||
</dt> | |||
<dd> | |||
Blue (0-255) | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Colour.a"></a> | |||
<strong><span class="proto_prefix">juce.Colour</span>.a</strong> | |||
</dt> | |||
<dd> | |||
Alpha (0-255) | |||
</ul> | |||
</dd> | |||
</dl> | |||
<h2><a name="Predefined_values"></a>Predefined values</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.Colour.black"></a> | |||
<strong><span class="proto_prefix">juce.Colour</span>.black</strong> | |||
</dt> | |||
<dd> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Colour.white"></a> | |||
<strong><span class="proto_prefix">juce.Colour</span>.white</strong> | |||
</dt> | |||
<dd> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Colour.red"></a> | |||
<strong><span class="proto_prefix">juce.Colour</span>.red</strong> | |||
</dt> | |||
<dd> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Colour.green"></a> | |||
<strong><span class="proto_prefix">juce.Colour</span>.green</strong> | |||
</dt> | |||
<dd> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Colour.blue"></a> | |||
<strong><span class="proto_prefix">juce.Colour</span>.blue</strong> | |||
</dt> | |||
<dd> | |||
</ul> | |||
</dd> | |||
</dl> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,371 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Class juce.ColourGradient</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Contents</h2> | |||
<ul> | |||
<li><a href="#Constructors">Constructors</a></li> | |||
<li><a href="#Methods">Methods</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><strong>juce.ColourGradient</strong></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<h1>Class <code>juce.ColourGradient</code></h1> | |||
<p>Colour Gradient.</p> | |||
<p> Is a pointer to a <a href="http://www.juce.com/api/classColourGradient.html">JUCE ColourGradient</a></p> | |||
<h2><a href="#Constructors">Constructors</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.ColourGradient.Colour"><span class="proto_prefix">juce</span>.ColourGradient (colour1, x1, y1, colour2, x2, y2, isRadial)</a></td> | |||
<td class="summary">Constuctor.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Methods">Methods</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.ColourGradient:addColour"><span class="proto_prefix">juce.ColourGradient</span>:addColour<br> (proportionAlongGradient, colour)</a></td> | |||
<td class="summary">Add colour.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.ColourGradient:removeColour"><span class="proto_prefix">juce.ColourGradient</span>:removeColour (index)</a></td> | |||
<td class="summary">Remove colour.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.ColourGradient:multiplyOpacity"><span class="proto_prefix">juce.ColourGradient</span>:multiplyOpacity (multiplier)</a></td> | |||
<td class="summary">Multiply opacity.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.ColourGradient:getNumColours"><span class="proto_prefix">juce.ColourGradient</span>:getNumColours ()</a></td> | |||
<td class="summary">Get number colour.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.ColourGradient:getColour"><span class="proto_prefix">juce.ColourGradient</span>:getColour (index)</a></td> | |||
<td class="summary">Get colour.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.ColourGradient:setColour"><span class="proto_prefix">juce.ColourGradient</span>:setColour (index, newColour)</a></td> | |||
<td class="summary">Get colour.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.ColourGradient:getColourAtPosition"><span class="proto_prefix">juce.ColourGradient</span>:getColourAtPosition (position)</a></td> | |||
<td class="summary">Get interpolated colour</td> | |||
</tr> | |||
</table> | |||
<br/> | |||
<br/> | |||
<h2><a name="Constructors"></a>Constructors</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.ColourGradient.Colour"></a> | |||
<strong><span class="proto_prefix">juce</span>.ColourGradient (colour1, x1, y1, colour2, x2, y2, isRadial)</strong> | |||
</dt> | |||
<dd> | |||
Constuctor. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">colour1</span> | |||
<span class="types"><a class="type" href="../classes/juce.Colour.html#">juce.Colour</a></span> | |||
colour at the beginning of the gradient | |||
</li> | |||
<li><span class="parameter">x1</span> | |||
coordinates of colour1 | |||
</li> | |||
<li><span class="parameter">y1</span> | |||
coordinates of colour1 | |||
</li> | |||
<li><span class="parameter">colour2</span> | |||
<span class="types"><a class="type" href="../classes/juce.Colour.html#">juce.Colour</a></span> | |||
colour at the end of the gradient | |||
</li> | |||
<li><span class="parameter">x2</span> | |||
coordinates of colour2 | |||
</li> | |||
<li><span class="parameter">y2</span> | |||
coordinates of colour2 | |||
</li> | |||
<li><span class="parameter">isRadial</span> | |||
<span class="types"><span class="type">boolean</span></span> | |||
whether the gradient should be linear or radial | |||
</li> | |||
</ul> | |||
</dd> | |||
</dl> | |||
<h2><a name="Methods"></a>Methods</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.ColourGradient:addColour"></a> | |||
<strong><span class="proto_prefix">juce.ColourGradient</span>:addColour<br> (proportionAlongGradient, colour)</strong> | |||
</dt> | |||
<dd> | |||
Add colour. | |||
Any number of colours can be added between the start and end of the gradient. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">proportionAlongGradient</span> | |||
</li> | |||
<li><span class="parameter">colour</span> | |||
<span class="types"><a class="type" href="../classes/juce.Colour.html#">juce.Colour</a></span> | |||
</li> | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
the new colour's index | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "juce.ColourGradient:removeColour"></a> | |||
<strong><span class="proto_prefix">juce.ColourGradient</span>:removeColour (index)</strong> | |||
</dt> | |||
<dd> | |||
Remove colour. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">index</span> | |||
colour index between 0 and getNumColours() - 1 | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.ColourGradient:multiplyOpacity"></a> | |||
<strong><span class="proto_prefix">juce.ColourGradient</span>:multiplyOpacity (multiplier)</strong> | |||
</dt> | |||
<dd> | |||
Multiply opacity. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">multiplier</span> | |||
factor to multiply the alpha values by | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.ColourGradient:getNumColours"></a> | |||
<strong><span class="proto_prefix">juce.ColourGradient</span>:getNumColours ()</strong> | |||
</dt> | |||
<dd> | |||
Get number colour. | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
the number of colours | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "juce.ColourGradient:getColour"></a> | |||
<strong><span class="proto_prefix">juce.ColourGradient</span>:getColour (index)</strong> | |||
</dt> | |||
<dd> | |||
Get colour. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">index</span> | |||
colour index between 0 and getNumColours() - 1 | |||
</li> | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<span class="types"><a class="type" href="../classes/juce.Colour.html#">juce.Colour</a></span> | |||
the coulour at the specified index | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "juce.ColourGradient:setColour"></a> | |||
<strong><span class="proto_prefix">juce.ColourGradient</span>:setColour (index, newColour)</strong> | |||
</dt> | |||
<dd> | |||
Get colour. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">index</span> | |||
colour index between 0 and getNumColours() - 1 | |||
</li> | |||
<li><span class="parameter">newColour</span> | |||
<span class="types"><a class="type" href="../classes/juce.Colour.html#">juce.Colour</a></span> | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.ColourGradient:getColourAtPosition"></a> | |||
<strong><span class="proto_prefix">juce.ColourGradient</span>:getColourAtPosition (position)</strong> | |||
</dt> | |||
<dd> | |||
Get interpolated colour | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">position</span> | |||
the position between 0 and 1 | |||
</li> | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<span class="types"><a class="type" href="../classes/juce.Colour.html#">juce.Colour</a></span> | |||
the interpolated colour at the specified position | |||
</ol> | |||
</dd> | |||
</dl> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,249 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Class juce.Component</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Contents</h2> | |||
<ul> | |||
<li><a href="#Methods">Methods</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><strong>juce.Component</strong></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<h1>Class <code>juce.Component</code></h1> | |||
<p>JUCE Component.</p> | |||
<p> Is a pointer to a <a href="http://www.juce.com/api/classComponent.html">JUCE Component</a></p> | |||
<p> As of now, components can't be created by protoplug scripts. This is mainly | |||
for accessing the custom GUI component using <a href="../modules/gui.html#getComponent">gui.getComponent</a>.</p> | |||
<h2><a href="#Methods">Methods</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Component:repaint"><span class="proto_prefix">juce.Component</span>:repaint ()</a></td> | |||
<td class="summary">Request total repaint.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Component:repaint"><span class="proto_prefix">juce.Component</span>:repaint (area)</a></td> | |||
<td class="summary">Request partial repaint.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Component:repaint"><span class="proto_prefix">juce.Component</span>:repaint (x, y, width, height)</a></td> | |||
<td class="summary">Request partial repaint.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Component:createComponentSnapshot"><span class="wrapman"><span class="proto_prefix">juce.Component</span>:createComponentSnapshot<br> (areaToGrab[, clipImageToComponentBounds=true[, scaleFactor=1]])</span></a></td> | |||
<td class="summary">Create component snapshot.</td> | |||
</tr> | |||
</table> | |||
<br/> | |||
<br/> | |||
<h2><a name="Methods"></a>Methods</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.Component:repaint"></a> | |||
<strong><span class="proto_prefix">juce.Component</span>:repaint ()</strong> | |||
</dt> | |||
<dd> | |||
Request total repaint. | |||
Tell the operating system that the component is "dirty" and needs to be redrawn. | |||
The component's paint method will be called asynchronously (<a href="../modules/gui.html#paint">gui.paint</a>) | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Component:repaint"></a> | |||
<strong><span class="proto_prefix">juce.Component</span>:repaint (area)</strong> | |||
</dt> | |||
<dd> | |||
Request partial repaint. | |||
Tell the operating system that a portion of the component is "dirty" and needs to be redrawn. | |||
The component's paint method will be called asynchronously (<a href="../modules/gui.html#paint">gui.paint</a>). The dirty region will be accessible | |||
with Graphics.getClipBounds(). | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">area</span> | |||
<span class="types"><span class="type">juce.Rectangle_int</span></span> | |||
the region needing the be redrawn | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Component:repaint"></a> | |||
<strong><span class="proto_prefix">juce.Component</span>:repaint (x, y, width, height)</strong> | |||
</dt> | |||
<dd> | |||
Request partial repaint. | |||
Tell the operating system that a portion of the component is "dirty" and needs to be redrawn. | |||
The component's paint method will be called asynchronously (<a href="../modules/gui.html#paint">gui.paint</a>). The dirty region will be accessible | |||
with Graphics.getClipBounds(). | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">x</span> | |||
the region needing the be redrawn | |||
</li> | |||
<li><span class="parameter">y</span> | |||
the region needing the be redrawn | |||
</li> | |||
<li><span class="parameter">width</span> | |||
the region needing the be redrawn | |||
</li> | |||
<li><span class="parameter">height</span> | |||
the region needing the be redrawn | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Component:createComponentSnapshot"></a> | |||
<strong><span class="wrapman"><span class="proto_prefix">juce.Component</span>:createComponentSnapshot<br> (areaToGrab[, clipImageToComponentBounds=true[, scaleFactor=1]])</span></strong> | |||
</dt> | |||
<dd> | |||
Create component snapshot. | |||
Paint the component into a virtual buffer and return it as an image. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">areaToGrab</span> | |||
<span class="types"><span class="type">juce.Rectangle_int</span></span> | |||
the region to the be drawn | |||
</li> | |||
<li><span class="parameter">clipImageToComponentBounds</span> | |||
(<em>default</em> true) | |||
</li> | |||
<li><span class="parameter">scaleFactor</span> | |||
(<em>default</em> 1) | |||
</li> | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<span class="types"><a class="type" href="../classes/juce.Image.html#">juce.Image</a></span> | |||
</ol> | |||
</dd> | |||
</dl> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,315 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Class juce.FillType</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Contents</h2> | |||
<ul> | |||
<li><a href="#Constructors">Constructors</a></li> | |||
<li><a href="#Methods">Methods</a></li> | |||
<li><a href="#Predefined_values">Predefined values</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><strong>juce.FillType</strong></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<h1>Class <code>juce.FillType</code></h1> | |||
<p>Fill Type.</p> | |||
<p> Is a pointer to a <a href="http://www.juce.com/api/classFillType.html">JUCE FillType</a>. | |||
Can be used by <a href="../classes/juce.Graphics.html#">juce.Graphics</a> for fill operations.</p> | |||
<h2><a href="#Constructors">Constructors</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.FillType.FillType"><span class="proto_prefix">juce</span>.FillType (Colour)</a></td> | |||
<td class="summary">Constuct from a <a href="../classes/juce.Colour.html#">juce.Colour</a>.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.FillType.FillType"><span class="proto_prefix">juce</span>.FillType (Gradient)</a></td> | |||
<td class="summary">Constuct from a <a href="../classes/juce.ColourGradient.html#">juce.ColourGradient</a>.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Methods">Methods</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.FillType:setOpacity"><span class="proto_prefix">juce.FillType</span>:setOpacity (newOpacity)</a></td> | |||
<td class="summary">Set Overall Opacity.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Predefined_values">Predefined values</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.FillType.black"><span class="proto_prefix">juce.FillType</span>.black</a></td> | |||
<td class="summary"> | |||
</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.FillType.white"><span class="proto_prefix">juce.FillType</span>.white</a></td> | |||
<td class="summary"> | |||
</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.FillType.red"><span class="proto_prefix">juce.FillType</span>.red</a></td> | |||
<td class="summary"> | |||
</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.FillType.green"><span class="proto_prefix">juce.FillType</span>.green</a></td> | |||
<td class="summary"> | |||
</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.FillType.blue"><span class="proto_prefix">juce.FillType</span>.blue</a></td> | |||
<td class="summary"> | |||
</td> | |||
</tr> | |||
</table> | |||
<br/> | |||
<br/> | |||
<h2><a name="Constructors"></a>Constructors</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.FillType.FillType"></a> | |||
<strong><span class="proto_prefix">juce</span>.FillType (Colour)</strong> | |||
</dt> | |||
<dd> | |||
Constuct from a <a href="../classes/juce.Colour.html#">juce.Colour</a>. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">Colour</span> | |||
<span class="types"><a class="type" href="../classes/juce.Colour.html#">juce.Colour</a></span> | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.FillType.FillType"></a> | |||
<strong><span class="proto_prefix">juce</span>.FillType (Gradient)</strong> | |||
</dt> | |||
<dd> | |||
Constuct from a <a href="../classes/juce.ColourGradient.html#">juce.ColourGradient</a>. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">Gradient</span> | |||
<span class="types"><a class="type" href="../classes/juce.ColourGradient.html#">juce.ColourGradient</a></span> | |||
</li> | |||
</ul> | |||
</dd> | |||
</dl> | |||
<h2><a name="Methods"></a>Methods</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.FillType:setOpacity"></a> | |||
<strong><span class="proto_prefix">juce.FillType</span>:setOpacity (newOpacity)</strong> | |||
</dt> | |||
<dd> | |||
Set Overall Opacity. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">newOpacity</span> | |||
</li> | |||
</ul> | |||
</dd> | |||
</dl> | |||
<h2><a name="Predefined_values"></a>Predefined values</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.FillType.black"></a> | |||
<strong><span class="proto_prefix">juce.FillType</span>.black</strong> | |||
</dt> | |||
<dd> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.FillType.white"></a> | |||
<strong><span class="proto_prefix">juce.FillType</span>.white</strong> | |||
</dt> | |||
<dd> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.FillType.red"></a> | |||
<strong><span class="proto_prefix">juce.FillType</span>.red</strong> | |||
</dt> | |||
<dd> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.FillType.green"></a> | |||
<strong><span class="proto_prefix">juce.FillType</span>.green</strong> | |||
</dt> | |||
<dd> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.FillType.blue"></a> | |||
<strong><span class="proto_prefix">juce.FillType</span>.blue</strong> | |||
</dt> | |||
<dd> | |||
</ul> | |||
</dd> | |||
</dl> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,203 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Class juce.Font</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Contents</h2> | |||
<ul> | |||
<li><a href="#Constructors">Constructors</a></li> | |||
<li><a href="#Tables">Tables</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><strong>juce.Font</strong></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<h1>Class <code>juce.Font</code></h1> | |||
<p>Font.</p> | |||
<p> Is a pointer to a <a href="http://www.juce.com/api/classFont.html">JUCE Font</a>. | |||
Can be used by <a href="../classes/juce.Graphics.html#">juce.Graphics</a> for text operations.</p> | |||
<h2><a href="#Constructors">Constructors</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Font.Font"><span class="proto_prefix">juce</span>.Font (typefaceName, fontHeight[, styleFlags=0[, hinted=false]])</a></td> | |||
<td class="summary">Constuctor.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Tables">Tables</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Font.styles"><span class="proto_prefix">juce.Font</span>.styles</a></td> | |||
<td class="summary">Font styles.</td> | |||
</tr> | |||
</table> | |||
<br/> | |||
<br/> | |||
<h2><a name="Constructors"></a>Constructors</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.Font.Font"></a> | |||
<strong><span class="proto_prefix">juce</span>.Font (typefaceName, fontHeight[, styleFlags=0[, hinted=false]])</strong> | |||
</dt> | |||
<dd> | |||
Constuctor. | |||
Caveat : on OSX and Linux, hinting only works for protoplug's | |||
built-in hinted fonts (<code>DejaVu Sans Mono</code> and <code>Source Code Pro</code>). On | |||
Windows it's available for every font. Cross-platform hinting is on the be | |||
todo list. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">typefaceName</span> | |||
<span class="types"><a class="type" href="http://www.lua.org/manual/5.1/manual.html#5.4">string</a></span> | |||
</li> | |||
<li><span class="parameter">fontHeight</span> | |||
<span class="types"><span class="type">number</span></span> | |||
</li> | |||
<li><span class="parameter">styleFlags</span> | |||
any combination of <a href="../classes/juce.Font.html#juce.Font.styles">styles</a> | |||
(<em>default</em> 0) | |||
</li> | |||
<li><span class="parameter">hinted</span> | |||
<span class="types"><span class="type">bool</span></span> | |||
(<em>default</em> false) | |||
</li> | |||
</ul> | |||
</dd> | |||
</dl> | |||
<h2><a name="Tables"></a>Tables</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.Font.styles"></a> | |||
<strong><span class="proto_prefix">juce.Font</span>.styles</strong> | |||
</dt> | |||
<dd> | |||
Font styles. | |||
</ul> | |||
<h3>Fields:</h3> | |||
<ul> | |||
<li><span class="parameter">plain</span> | |||
<code>0</code> | |||
</li> | |||
<li><span class="parameter">bold</span> | |||
<code>1</code> | |||
</li> | |||
<li><span class="parameter">italic</span> | |||
<code>2</code> | |||
</li> | |||
<li><span class="parameter">underlined</span> | |||
<code>4</code> | |||
</li> | |||
</ul> | |||
</dd> | |||
</dl> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,260 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Class juce.Image</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Contents</h2> | |||
<ul> | |||
<li><a href="#Constructors">Constructors</a></li> | |||
<li><a href="#Methods">Methods</a></li> | |||
<li><a href="#Tables">Tables</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><strong>juce.Image</strong></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<h1>Class <code>juce.Image</code></h1> | |||
<p>Image.</p> | |||
<p> Images can be loaded from a file, or created as temporary graphics targets.</p> | |||
<p> Is a pointer to a <a href="http://www.juce.com/api/classImage.html">JUCE Image</a>, | |||
and wraps some <a href="http://www.juce.com/api/classImageFileFormat.html">JUCE ImageFileFormat</a> | |||
functionality.</p> | |||
<h2><a href="#Constructors">Constructors</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Image.Image"><span class="proto_prefix">juce</span>.Image (filename)</a></td> | |||
<td class="summary">Load an image from a file.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Image.Image"><span class="proto_prefix">juce</span>.Image (pixelFormat, imageWidth, imageHeight, clearImage)</a></td> | |||
<td class="summary">Create a temporary in-memory image.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Methods">Methods</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Image:isValid"><span class="proto_prefix">juce.Image</span>:isValid ()</a></td> | |||
<td class="summary">Check Image validity.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Tables">Tables</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Image.PixelFormat"><span class="proto_prefix">juce.Image</span>.PixelFormat</a></td> | |||
<td class="summary">Pixel formats.</td> | |||
</tr> | |||
</table> | |||
<br/> | |||
<br/> | |||
<h2><a name="Constructors"></a>Constructors</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.Image.Image"></a> | |||
<strong><span class="proto_prefix">juce</span>.Image (filename)</strong> | |||
</dt> | |||
<dd> | |||
Load an image from a file. | |||
The path can be absolute or relative to the protoplug directory. | |||
To check if the file was loaded successfully, use <a href="../classes/juce.Image.html#juce.Image:isValid">isValid</a>. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">filename</span> | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Image.Image"></a> | |||
<strong><span class="proto_prefix">juce</span>.Image (pixelFormat, imageWidth, imageHeight, clearImage)</strong> | |||
</dt> | |||
<dd> | |||
Create a temporary in-memory image. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">pixelFormat</span> | |||
<span class="types"><a class="type" href="../classes/juce.Image.html#juce.Image.PixelFormat">juce.Image.PixelFormat</a></span> | |||
</li> | |||
<li><span class="parameter">imageWidth</span> | |||
</li> | |||
<li><span class="parameter">imageHeight</span> | |||
</li> | |||
<li><span class="parameter">clearImage</span> | |||
<span class="types"><span class="type">boolean</span></span> | |||
fill the image with black | |||
</li> | |||
</ul> | |||
</dd> | |||
</dl> | |||
<h2><a name="Methods"></a>Methods</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.Image:isValid"></a> | |||
<strong><span class="proto_prefix">juce.Image</span>:isValid ()</strong> | |||
</dt> | |||
<dd> | |||
Check Image validity. | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<span class="types"><span class="type">boolean</span></span> | |||
whether the image is valid and can be used. | |||
</ol> | |||
</dd> | |||
</dl> | |||
<h2><a name="Tables"></a>Tables</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.Image.PixelFormat"></a> | |||
<strong><span class="proto_prefix">juce.Image</span>.PixelFormat</strong> | |||
</dt> | |||
<dd> | |||
Pixel formats. | |||
</ul> | |||
<h3>Fields:</h3> | |||
<ul> | |||
<li><span class="parameter">UnknownFormat</span> | |||
0 | |||
</li> | |||
<li><span class="parameter">RGB</span> | |||
1 | |||
</li> | |||
<li><span class="parameter">ARGB</span> | |||
2 | |||
</li> | |||
<li><span class="parameter">SingleChannel</span> | |||
3 | |||
</li> | |||
</ul> | |||
</dd> | |||
</dl> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,214 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Class juce.Justification</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Contents</h2> | |||
<ul> | |||
<li><a href="#Tables">Tables</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><strong>juce.Justification</strong></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<h1>Class <code>juce.Justification</code></h1> | |||
<p>Justification.</p> | |||
<p> Is converted to a <a href="http://www.juce.com/api/Justification.html">JUCE Justification</a></p> | |||
<h2><a href="#Tables">Tables</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Justification"><span class="proto_prefix">juce</span>.Justification</a></td> | |||
<td class="summary">Justification Constants.</td> | |||
</tr> | |||
</table> | |||
<br/> | |||
<br/> | |||
<h2><a name="Tables"></a>Tables</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.Justification"></a> | |||
<strong><span class="proto_prefix">juce</span>.Justification</strong> | |||
</dt> | |||
<dd> | |||
Justification Constants. | |||
</ul> | |||
<h3>Fields:</h3> | |||
<ul> | |||
<li><span class="parameter">left</span> | |||
</li> | |||
<li><span class="parameter">right</span> | |||
</li> | |||
<li><span class="parameter">horizontallyCentred</span> | |||
</li> | |||
<li><span class="parameter">top</span> | |||
</li> | |||
<li><span class="parameter">bottom</span> | |||
</li> | |||
<li><span class="parameter">verticallyCentred</span> | |||
</li> | |||
<li><span class="parameter">horizontallyJustified</span> | |||
</li> | |||
<li><span class="parameter">centred</span> | |||
</li> | |||
<li><span class="parameter">centredLeft</span> | |||
</li> | |||
<li><span class="parameter">centredRight</span> | |||
</li> | |||
<li><span class="parameter">centredTop</span> | |||
</li> | |||
<li><span class="parameter">centredBottom</span> | |||
</li> | |||
<li><span class="parameter">topLeft</span> | |||
</li> | |||
<li><span class="parameter">topRight</span> | |||
</li> | |||
<li><span class="parameter">bottomLeft</span> | |||
</li> | |||
<li><span class="parameter">bottomRight</span> | |||
</li> | |||
</ul> | |||
</dd> | |||
</dl> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,180 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Class juce.LagrangeInterpolator</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Contents</h2> | |||
<ul> | |||
<li><a href="#Constructors">Constructors</a></li> | |||
<li><a href="#Methods">Methods</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><strong>juce.LagrangeInterpolator</strong></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<h1>Class <code>juce.LagrangeInterpolator</code></h1> | |||
<p>Lagrange Interpolator.</p> | |||
<p> Is converted to a <a href="http://www.juce.com/api/classLagrangeInterpolator.html">JUCE LagrangeInterpolator</a></p> | |||
<h2><a href="#Constructors">Constructors</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.LagrangeInterpolator.LagrangeInterpolator"><span class="proto_prefix">juce</span>.LagrangeInterpolator ()</a></td> | |||
<td class="summary">Constuctor.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Methods">Methods</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.LagrangeInterpolator:process"><span class="wrapman"><span class="proto_prefix">juce.LagrangeInterpolator</span>:process<br> (speedRatio, inputSamples, outputSamples, numOutputSamplesToProduce)</span></a></td> | |||
<td class="summary">Interpolate.</td> | |||
</tr> | |||
</table> | |||
<br/> | |||
<br/> | |||
<h2><a name="Constructors"></a>Constructors</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.LagrangeInterpolator.LagrangeInterpolator"></a> | |||
<strong><span class="proto_prefix">juce</span>.LagrangeInterpolator ()</strong> | |||
</dt> | |||
<dd> | |||
Constuctor. | |||
</ul> | |||
</dd> | |||
</dl> | |||
<h2><a name="Methods"></a>Methods</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.LagrangeInterpolator:process"></a> | |||
<strong><span class="wrapman"><span class="proto_prefix">juce.LagrangeInterpolator</span>:process<br> (speedRatio, inputSamples, outputSamples, numOutputSamplesToProduce)</span></strong> | |||
</dt> | |||
<dd> | |||
Interpolate. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">speedRatio</span> | |||
number of input samples per output sample (input/output) | |||
</li> | |||
<li><span class="parameter">inputSamples</span> | |||
pointer to a cdata <code>float</code> array | |||
</li> | |||
<li><span class="parameter">outputSamples</span> | |||
pointer to a cdata <code>float</code> array | |||
</li> | |||
<li><span class="parameter">numOutputSamplesToProduce</span> | |||
</li> | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<span class="types"><span class="type">number</span></span> | |||
number of input samples that were processed | |||
</ol> | |||
</dd> | |||
</dl> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,284 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Class juce.Line</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Contents</h2> | |||
<ul> | |||
<li><a href="#Constructors">Constructors</a></li> | |||
<li><a href="#Fields">Fields</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><strong>juce.Line</strong></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<h1>Class <code>juce.Line</code></h1> | |||
<p>Line.</p> | |||
<p> Is converted to a <a href="http://www.juce.com/api/classLine.html">JUCE Line</a></p> | |||
<h2><a href="#Constructors">Constructors</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Line.Line"><span class="proto_prefix">juce</span>.Line (x1, y1, x2, y2)</a></td> | |||
<td class="summary">Constuctor</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Line.Line"><span class="proto_prefix">juce</span>.Line (args)</a></td> | |||
<td class="summary">Constuctor</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Fields">Fields</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Line.x1"><span class="proto_prefix">juce.Line</span>.x1</a></td> | |||
<td class="summary">Point 1 X position</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Line.y1"><span class="proto_prefix">juce.Line</span>.y1</a></td> | |||
<td class="summary">Point 1 Y position</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Line.x2"><span class="proto_prefix">juce.Line</span>.x2</a></td> | |||
<td class="summary">Point 2 X position</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Line.y2"><span class="proto_prefix">juce.Line</span>.y2</a></td> | |||
<td class="summary">Point 2 Y position</td> | |||
</tr> | |||
</table> | |||
<br/> | |||
<br/> | |||
<h2><a name="Constructors"></a>Constructors</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.Line.Line"></a> | |||
<strong><span class="proto_prefix">juce</span>.Line (x1, y1, x2, y2)</strong> | |||
</dt> | |||
<dd> | |||
Constuctor | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">x1</span> | |||
</li> | |||
<li><span class="parameter">y1</span> | |||
</li> | |||
<li><span class="parameter">x2</span> | |||
</li> | |||
<li><span class="parameter">y2</span> | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Line.Line"></a> | |||
<strong><span class="proto_prefix">juce</span>.Line (args)</strong> | |||
</dt> | |||
<dd> | |||
Constuctor | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">args</span> | |||
<ul> | |||
<li><span class="parameter">x1</span> | |||
</li> | |||
<li><span class="parameter">y1</span> | |||
</li> | |||
<li><span class="parameter">x2</span> | |||
</li> | |||
<li><span class="parameter">y2</span> | |||
</li> | |||
</li></ul> | |||
</ul> | |||
</dd> | |||
</dl> | |||
<h2><a name="Fields"></a>Fields</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.Line.x1"></a> | |||
<strong><span class="proto_prefix">juce.Line</span>.x1</strong> | |||
</dt> | |||
<dd> | |||
Point 1 X position | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Line.y1"></a> | |||
<strong><span class="proto_prefix">juce.Line</span>.y1</strong> | |||
</dt> | |||
<dd> | |||
Point 1 Y position | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Line.x2"></a> | |||
<strong><span class="proto_prefix">juce.Line</span>.x2</strong> | |||
</dt> | |||
<dd> | |||
Point 2 X position | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Line.y2"></a> | |||
<strong><span class="proto_prefix">juce.Line</span>.y2</strong> | |||
</dt> | |||
<dd> | |||
Point 2 Y position | |||
</ul> | |||
</dd> | |||
</dl> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,226 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Class juce.Point</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Contents</h2> | |||
<ul> | |||
<li><a href="#Constructors">Constructors</a></li> | |||
<li><a href="#Fields">Fields</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><strong>juce.Point</strong></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<h1>Class <code>juce.Point</code></h1> | |||
<p>Point.</p> | |||
<p> Is converted to a <a href="http://www.juce.com/api/classPoint.html">JUCE Point</a></p> | |||
<h2><a href="#Constructors">Constructors</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Point.Point"><span class="proto_prefix">juce</span>.Point (x, y)</a></td> | |||
<td class="summary">Constuctor</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Point.Point"><span class="proto_prefix">juce</span>.Point (args)</a></td> | |||
<td class="summary">Constuctor</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Fields">Fields</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Point.x"><span class="proto_prefix">juce.Point</span>.x</a></td> | |||
<td class="summary">Point X position</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Point.y"><span class="proto_prefix">juce.Point</span>.y</a></td> | |||
<td class="summary">Point Y position</td> | |||
</tr> | |||
</table> | |||
<br/> | |||
<br/> | |||
<h2><a name="Constructors"></a>Constructors</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.Point.Point"></a> | |||
<strong><span class="proto_prefix">juce</span>.Point (x, y)</strong> | |||
</dt> | |||
<dd> | |||
Constuctor | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">x</span> | |||
</li> | |||
<li><span class="parameter">y</span> | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Point.Point"></a> | |||
<strong><span class="proto_prefix">juce</span>.Point (args)</strong> | |||
</dt> | |||
<dd> | |||
Constuctor | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">args</span> | |||
<ul> | |||
<li><span class="parameter">x</span> | |||
</li> | |||
<li><span class="parameter">y</span> | |||
</li> | |||
</li></ul> | |||
</ul> | |||
</dd> | |||
</dl> | |||
<h2><a name="Fields"></a>Fields</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.Point.x"></a> | |||
<strong><span class="proto_prefix">juce.Point</span>.x</strong> | |||
</dt> | |||
<dd> | |||
Point X position | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Point.y"></a> | |||
<strong><span class="proto_prefix">juce.Point</span>.y</strong> | |||
</dt> | |||
<dd> | |||
Point Y position | |||
</ul> | |||
</dd> | |||
</dl> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,194 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Class juce.RectanglePlacement</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Contents</h2> | |||
<ul> | |||
<li><a href="#Tables">Tables</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><strong>juce.RectanglePlacement</strong></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<h1>Class <code>juce.RectanglePlacement</code></h1> | |||
<p>Rectangle Placement.</p> | |||
<p> Is converted to a <a href="http://www.juce.com/api/RectanglePlacement.html">JUCE RectanglePlacement</a></p> | |||
<h2><a href="#Tables">Tables</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.RectanglePlacement"><span class="proto_prefix">juce</span>.RectanglePlacement</a></td> | |||
<td class="summary">Rectangle Placement Constants.</td> | |||
</tr> | |||
</table> | |||
<br/> | |||
<br/> | |||
<h2><a name="Tables"></a>Tables</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.RectanglePlacement"></a> | |||
<strong><span class="proto_prefix">juce</span>.RectanglePlacement</strong> | |||
</dt> | |||
<dd> | |||
Rectangle Placement Constants. | |||
</ul> | |||
<h3>Fields:</h3> | |||
<ul> | |||
<li><span class="parameter">xLeft</span> | |||
</li> | |||
<li><span class="parameter">xRight</span> | |||
</li> | |||
<li><span class="parameter">xMid</span> | |||
</li> | |||
<li><span class="parameter">yTop</span> | |||
</li> | |||
<li><span class="parameter">yBottom</span> | |||
</li> | |||
<li><span class="parameter">yMid</span> | |||
</li> | |||
<li><span class="parameter">stretchToFit</span> | |||
</li> | |||
<li><span class="parameter">fillDestination</span> | |||
</li> | |||
<li><span class="parameter">onlyReduceInSize</span> | |||
</li> | |||
<li><span class="parameter">onlyIncreaseInSize</span> | |||
</li> | |||
<li><span class="parameter">doNotResize</span> | |||
</li> | |||
<li><span class="parameter">centred</span> | |||
</li> | |||
</ul> | |||
</dd> | |||
</dl> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,386 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Class juce.Rectangle_float</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Contents</h2> | |||
<ul> | |||
<li><a href="#Constructors">Constructors</a></li> | |||
<li><a href="#Methods">Methods</a></li> | |||
<li><a href="#Fields">Fields</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><strong>juce.Rectangle_float</strong></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<h1>Class <code>juce.Rectangle_float</code></h1> | |||
<p>A floating-point (sub-pixel) rectangle.</p> | |||
<p> Is converted to a <a href="http://www.juce.com/api/classRectangle.html">JUCE Rectangle</a></p> | |||
<h2><a href="#Constructors">Constructors</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Rectangle_float.Rectangle_float"><span class="proto_prefix">juce</span>.Rectangle_float (x, y, w, h)</a></td> | |||
<td class="summary">Constuctor with classical arguments.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Rectangle_float.Rectangle_float"><span class="proto_prefix">juce</span>.Rectangle_float (args)</a></td> | |||
<td class="summary">Constuctor with named arguments.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Methods">Methods</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Rectangle_float:toInt"><span class="proto_prefix">juce.Rectangle_float</span>:toInt ()</a></td> | |||
<td class="summary">To int.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Rectangle_float:contains"><span class="proto_prefix">juce.Rectangle_float</span>:contains (point)</a></td> | |||
<td class="summary">Contains.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Rectangle_float:getR"><span class="proto_prefix">juce.Rectangle_float</span>:getR ()</a></td> | |||
<td class="summary">Get right.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Rectangle_float:getB"><span class="proto_prefix">juce.Rectangle_float</span>:getB ()</a></td> | |||
<td class="summary">Get bottom.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Fields">Fields</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Rectangle_float.x"><span class="proto_prefix">juce.Rectangle_float</span>.x</a></td> | |||
<td class="summary">Left position</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Rectangle_float.y"><span class="proto_prefix">juce.Rectangle_float</span>.y</a></td> | |||
<td class="summary">Top position</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Rectangle_float.w"><span class="proto_prefix">juce.Rectangle_float</span>.w</a></td> | |||
<td class="summary">Width</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Rectangle_float.h"><span class="proto_prefix">juce.Rectangle_float</span>.h</a></td> | |||
<td class="summary">Height</td> | |||
</tr> | |||
</table> | |||
<br/> | |||
<br/> | |||
<h2><a name="Constructors"></a>Constructors</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.Rectangle_float.Rectangle_float"></a> | |||
<strong><span class="proto_prefix">juce</span>.Rectangle_float (x, y, w, h)</strong> | |||
</dt> | |||
<dd> | |||
Constuctor with classical arguments. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">x</span> | |||
left position | |||
</li> | |||
<li><span class="parameter">y</span> | |||
top position | |||
</li> | |||
<li><span class="parameter">w</span> | |||
width | |||
</li> | |||
<li><span class="parameter">h</span> | |||
height | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Rectangle_float.Rectangle_float"></a> | |||
<strong><span class="proto_prefix">juce</span>.Rectangle_float (args)</strong> | |||
</dt> | |||
<dd> | |||
Constuctor with named arguments. | |||
Every field is optional. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">args</span> | |||
<ul> | |||
<li><span class="parameter">x</span> | |||
left position | |||
</li> | |||
<li><span class="parameter">y</span> | |||
top position | |||
</li> | |||
<li><span class="parameter">w</span> | |||
width | |||
</li> | |||
<li><span class="parameter">h</span> | |||
height | |||
</li> | |||
</li></ul> | |||
</ul> | |||
</dd> | |||
</dl> | |||
<h2><a name="Methods"></a>Methods</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.Rectangle_float:toInt"></a> | |||
<strong><span class="proto_prefix">juce.Rectangle_float</span>:toInt ()</strong> | |||
</dt> | |||
<dd> | |||
To int. | |||
Convert to a pixel-aligned rectangle | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<span class="types"><span class="type">juce.Rectangle_int</span></span> | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Rectangle_float:contains"></a> | |||
<strong><span class="proto_prefix">juce.Rectangle_float</span>:contains (point)</strong> | |||
</dt> | |||
<dd> | |||
Contains. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">point</span> | |||
<span class="types"><a class="type" href="../classes/juce.Point.html#">juce.Point</a></span> | |||
</li> | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<span class="types"><span class="type">boolean</span></span> | |||
whether the rectangle contains the point | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Rectangle_float:getR"></a> | |||
<strong><span class="proto_prefix">juce.Rectangle_float</span>:getR ()</strong> | |||
</dt> | |||
<dd> | |||
Get right. | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
the rectangle's right position on the X axis | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Rectangle_float:getB"></a> | |||
<strong><span class="proto_prefix">juce.Rectangle_float</span>:getB ()</strong> | |||
</dt> | |||
<dd> | |||
Get bottom. | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
the rectangle's bottom position on the Y axis | |||
</ol> | |||
</dd> | |||
</dl> | |||
<h2><a name="Fields"></a>Fields</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.Rectangle_float.x"></a> | |||
<strong><span class="proto_prefix">juce.Rectangle_float</span>.x</strong> | |||
</dt> | |||
<dd> | |||
Left position | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Rectangle_float.y"></a> | |||
<strong><span class="proto_prefix">juce.Rectangle_float</span>.y</strong> | |||
</dt> | |||
<dd> | |||
Top position | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Rectangle_float.w"></a> | |||
<strong><span class="proto_prefix">juce.Rectangle_float</span>.w</strong> | |||
</dt> | |||
<dd> | |||
Width | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Rectangle_float.h"></a> | |||
<strong><span class="proto_prefix">juce.Rectangle_float</span>.h</strong> | |||
</dt> | |||
<dd> | |||
Height | |||
</ul> | |||
</dd> | |||
</dl> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,386 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Class juce.Rectangle_int</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Contents</h2> | |||
<ul> | |||
<li><a href="#Constructors">Constructors</a></li> | |||
<li><a href="#Methods">Methods</a></li> | |||
<li><a href="#Fields">Fields</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><strong>juce.Rectangle_int</strong></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<h1>Class <code>juce.Rectangle_int</code></h1> | |||
<p>An integer (pixel-aligned) rectangle.</p> | |||
<p> Is converted to a <a href="http://www.juce.com/api/classRectangle.html">JUCE Rectangle</a></p> | |||
<h2><a href="#Constructors">Constructors</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Rectangle_int.Rectangle_int"><span class="proto_prefix">juce</span>.Rectangle_int (x, y, w, h)</a></td> | |||
<td class="summary">Constuctor with classical arguments.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Rectangle_int.Rectangle_int"><span class="proto_prefix">juce</span>.Rectangle_int (args)</a></td> | |||
<td class="summary">Constuctor with named arguments.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Methods">Methods</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Rectangle_int:toFloat"><span class="proto_prefix">juce.Rectangle_int</span>:toFloat ()</a></td> | |||
<td class="summary">To float.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Rectangle_int:contains"><span class="proto_prefix">juce.Rectangle_int</span>:contains (point)</a></td> | |||
<td class="summary">Contains.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Rectangle_int:getR"><span class="proto_prefix">juce.Rectangle_int</span>:getR ()</a></td> | |||
<td class="summary">Get right.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Rectangle_int:getB"><span class="proto_prefix">juce.Rectangle_int</span>:getB ()</a></td> | |||
<td class="summary">Get bottom.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Fields">Fields</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Rectangle_int.x"><span class="proto_prefix">juce.Rectangle_int</span>.x</a></td> | |||
<td class="summary">Left position</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Rectangle_int.y"><span class="proto_prefix">juce.Rectangle_int</span>.y</a></td> | |||
<td class="summary">Top position</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Rectangle_int.w"><span class="proto_prefix">juce.Rectangle_int</span>.w</a></td> | |||
<td class="summary">Width</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#juce.Rectangle_int.h"><span class="proto_prefix">juce.Rectangle_int</span>.h</a></td> | |||
<td class="summary">Height</td> | |||
</tr> | |||
</table> | |||
<br/> | |||
<br/> | |||
<h2><a name="Constructors"></a>Constructors</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.Rectangle_int.Rectangle_int"></a> | |||
<strong><span class="proto_prefix">juce</span>.Rectangle_int (x, y, w, h)</strong> | |||
</dt> | |||
<dd> | |||
Constuctor with classical arguments. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">x</span> | |||
left position | |||
</li> | |||
<li><span class="parameter">y</span> | |||
top position | |||
</li> | |||
<li><span class="parameter">w</span> | |||
width | |||
</li> | |||
<li><span class="parameter">h</span> | |||
height | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Rectangle_int.Rectangle_int"></a> | |||
<strong><span class="proto_prefix">juce</span>.Rectangle_int (args)</strong> | |||
</dt> | |||
<dd> | |||
Constuctor with named arguments. | |||
Every field is optional. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">args</span> | |||
<ul> | |||
<li><span class="parameter">x</span> | |||
left position | |||
</li> | |||
<li><span class="parameter">y</span> | |||
top position | |||
</li> | |||
<li><span class="parameter">w</span> | |||
width | |||
</li> | |||
<li><span class="parameter">h</span> | |||
height | |||
</li> | |||
</li></ul> | |||
</ul> | |||
</dd> | |||
</dl> | |||
<h2><a name="Methods"></a>Methods</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.Rectangle_int:toFloat"></a> | |||
<strong><span class="proto_prefix">juce.Rectangle_int</span>:toFloat ()</strong> | |||
</dt> | |||
<dd> | |||
To float. | |||
Convert to a sub-pixel rectangle | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<span class="types"><span class="type">juce.Rectangle_float</span></span> | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Rectangle_int:contains"></a> | |||
<strong><span class="proto_prefix">juce.Rectangle_int</span>:contains (point)</strong> | |||
</dt> | |||
<dd> | |||
Contains. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">point</span> | |||
<span class="types"><a class="type" href="../classes/juce.Point.html#">juce.Point</a></span> | |||
</li> | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<span class="types"><span class="type">boolean</span></span> | |||
whether the rectangle contains the point | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Rectangle_int:getR"></a> | |||
<strong><span class="proto_prefix">juce.Rectangle_int</span>:getR ()</strong> | |||
</dt> | |||
<dd> | |||
Get right. | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
the rectangle's right position on the X axis | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Rectangle_int:getB"></a> | |||
<strong><span class="proto_prefix">juce.Rectangle_int</span>:getB ()</strong> | |||
</dt> | |||
<dd> | |||
Get bottom. | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
the rectangle's bottom position on the Y axis | |||
</ol> | |||
</dd> | |||
</dl> | |||
<h2><a name="Fields"></a>Fields</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "juce.Rectangle_int.x"></a> | |||
<strong><span class="proto_prefix">juce.Rectangle_int</span>.x</strong> | |||
</dt> | |||
<dd> | |||
Left position | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Rectangle_int.y"></a> | |||
<strong><span class="proto_prefix">juce.Rectangle_int</span>.y</strong> | |||
</dt> | |||
<dd> | |||
Top position | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Rectangle_int.w"></a> | |||
<strong><span class="proto_prefix">juce.Rectangle_int</span>.w</strong> | |||
</dt> | |||
<dd> | |||
Width | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "juce.Rectangle_int.h"></a> | |||
<strong><span class="proto_prefix">juce.Rectangle_int</span>.h</strong> | |||
</dt> | |||
<dd> | |||
Height | |||
</ul> | |||
</dd> | |||
</dl> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,168 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Example classic-filter.lua</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><strong>classic-filter.lua</strong></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<pre> | |||
<span class="comment">--[[ | |||
name: Classic Filter | |||
description: > | |||
Straightforward application of RBJ's cookbook filters. Formulae by | |||
Robert Bristow-Johnson, implementation from Worp by Ico Doornekamp. | |||
author: osar.fr | |||
--]]</span> | |||
<span class="global">require</span> <span class="string">"include/protoplug"</span> | |||
<span class="keyword">local</span> cbFilter = <span class="global">require</span> <span class="string">"include/pac/cookbook filters"</span> | |||
<span class="keyword">local</span> filters = {} | |||
stereoFx.init() | |||
<span class="keyword">function</span> stereoFx.Channel:init() | |||
<span class="comment">-- create per-channel fields (filters) | |||
</span> self.filter = cbFilter | |||
{ | |||
<span class="comment">-- initialize filters with current param values | |||
</span> <span class="global">type</span> = params[<span class="number">1</span>].getValue(); | |||
f = params[<span class="number">2</span>].getValue()/<span class="number">2</span>; | |||
gain = params[<span class="number">3</span>].getValue(); | |||
Q = params[<span class="number">4</span>].getValue(); | |||
} | |||
<span class="global">table</span>.insert(filters, self.filter) | |||
<span class="keyword">end</span> | |||
<span class="keyword">function</span> stereoFx.Channel:processBlock(s, smax) | |||
<span class="keyword">for</span> i = <span class="number">0</span>,smax <span class="keyword">do</span> | |||
s[i] = self.filter.process(s[i]) | |||
<span class="keyword">end</span> | |||
<span class="keyword">end</span> | |||
<span class="keyword">local</span> <span class="keyword">function</span> updateFilters(args) | |||
<span class="keyword">for</span> _, f <span class="keyword">in</span> <span class="global">pairs</span>(filters) <span class="keyword">do</span> | |||
f.update(args) | |||
<span class="keyword">end</span> | |||
<span class="keyword">end</span> | |||
params = plugin.manageParams { | |||
<span class="comment">-- automatable VST/AU parameters | |||
</span> <span class="comment">-- note the new 1.3 way of declaring them | |||
</span> { | |||
name = <span class="string">"Type"</span>; | |||
<span class="global">type</span> = <span class="string">"list"</span>; | |||
values = {<span class="string">"hp"</span>; <span class="string">"lp"</span>; <span class="string">"bp"</span>; <span class="string">"bs"</span>; <span class="string">"ls"</span>; <span class="string">"hs"</span>; <span class="string">"ap"</span>; <span class="string">"eq"</span>}; | |||
default = <span class="string">"hp"</span>; | |||
changed = <span class="keyword">function</span>(val) updateFilters{<span class="global">type</span>=val} <span class="keyword">end</span>; | |||
}; | |||
{ | |||
name = <span class="string">"Frequency"</span>; | |||
min = <span class="number">10</span>; | |||
max = <span class="number">20000</span>; | |||
default = <span class="number">440</span>; | |||
changed = <span class="keyword">function</span>(val) updateFilters{f=val} <span class="keyword">end</span>; | |||
}; | |||
{ | |||
name = <span class="string">"Gain"</span>; | |||
min = -<span class="number">30</span>; | |||
max = <span class="number">30</span>; | |||
default = <span class="number">0</span>; | |||
changed = <span class="keyword">function</span>(val) updateFilters{gain=val} <span class="keyword">end</span>; | |||
}; | |||
{ | |||
name = <span class="string">"Resonance"</span>; | |||
min = <span class="number">0.1</span>; | |||
max = <span class="number">30</span>; | |||
default = <span class="number">1</span>; | |||
changed = <span class="keyword">function</span>(val) updateFilters{Q=val} <span class="keyword">end</span>; | |||
}; | |||
} | |||
<span class="comment">-- Reset the plugin parameters like this : | |||
</span><span class="comment">-- params.resetToDefaults() | |||
</span></pre> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,142 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Example midi-chordify.lua</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><strong>midi-chordify.lua</strong></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<pre> | |||
<span class="comment">--[[ | |||
name: midi chordify | |||
description: MIDI processor VST/AU. Notes go in, chords come out. | |||
author: osar.fr | |||
--]]</span> | |||
<span class="global">require</span> <span class="string">"include/protoplug"</span> | |||
<span class="comment">-- what kind of chord ? | |||
</span><span class="keyword">local</span> chordStructure = {<span class="number">0</span>, <span class="number">3</span>, <span class="number">5</span>, <span class="number">7</span>, <span class="number">11</span>} | |||
<span class="keyword">local</span> blockEvents = {} | |||
<span class="keyword">function</span> plugin.processBlock(samples, smax, midiBuf) | |||
blockEvents = {} | |||
<span class="comment">-- analyse midi buffer and prepare a chord for each note | |||
</span> <span class="keyword">for</span> ev <span class="keyword">in</span> midiBuf:eachEvent() <span class="keyword">do</span> | |||
<span class="keyword">if</span> ev:isNoteOn() <span class="keyword">then</span> | |||
chordOn(ev) | |||
<span class="keyword">elseif</span> ev:isNoteOff() <span class="keyword">then</span> | |||
chordOff(ev) | |||
<span class="keyword">end</span> | |||
<span class="keyword">end</span> | |||
<span class="comment">-- fill midi buffer with prepared notes | |||
</span> midiBuf:clear() | |||
<span class="keyword">if</span> #blockEvents><span class="number">0</span> <span class="keyword">then</span> | |||
<span class="keyword">for</span> _,e <span class="keyword">in</span> <span class="global">ipairs</span>(blockEvents) <span class="keyword">do</span> | |||
midiBuf:addEvent(e) | |||
<span class="keyword">end</span> | |||
<span class="keyword">end</span> | |||
<span class="keyword">end</span> | |||
<span class="keyword">function</span> chordOn(root) | |||
<span class="keyword">for</span> _, offset <span class="keyword">in</span> <span class="global">ipairs</span>(chordStructure) <span class="keyword">do</span> | |||
<span class="keyword">local</span> newEv = midi.Event.noteOn( | |||
root:getChannel(), | |||
root:getNote()+offset, | |||
root:getVel()) | |||
<span class="global">table</span>.insert(blockEvents, newEv) | |||
<span class="keyword">end</span> | |||
<span class="keyword">end</span> | |||
<span class="keyword">function</span> chordOff(root) | |||
<span class="keyword">for</span> _, offset <span class="keyword">in</span> <span class="global">ipairs</span>(chordStructure) <span class="keyword">do</span> | |||
<span class="keyword">local</span> newEv = midi.Event.noteOff( | |||
root:getChannel(), | |||
root:getNote()+offset) | |||
<span class="global">table</span>.insert(blockEvents, newEv) | |||
<span class="keyword">end</span> | |||
<span class="keyword">end</span></pre> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,138 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Example sine-organ.lua</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><strong>sine-organ.lua</strong></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<pre> | |||
<span class="comment">--[[ | |||
name: sine organ | |||
description: A simple organ-like sinewave VST/AU. | |||
author: osar.fr | |||
--]]</span> | |||
<span class="global">require</span> <span class="string">"include/protoplug"</span> | |||
<span class="keyword">local</span> release = <span class="number">10000</span> | |||
<span class="keyword">local</span> decayRate = <span class="number">1</span>/release | |||
polyGen.initTracks(<span class="number">8</span>) | |||
<span class="keyword">function</span> polyGen.VTrack:init() | |||
<span class="comment">-- create per-track fields here | |||
</span> self.phase = <span class="number">0</span> | |||
self.releasePos = release | |||
<span class="keyword">end</span> | |||
<span class="keyword">function</span> polyGen.VTrack:addProcessBlock(samples, smax) | |||
<span class="keyword">local</span> amp = <span class="number">1</span> | |||
<span class="keyword">for</span> i = <span class="number">0</span>,smax <span class="keyword">do</span> | |||
<span class="keyword">if</span> <span class="keyword">not</span> self.noteIsOn <span class="keyword">then</span> | |||
<span class="comment">-- release is finished : idle track | |||
</span> <span class="keyword">if</span> self.releasePos>=release <span class="keyword">then</span> <span class="keyword">break</span> <span class="keyword">end</span> | |||
<span class="comment">-- release is under way | |||
</span> amp = <span class="number">1</span>-self.releasePos*decayRate | |||
self.releasePos = self.releasePos+<span class="number">1</span> | |||
<span class="keyword">end</span> | |||
self.phase = self.phase + (self.noteFreq*<span class="global">math</span>.pi*<span class="number">2</span>) | |||
<span class="comment">-- math.sin is slow but once per sample is no tragedy | |||
</span> <span class="keyword">local</span> trackSample = <span class="global">math</span>.sin(self.phase)*amp*<span class="number">0.3</span> | |||
samples[<span class="number">0</span>][i] = samples[<span class="number">0</span>][i] + trackSample <span class="comment">-- left | |||
</span> samples[<span class="number">1</span>][i] = samples[<span class="number">1</span>][i] + trackSample <span class="comment">-- right | |||
</span> <span class="keyword">end</span> | |||
<span class="keyword">end</span> | |||
<span class="keyword">function</span> polyGen.VTrack:noteOff(note, ev) | |||
self.releasePos = <span class="number">0</span> | |||
<span class="keyword">end</span> | |||
<span class="keyword">function</span> polyGen.VTrack:noteOn(note, vel, ev) | |||
<span class="comment">-- start the sinewave at 0 for a clickless attack | |||
</span> self.phase = <span class="number">0</span> | |||
<span class="keyword">end</span></pre> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,140 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Example sinemouse-demo.lua</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><strong>sinemouse-demo.lua</strong></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<pre> | |||
<span class="comment">--[[ | |||
name: sinemouse demo | |||
description: > | |||
Custom GUI demonstration : Drag your mouse around in the | |||
frame to control the sine wave's amplitude and frequency. | |||
author: osar.fr | |||
--]]</span> | |||
<span class="global">require</span> <span class="string">"include/protoplug"</span> | |||
<span class="keyword">local</span> freq,amp = <span class="number">440</span>, <span class="number">0</span> | |||
<span class="keyword">local</span> delta, phase = <span class="number">0.06</span>, <span class="number">0</span> | |||
<span class="keyword">function</span> plugin.processBlock(samples, smax) | |||
<span class="keyword">for</span> i=<span class="number">0</span>,smax <span class="keyword">do</span> | |||
<span class="keyword">local</span> s = <span class="global">math</span>.sin(phase)*amp | |||
samples[<span class="number">0</span>][i] = s <span class="comment">-- left | |||
</span> samples[<span class="number">1</span>][i] = s <span class="comment">-- right | |||
</span> phase = phase + delta | |||
<span class="keyword">end</span> | |||
<span class="keyword">end</span> | |||
<span class="keyword">local</span> J = juce | |||
<span class="keyword">local</span> frame = J.Rectangle_int(<span class="number">20</span>,<span class="number">20</span>,<span class="number">400</span>,<span class="number">300</span>) | |||
<span class="keyword">local</span> sideways = J.AffineTransform():rotated(<span class="global">math</span>.pi*<span class="number">0.5</span>) | |||
<span class="keyword">function</span> gui.paint(g) | |||
g:fillAll() | |||
g:setColour(J.Colour.green) | |||
g:drawRect(frame) | |||
g:drawText(<span class="string">"Frequency"</span>, <span class="number">20</span>, <span class="number">320</span>, <span class="number">400</span>, <span class="number">20</span>, J.Justification.centred) | |||
g:addTransform(sideways) | |||
g:drawText(<span class="string">"amplitude"</span>, <span class="number">20</span>, -<span class="number">440</span>, <span class="number">300</span>, <span class="number">20</span>, J.Justification.centred) | |||
<span class="keyword">end</span> | |||
<span class="keyword">local</span> <span class="keyword">function</span> mouseHandler(event) | |||
<span class="keyword">if</span> <span class="keyword">not</span> frame:contains(J.Point(event.x,event.y)) <span class="keyword">then</span> | |||
<span class="keyword">return</span> | |||
<span class="keyword">end</span> | |||
freq = event.x + <span class="number">80</span> | |||
amp = (<span class="number">320</span>-event.y)/<span class="number">300</span> | |||
<span class="keyword">local</span> sr = plugin.isSampleRateKnown() <span class="keyword">and</span> plugin.getSampleRate() <span class="keyword">or</span> <span class="number">44100</span> | |||
delta = <span class="number">2</span>*<span class="global">math</span>.pi*freq/sr | |||
<span class="keyword">end</span> | |||
gui.addHandler(<span class="string">"mouseDrag"</span>, mouseHandler) | |||
gui.addHandler(<span class="string">"mouseDown"</span>, mouseHandler)</pre> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,132 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Example soundfile-test.lua</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><strong>soundfile-test.lua</strong></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<pre> | |||
<span class="comment">--[[ | |||
name: soundfile test | |||
description: A simple demo that plays an audio file. | |||
author: osar.fr | |||
--]]</span> | |||
<span class="global">require</span> <span class="string">"include/protoplug"</span> | |||
<span class="keyword">local</span> path = <span class="string">"C:\\temp\\pluck44.wav"</span> | |||
<span class="keyword">local</span> wave, len | |||
<span class="comment">-- 'prepareToPlay' will be triggered when the host sample rate is known, | |||
</span><span class="comment">-- so we can load sound files with automatic sample rate conversion: | |||
</span>plugin.addHandler(<span class="string">'prepareToPlay'</span>, <span class="keyword">function</span>() | |||
<span class="keyword">local</span> readr = juce.AudioFormatReader(path) | |||
<span class="keyword">if</span> readr==<span class="keyword">nil</span> <span class="keyword">then</span> error (<span class="string">"can't open wave: "</span>..path) <span class="keyword">end</span> | |||
wave, len = readr:readToFloat(<span class="number">2</span>) <span class="comment">-- require 2 channels | |||
</span><span class="keyword">end</span>) | |||
polyGen.initTracks(<span class="number">8</span>) | |||
<span class="keyword">function</span> polyGen.VTrack:noteOn(note, vel, ev) | |||
self.playing = <span class="keyword">true</span> | |||
self.wavepos = <span class="number">0</span> | |||
<span class="keyword">end</span> | |||
<span class="keyword">function</span> polyGen.VTrack:noteOff(note, ev) | |||
self.playing = <span class="keyword">false</span> | |||
<span class="keyword">end</span> | |||
<span class="keyword">function</span> polyGen.VTrack:addProcessBlock(samples, smax) | |||
<span class="keyword">for</span> i = <span class="number">0</span>,smax <span class="keyword">do</span> | |||
<span class="keyword">if</span> self.playing <span class="keyword">and</span> self.wavepos < len <span class="keyword">then</span> | |||
self.wavepos = self.wavepos + <span class="number">1</span> | |||
samples[<span class="number">0</span>][i] = samples[<span class="number">0</span>][i] + wave[<span class="number">0</span>][self.wavepos] <span class="comment">-- left | |||
</span> samples[<span class="number">1</span>][i] = samples[<span class="number">1</span>][i] + wave[<span class="number">1</span>][self.wavepos] <span class="comment">-- right | |||
</span> <span class="keyword">end</span> | |||
<span class="keyword">end</span> | |||
<span class="keyword">end</span></pre> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,212 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>Protoplug Lua API Reference</title> | |||
<link rel="stylesheet" href="ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="modules/plugin.html">plugin</a></li> | |||
<li><a href="modules/script.html">script</a></li> | |||
<li><a href="modules/midi.html">midi</a></li> | |||
<li><a href="modules/gui.html">gui</a></li> | |||
<li><a href="modules/polyGen.html">polyGen</a></li> | |||
<li><a href="modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<h2>Protoplug Lua API Reference</h2> | |||
<h2>Modules</h2> | |||
<table class="module_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="modules/plugin.html">plugin</a></td> | |||
<td class="summary">Use <a href="modules/plugin.html#">plugin</a> to define the AU/VST audio plugin's behaviour.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="modules/script.html">script</a></td> | |||
<td class="summary">Use <a href="modules/script.html#">script</a> to handle script events, libraries and files.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="modules/midi.html">midi</a></td> | |||
<td class="summary"><a href="modules/midi.html#">midi</a> contains MIDI-related classes and functions.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="modules/gui.html">gui</a></td> | |||
<td class="summary">Use <a href="modules/gui.html#">gui</a> to define your script's custom graphical user interface.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="modules/polyGen.html">polyGen</a></td> | |||
<td class="summary">Use this module to create a polyphonic generator with virtual tracks.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="modules/stereoFx.html">stereoFx</a></td> | |||
<td class="summary">Use this module to create a stereo effect.</td> | |||
</tr> | |||
</table> | |||
<h2>Classes</h2> | |||
<table class="module_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="classes/juce.AffineTransform.html">juce.AffineTransform</a></td> | |||
<td class="summary">A geometric transformation.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></td> | |||
<td class="summary">Class to read audio files.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="classes/juce.Colour.html">juce.Colour</a></td> | |||
<td class="summary">A simple colour class.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="classes/juce.ColourGradient.html">juce.ColourGradient</a></td> | |||
<td class="summary">Colour Gradient.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="classes/juce.Component.html">juce.Component</a></td> | |||
<td class="summary">JUCE Component.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="classes/juce.FillType.html">juce.FillType</a></td> | |||
<td class="summary">Fill Type.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="classes/juce.Font.html">juce.Font</a></td> | |||
<td class="summary">Font.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="classes/juce.Graphics.html">juce.Graphics</a></td> | |||
<td class="summary">Graphics drawing target.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="classes/juce.Image.html">juce.Image</a></td> | |||
<td class="summary">Image.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="classes/juce.Justification.html">juce.Justification</a></td> | |||
<td class="summary">Justification.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></td> | |||
<td class="summary">Lagrange Interpolator.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="classes/juce.Line.html">juce.Line</a></td> | |||
<td class="summary">Line.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="classes/juce.Path.html">juce.Path</a></td> | |||
<td class="summary">Path.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="classes/juce.Point.html">juce.Point</a></td> | |||
<td class="summary">Point.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></td> | |||
<td class="summary">Rectangle Placement.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="classes/juce.Rectangle_float.html">juce.Rectangle_float</a></td> | |||
<td class="summary">A floating-point (sub-pixel) rectangle.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="classes/juce.Rectangle_int.html">juce.Rectangle_int</a></td> | |||
<td class="summary">An integer (pixel-aligned) rectangle.</td> | |||
</tr> | |||
</table> | |||
<h2>Examples</h2> | |||
<table class="module_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="examples/classic-filter.lua.html">classic-filter.lua</a></td> | |||
<td class="summary"></td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="examples/sine-organ.lua.html">sine-organ.lua</a></td> | |||
<td class="summary"></td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="examples/midi-chordify.lua.html">midi-chordify.lua</a></td> | |||
<td class="summary"></td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></td> | |||
<td class="summary"></td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="examples/soundfile-test.lua.html">soundfile-test.lua</a></td> | |||
<td class="summary"></td> | |||
</tr> | |||
</table> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,333 @@ | |||
/* BEGIN RESET | |||
Copyright (c) 2010, Yahoo! Inc. All rights reserved. | |||
Code licensed under the BSD License: | |||
http://developer.yahoo.com/yui/license.html | |||
version: 2.8.2r1 | |||
*/ | |||
html { | |||
color: #000; | |||
background: #FFF; | |||
} | |||
body { | |||
text-align: center; | |||
} | |||
body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,button,textarea,p,blockquote,th,td { | |||
margin: 0; | |||
padding: 0; | |||
} | |||
table { | |||
border-collapse: collapse; | |||
border-spacing: 0; | |||
} | |||
fieldset,img { | |||
border: 0; | |||
} | |||
address,caption,cite,code,dfn,em,strong,th,var,optgroup { | |||
font-style: inherit; | |||
font-weight: inherit; | |||
} | |||
del,ins { | |||
text-decoration: none; | |||
} | |||
li { | |||
list-style: bullet; | |||
margin-left: 20px; | |||
} | |||
caption,th { | |||
text-align: left; | |||
} | |||
h1,h2,h3,h4,h5,h6 { | |||
font-size: 100%; | |||
font-weight: bold; | |||
} | |||
q:before,q:after { | |||
content: ''; | |||
} | |||
abbr,acronym { | |||
border: 0; | |||
font-variant: normal; | |||
} | |||
sup { | |||
vertical-align: baseline; | |||
} | |||
sub { | |||
vertical-align: baseline; | |||
} | |||
legend { | |||
color: #000; | |||
} | |||
input,button,textarea,select,optgroup,option { | |||
font-family: inherit; | |||
font-size: inherit; | |||
font-style: inherit; | |||
font-weight: inherit; | |||
} | |||
input,button,textarea,select {*font-size:100%; | |||
} | |||
/* END RESET */ | |||
body { | |||
margin-left: 1em; | |||
margin-right: 1em; | |||
font-family: arial, helvetica, geneva, sans-serif; | |||
background-color: #ffffff; margin: 0px; | |||
} | |||
code, tt { font-family: monospace; } | |||
span.parameter { font-family:monospace; } | |||
span.parameter:after { content:":"; } | |||
span.types:before { content:"("; } | |||
span.types:after { content:")"; } | |||
.type { font-weight: bold; font-style:italic } | |||
body, p, td, th { font-size: .95em; line-height: 1.2em;} | |||
p, ul { margin: 10px 0 0 0px;} | |||
strong { font-weight: bold;} | |||
em { font-style: italic;} | |||
h1 { | |||
font-size: 1.5em; | |||
margin: 10px 0 20px 0; | |||
} | |||
h2, h3, h4 { margin: 15px 0 10px 0; } | |||
h2 { | |||
border-bottom: 2px solid #ccc; | |||
font-size: 1.25em; | |||
margin: 19px 0 12px; | |||
} | |||
h3 { font-size: 1.15em; } | |||
h4 { font-size: 1.06em; } | |||
a:link { font-weight: bold; color: #004080; text-decoration: none; } | |||
a:visited { font-weight: bold; color: #006699; text-decoration: none; } | |||
a:link:hover { text-decoration: underline; } | |||
hr { | |||
color:#cccccc; | |||
background: #00007f; | |||
height: 1px; | |||
} | |||
blockquote { margin-left: 3em; } | |||
ul { list-style-type: disc; } | |||
p.name { | |||
font-family: Consolas, monaco, monospace; | |||
padding-top: 1em; | |||
} | |||
pre.example { | |||
background-color: rgb(245, 245, 245); | |||
border: 1px solid silver; | |||
padding: 10px; | |||
margin: 10px 0 10px 0; | |||
font-family: Consolas, monaco, monospace; | |||
font-size: .85em; | |||
} | |||
pre { | |||
background-color: rgb(245,245,255); | |||
border: 1px solid #cccccc; | |||
padding: 10px; | |||
margin: 10px 0 10px 0; | |||
overflow: auto; | |||
font-family: Consolas, monaco, monospace; | |||
-moz-tab-size: 4; | |||
-o-tab-size: 4; | |||
tab-size: 4; | |||
font-size: 14px; | |||
} | |||
table.index { border: 1px #00007f; } | |||
table.index td { text-align: left; vertical-align: top; } | |||
#container { | |||
/*margin-left: 1em; | |||
margin-right: 1em; | |||
background-color: #f4f4ff;*/ | |||
display: inline-block; | |||
margin: 0 auto; | |||
text-align: left; | |||
} | |||
#product { | |||
text-align: center; | |||
border-bottom: 1px solid #cccccc; | |||
background-color: #ffffff; | |||
} | |||
#product big { | |||
font-size: 2em; | |||
} | |||
#main { | |||
background-color:#FFFFFF; | |||
/*border-left: 2px solid #cccccc;*/ | |||
} | |||
#navigation { | |||
float: left; | |||
width: 14em; | |||
vertical-align: top; | |||
background-color:#FFFFFF; | |||
overflow: visible; | |||
} | |||
#navigation h2 { | |||
background-color:#FFFFFF; | |||
font-size:1.1em; | |||
color:#000000; | |||
text-align: left; | |||
padding:0.2em; | |||
/*border-top:1px solid #dddddd;*/ | |||
border-bottom:1px solid #dddddd; | |||
} | |||
#navigation ul | |||
{ | |||
font-size:1em; | |||
list-style-type: none; | |||
margin: 1px 1px 10px 1px; | |||
} | |||
#navigation li { | |||
text-indent: -1em; | |||
display: block; | |||
margin: 3px 0px 0px 22px; | |||
word-wrap: break-word; | |||
} | |||
#navigation li li a { | |||
margin: 0px 3px 0px -1em; | |||
} | |||
#content { | |||
margin-left: 14em; | |||
padding: 1em; | |||
width: 700px; | |||
border-left: 2px solid #cccccc; | |||
/*border-right: 2px solid #cccccc;*/ | |||
background-color: #ffffff; | |||
} | |||
#about { | |||
clear: both; | |||
padding: 5px; | |||
border-top: 2px solid #cccccc; | |||
background-color: #ffffff; | |||
} | |||
@media print { | |||
body { | |||
font: 12pt "Times New Roman", "TimeNR", Times, serif; | |||
} | |||
a { font-weight: bold; color: #004080; text-decoration: underline; } | |||
#main { | |||
background-color: #ffffff; | |||
border-left: 0px; | |||
} | |||
#container { | |||
margin-left: 2%; | |||
margin-right: 2%; | |||
background-color: #ffffff; | |||
} | |||
#content { | |||
padding: 1em; | |||
background-color: #ffffff; | |||
} | |||
#navigation { | |||
display: none; | |||
} | |||
pre.example { | |||
font-family: Consolas, monaco, monospace; | |||
font-size: 10pt; | |||
page-break-inside: avoid; | |||
} | |||
} | |||
table.module_list { | |||
border-width: 1px; | |||
border-style: solid; | |||
border-color: #cccccc; | |||
border-collapse: collapse; | |||
} | |||
table.module_list td { | |||
border-width: 1px; | |||
padding: 3px; | |||
border-style: solid; | |||
border-color: #cccccc; | |||
} | |||
table.module_list td.name { background-color: #f4f4ff; ; min-width: 200px; } | |||
table.module_list td.summary { width: 100%; } | |||
table.function_list { | |||
border-width: 1px; | |||
border-style: solid; | |||
border-color: #cccccc; | |||
border-collapse: collapse; | |||
} | |||
table.function_list td { | |||
border-width: 1px; | |||
padding: 3px; | |||
border-style: solid; | |||
border-color: #cccccc; | |||
} | |||
table.function_list td.name { background-color: #f6f6ff; ; min-width: 200px; padding: 7px 5px; } | |||
table.function_list td.summary { width: 100%; } | |||
dl.table dt, dl.function dt { | |||
background-color: #f4f4ff; | |||
border-bottom: 1px solid #ccc; | |||
border-left: 1px solid #ccc; | |||
border-top: 1px solid #ccc; | |||
padding: 0.7em 0 0.5em 1em; | |||
} | |||
dl.table dd, dl.function dd {padding-bottom: 1em; margin: 10px 0 0 20px;} | |||
dl.table h3, dl.function h3 {font-size: .95em;} | |||
ul.nowrap { | |||
overflow:auto; | |||
whitespace:nowrap; | |||
} | |||
/* stop sublists from having initial vertical space */ | |||
ul ul { margin-top: 0px; } | |||
ol ul { margin-top: 0px; } | |||
ol ol { margin-top: 0px; } | |||
ul ol { margin-top: 0px; } | |||
/* styles for prettification of source */ | |||
pre .comment { color: #558817; } | |||
pre .constant { color: #a8660d; } | |||
pre .escape { color: #844631; } | |||
pre .keyword { color: #2239a8; font-weight: bold; } | |||
pre .library { color: #0e7c6b; } | |||
pre .marker { color: #512b1e; background: #fedc56; font-weight: bold; } | |||
pre .string { color: #a8660d; } | |||
pre .number { color: #f8660d; } | |||
pre .operator { color: #2239a8; font-weight: bold; } | |||
pre .preprocessor, pre .prepro { color: #a33243; } | |||
pre .global { color: #800080; } | |||
pre .prompt { color: #558817; } | |||
pre .url { color: #272fc2; text-decoration: underline; } | |||
.wrapman { display: inline-block; white-space: normal; min-width: 460px; } | |||
.proto_subtitle {color: #888; position: relative; top: -12px;} | |||
.function_list .proto_prefix {color: #789;} | |||
.osarlogo { | |||
display: block; | |||
width: 132px; | |||
height: 121px; | |||
background: url("osar-121.png") no-repeat scroll 0 0 transparent; | |||
margin: 0 auto; | |||
} |
@@ -0,0 +1,677 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Module gui</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Contents</h2> | |||
<ul> | |||
<li><a href="#Functions">Functions</a></li> | |||
<li><a href="#Tables">Tables</a></li> | |||
<li><a href="#Class_gui_MouseEvent">Class gui.MouseEvent </a></li> | |||
<li><a href="#Class_gui_MouseWheelDetails">Class gui.MouseWheelDetails </a></li> | |||
<li><a href="#Class_gui_KeyPress">Class gui.KeyPress </a></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><strong>gui</strong></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<h1>Module <code>gui</code></h1> | |||
<p>Use <a href="../modules/gui.html#">gui</a> to define your script's custom graphical user interface.</p> | |||
<p> | |||
<p> Custom GUI example : <a href="../examples/sinemouse-demo.lua.html#">sinemouse-demo.lua</a></p> | |||
<p> The <a href="../modules/gui.html#">gui</a> global is available to every protoplug script after including the | |||
main protoplug header :</p> | |||
<pre><code>require "include/protoplug" | |||
</code></pre> | |||
</p> | |||
<h2><a href="#Functions">Functions</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#addHandler"><span class="proto_prefix">gui</span>.addHandler (event, handler)</a></td> | |||
<td class="summary">Add a handler for a GUI event.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#paint"><span class="proto_prefix">gui</span>.paint (g)</a></td> | |||
<td class="summary">Override to paint a custom GUI.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#getComponent"><span class="proto_prefix">gui</span>.getComponent ()</a></td> | |||
<td class="summary">Get GUI Component.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Tables">Tables</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#FocusCause"><span class="proto_prefix">gui</span>.FocusCause</a></td> | |||
<td class="summary">Focus change causes.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#ModifierKeys"><span class="proto_prefix">gui</span>.ModifierKeys</a></td> | |||
<td class="summary">Keyboard and mouse modifiers.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Class_gui_MouseEvent">Class gui.MouseEvent </a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#MouseEvent.x"><span class="proto_prefix">gui.MouseEvent</span>.x</a></td> | |||
<td class="summary">X.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#MouseEvent.y"><span class="proto_prefix">gui.MouseEvent</span>.y</a></td> | |||
<td class="summary">Y.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#MouseEvent.mods"><span class="proto_prefix">gui.MouseEvent</span>.mods</a></td> | |||
<td class="summary">Modifier keys.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#MouseEvent.eventComponent"><span class="proto_prefix">gui.MouseEvent</span>.eventComponent</a></td> | |||
<td class="summary">Event component.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#MouseEvent.originalComponent"><span class="proto_prefix">gui.MouseEvent</span>.originalComponent</a></td> | |||
<td class="summary">Original component.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#MouseEvent.eventTime"><span class="proto_prefix">gui.MouseEvent</span>.eventTime</a></td> | |||
<td class="summary">Time.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#MouseEvent.mouseDownTime"><span class="proto_prefix">gui.MouseEvent</span>.mouseDownTime</a></td> | |||
<td class="summary">Mouse down time.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#MouseEvent.mouseDownPos"><span class="proto_prefix">gui.MouseEvent</span>.mouseDownPos</a></td> | |||
<td class="summary">Mouse down position.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#MouseEvent.numberOfClicks"><span class="proto_prefix">gui.MouseEvent</span>.numberOfClicks</a></td> | |||
<td class="summary">Number of clicks.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#MouseEvent.wasMovedSinceMouseDown"><span class="proto_prefix">gui.MouseEvent</span>.wasMovedSinceMouseDown</a></td> | |||
<td class="summary">Was moved since mouse down.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Class_gui_MouseWheelDetails">Class gui.MouseWheelDetails </a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#MouseWheelDetails.deltaX"><span class="proto_prefix">gui.MouseWheelDetails</span>.deltaX</a></td> | |||
<td class="summary">X delta.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#MouseWheelDetails.deltaY"><span class="proto_prefix">gui.MouseWheelDetails</span>.deltaY</a></td> | |||
<td class="summary">Y delta.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#MouseWheelDetails.isReversed"><span class="proto_prefix">gui.MouseWheelDetails</span>.isReversed</a></td> | |||
<td class="summary">Is reversed.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#MouseWheelDetails.isSmooth"><span class="proto_prefix">gui.MouseWheelDetails</span>.isSmooth</a></td> | |||
<td class="summary">Is smooth.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Class_gui_KeyPress">Class gui.KeyPress </a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#KeyPress.keyCode"><span class="proto_prefix">gui.KeyPress</span>.keyCode</a></td> | |||
<td class="summary">Key code.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#KeyPress.mods"><span class="proto_prefix">gui.KeyPress</span>.mods</a></td> | |||
<td class="summary">Modifier Keys.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#KeyPress.textCharacter"><span class="proto_prefix">gui.KeyPress</span>.textCharacter</a></td> | |||
<td class="summary">Text character.</td> | |||
</tr> | |||
</table> | |||
<br/> | |||
<br/> | |||
<h2><a name="Functions"></a>Functions</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "addHandler"></a> | |||
<strong><span class="proto_prefix">gui</span>.addHandler (event, handler)</strong> | |||
</dt> | |||
<dd> | |||
Add a handler for a GUI event. </p> | |||
<p>Here's a list of the events and their parameters, showing how they | |||
should be received :</p> | |||
<pre><code>gui.addHandler("resized", function() ... end) | |||
gui.addHandler("focusGained", function(focusCause) ... end) | |||
gui.addHandler("focusLost", function(focusCause) ... end) | |||
gui.addHandler("modifierKeysChanged", function(modifierKeys) ... end) | |||
gui.addHandler("mouseMove", function(mouseEvent) ... end) | |||
gui.addHandler("mouseEnter", function(mouseEvent) ... end) | |||
gui.addHandler("mouseExit", function(mouseEvent) ... end) | |||
gui.addHandler("mouseDown", function(mouseEvent) ... end) | |||
gui.addHandler("mouseDrag", function(mouseEvent) ... end) | |||
gui.addHandler("mouseUp", function(mouseEvent) ... end) | |||
gui.addHandler("mouseDoubleClick", function(mouseEvent) ... end) | |||
gui.addHandler("mouseWheelMove", function(mouseEvent, mouseWheelDetails) ... end) | |||
gui.addHandler("keyPressed", function(keyPress, srcComponent) ... end) | |||
gui.addHandler("keyStateChanged", function(keyPress, srcComponent) ... end) | |||
</code></pre> | |||
<p>Parameters received by the event handlers are of | |||
type <a href="../modules/gui.html#FocusCause">FocusCause</a>, <a href="../modules/gui.html#ModifierKeys">ModifierKeys</a>, <a href="../modules/gui.html#gui.MouseEvent">MouseEvent</a>, <a href="../modules/gui.html#gui.MouseWheelDetails">MouseWheelDetails</a>, | |||
and <a href="../modules/gui.html#gui.KeyPress">KeyPress</a>. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">event</span> | |||
<span class="types"><a class="type" href="http://www.lua.org/manual/5.1/manual.html#5.4">string</a></span> | |||
the event to handle | |||
</li> | |||
<li><span class="parameter">handler</span> | |||
<span class="types"><span class="type">function</span></span> | |||
a function to add the event's handlers | |||
</li> | |||
</ul> | |||
<h3>See also:</h3> | |||
<ul> | |||
<li><a href="../modules/script.html#addHandler">script.addHandler</a></li> | |||
<li><a href="../modules/plugin.html#addHandler">plugin.addHandler</a></li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "paint"></a> | |||
<strong><span class="proto_prefix">gui</span>.paint (g)</strong> | |||
</dt> | |||
<dd> | |||
Override to paint a custom GUI. | |||
Define this function to paint something in the custom GUI space. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">g</span> | |||
<span class="types"><a class="type" href="../classes/juce.Graphics.html#">juce.Graphics</a></span> | |||
a JUCE graphics target | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "getComponent"></a> | |||
<strong><span class="proto_prefix">gui</span>.getComponent ()</strong> | |||
</dt> | |||
<dd> | |||
Get GUI Component. | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
the current GUI component, or <code>nil</code> if the GUI | |||
has not been opened yet. | |||
</ol> | |||
</dd> | |||
</dl> | |||
<h2><a name="Tables"></a>Tables</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "FocusCause"></a> | |||
<strong><span class="proto_prefix">gui</span>.FocusCause</strong> | |||
</dt> | |||
<dd> | |||
Focus change causes. | |||
Values received by the <code>focusGained</code> and <code>focusLost</code> handlers. | |||
</ul> | |||
<h3>Fields:</h3> | |||
<ul> | |||
<li><span class="parameter">focusChangedByMouseClick</span> | |||
0 | |||
</li> | |||
<li><span class="parameter">focusChangedByTabKey</span> | |||
1 | |||
</li> | |||
<li><span class="parameter">focusChangedDirectly</span> | |||
2 | |||
</li> | |||
</ul> | |||
<h3>See also:</h3> | |||
<ul> | |||
<a href="../modules/gui.html#addHandler">gui.addHandler</a> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "ModifierKeys"></a> | |||
<strong><span class="proto_prefix">gui</span>.ModifierKeys</strong> | |||
</dt> | |||
<dd> | |||
Keyboard and mouse modifiers. | |||
Contained in every <a href="../modules/gui.html#gui.MouseEvent">gui.MouseEvent</a> and received by the | |||
<code>modifierKeysChanged</code> handler. | |||
</ul> | |||
<h3>Fields:</h3> | |||
<ul> | |||
<li><span class="parameter">noModifiers</span> | |||
0 | |||
</li> | |||
<li><span class="parameter">shiftModifier</span> | |||
1 | |||
</li> | |||
<li><span class="parameter">ctrlModifier</span> | |||
2 | |||
</li> | |||
<li><span class="parameter">altModifier</span> | |||
4 | |||
</li> | |||
<li><span class="parameter">leftButtonModifier</span> | |||
16 | |||
</li> | |||
<li><span class="parameter">rightButtonModifier</span> | |||
32 | |||
</li> | |||
<li><span class="parameter">middleButtonModifier</span> | |||
64 | |||
</li> | |||
<li><span class="parameter">commandModifier</span> | |||
8 | |||
</li> | |||
<li><span class="parameter">ctrlAltCommandModifiers</span> | |||
14 | |||
</li> | |||
</ul> | |||
</dd> | |||
</dl> | |||
<h2><a name="Class_gui_MouseEvent"></a>Class gui.MouseEvent </h2> | |||
A mouse event as received by GUI handlers (see <a href="../modules/gui.html#addHandler">gui.addHandler</a>) | |||
<br><br> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "MouseEvent.x"></a> | |||
<strong><span class="proto_prefix">gui.MouseEvent</span>.x</strong> | |||
</dt> | |||
<dd> | |||
X. | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "MouseEvent.y"></a> | |||
<strong><span class="proto_prefix">gui.MouseEvent</span>.y</strong> | |||
</dt> | |||
<dd> | |||
Y. | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "MouseEvent.mods"></a> | |||
<strong><span class="proto_prefix">gui.MouseEvent</span>.mods</strong> | |||
</dt> | |||
<dd> | |||
Modifier keys. | |||
Values defined in <a href="../modules/gui.html#ModifierKeys">gui.ModifierKeys</a> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "MouseEvent.eventComponent"></a> | |||
<strong><span class="proto_prefix">gui.MouseEvent</span>.eventComponent</strong> | |||
</dt> | |||
<dd> | |||
Event component. | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "MouseEvent.originalComponent"></a> | |||
<strong><span class="proto_prefix">gui.MouseEvent</span>.originalComponent</strong> | |||
</dt> | |||
<dd> | |||
Original component. | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "MouseEvent.eventTime"></a> | |||
<strong><span class="proto_prefix">gui.MouseEvent</span>.eventTime</strong> | |||
</dt> | |||
<dd> | |||
Time. | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "MouseEvent.mouseDownTime"></a> | |||
<strong><span class="proto_prefix">gui.MouseEvent</span>.mouseDownTime</strong> | |||
</dt> | |||
<dd> | |||
Mouse down time. | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "MouseEvent.mouseDownPos"></a> | |||
<strong><span class="proto_prefix">gui.MouseEvent</span>.mouseDownPos</strong> | |||
</dt> | |||
<dd> | |||
Mouse down position. | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "MouseEvent.numberOfClicks"></a> | |||
<strong><span class="proto_prefix">gui.MouseEvent</span>.numberOfClicks</strong> | |||
</dt> | |||
<dd> | |||
Number of clicks. | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "MouseEvent.wasMovedSinceMouseDown"></a> | |||
<strong><span class="proto_prefix">gui.MouseEvent</span>.wasMovedSinceMouseDown</strong> | |||
</dt> | |||
<dd> | |||
Was moved since mouse down. | |||
</ul> | |||
</dd> | |||
</dl> | |||
<h2><a name="Class_gui_MouseWheelDetails"></a>Class gui.MouseWheelDetails </h2> | |||
As received by the <code>mouseWheelMove</code> handler (see <a href="../modules/gui.html#addHandler">gui.addHandler</a>) | |||
<br><br> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "MouseWheelDetails.deltaX"></a> | |||
<strong><span class="proto_prefix">gui.MouseWheelDetails</span>.deltaX</strong> | |||
</dt> | |||
<dd> | |||
X delta. | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "MouseWheelDetails.deltaY"></a> | |||
<strong><span class="proto_prefix">gui.MouseWheelDetails</span>.deltaY</strong> | |||
</dt> | |||
<dd> | |||
Y delta. | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "MouseWheelDetails.isReversed"></a> | |||
<strong><span class="proto_prefix">gui.MouseWheelDetails</span>.isReversed</strong> | |||
</dt> | |||
<dd> | |||
Is reversed. | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "MouseWheelDetails.isSmooth"></a> | |||
<strong><span class="proto_prefix">gui.MouseWheelDetails</span>.isSmooth</strong> | |||
</dt> | |||
<dd> | |||
Is smooth. | |||
</ul> | |||
</dd> | |||
</dl> | |||
<h2><a name="Class_gui_KeyPress"></a>Class gui.KeyPress </h2> | |||
As received by the <code>keyPressed</code> and <code>keyStateChanged</code> handlers (see <a href="../modules/gui.html#addHandler">gui.addHandler</a>) | |||
<br><br> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "KeyPress.keyCode"></a> | |||
<strong><span class="proto_prefix">gui.KeyPress</span>.keyCode</strong> | |||
</dt> | |||
<dd> | |||
Key code. | |||
(undecipherable for now) | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "KeyPress.mods"></a> | |||
<strong><span class="proto_prefix">gui.KeyPress</span>.mods</strong> | |||
</dt> | |||
<dd> | |||
Modifier Keys. | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "KeyPress.textCharacter"></a> | |||
<strong><span class="proto_prefix">gui.KeyPress</span>.textCharacter</strong> | |||
</dt> | |||
<dd> | |||
Text character. | |||
</ul> | |||
</dd> | |||
</dl> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,865 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Module midi</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Contents</h2> | |||
<ul> | |||
<li><a href="#Functions">Functions</a></li> | |||
<li><a href="#Class_midi_Buffer">Class midi.Buffer </a></li> | |||
<li><a href="#Class_midi_Event">Class midi.Event </a></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><strong>midi</strong></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<h1>Module <code>midi</code></h1> | |||
<p><a href="../modules/midi.html#">midi</a> contains MIDI-related classes and functions.</p> | |||
<p> | |||
<p> Example of receiving MIDI input : <a href="../examples/sine-organ.lua.html#">sine-organ.lua</a>.</p> | |||
<p> Example of producing MIDI output : <a href="../examples/midi-chordify.lua.html#">midi-chordify.lua</a>.</p> | |||
<p> The <a href="../modules/midi.html#">midi</a> global is available to every protoplug script after including the | |||
main protoplug header :</p> | |||
<pre><code>require "include/protoplug" | |||
</code></pre> | |||
</p> | |||
<h2><a href="#Functions">Functions</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#noteToFreq"><span class="proto_prefix">midi</span>.noteToFreq (note)</a></td> | |||
<td class="summary">Convert a MIDI note number to frequency.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Class_midi_Buffer">Class midi.Buffer </a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#Buffer:eachEvent"><span class="proto_prefix">midi.Buffer</span>:eachEvent ()</a></td> | |||
<td class="summary">Iterate over each <a href="../modules/midi.html#midi.Event">midi.Event</a> in the buffer.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#Buffer:clear"><span class="proto_prefix">midi.Buffer</span>:clear ()</a></td> | |||
<td class="summary">Remove all MIDI events from the buffer.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#Buffer:addEvent"><span class="proto_prefix">midi.Buffer</span>:addEvent (event)</a></td> | |||
<td class="summary">Add a MIDI event.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Class_midi_Event">Class midi.Event </a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#midi.Event:Event"><span class="proto_prefix">midi</span>.Event (other)</a></td> | |||
<td class="summary">Constructor : copy another event.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#midi.Event:Event"><span class="proto_prefix">midi</span>.Event (time, dataSize[, data])</a></td> | |||
<td class="summary">Constructor : create a custom event.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#Event.noteOn"><span class="proto_prefix">midi.Event</span>.noteOn (channel, note, vel[, pos=0])</a></td> | |||
<td class="summary">Constructor : note on.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#Event.noteOff"><span class="proto_prefix">midi.Event</span>.noteOff (channel, note[, vel=0[, pos=0]])</a></td> | |||
<td class="summary">Constructor : note off.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#Event.pitchBend"><span class="proto_prefix">midi.Event</span>.pitchBend (channel, pitch[, pos=0])</a></td> | |||
<td class="summary">Constructor : pitch bend.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#Event.control"><span class="proto_prefix">midi.Event</span>.control (channel, number, value[, pos=0])</a></td> | |||
<td class="summary">Constructor : Control change.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#Event:getChannel"><span class="proto_prefix">midi.Event</span>:getChannel ()</a></td> | |||
<td class="summary">Get channel.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#Event:setChannel"><span class="proto_prefix">midi.Event</span>:setChannel (channel)</a></td> | |||
<td class="summary">Set channel.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#Event:isNoteOn"><span class="proto_prefix">midi.Event</span>:isNoteOn ()</a></td> | |||
<td class="summary">Is a note on event.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#Event:isNoteOff"><span class="proto_prefix">midi.Event</span>:isNoteOff ()</a></td> | |||
<td class="summary">Is a note off event.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#Event:getNote"><span class="proto_prefix">midi.Event</span>:getNote ()</a></td> | |||
<td class="summary">Get note.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#Event:setNote"><span class="proto_prefix">midi.Event</span>:setNote (note)</a></td> | |||
<td class="summary">Set note.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#Event:getVel"><span class="proto_prefix">midi.Event</span>:getVel ()</a></td> | |||
<td class="summary">Get velocity.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#Event:setVel"><span class="proto_prefix">midi.Event</span>:setVel (vel)</a></td> | |||
<td class="summary">Set velocity.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#Event:isPitchBend"><span class="proto_prefix">midi.Event</span>:isPitchBend ()</a></td> | |||
<td class="summary">Is a pitch bend event.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#Event:getPitchBendValue"><span class="proto_prefix">midi.Event</span>:getPitchBendValue ()</a></td> | |||
<td class="summary">Get pitch bend value.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#Event:isControl"><span class="proto_prefix">midi.Event</span>:isControl ()</a></td> | |||
<td class="summary">Is a Control Change event.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#Event:getControlNumber"><span class="proto_prefix">midi.Event</span>:getControlNumber ()</a></td> | |||
<td class="summary">Get control number.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#Event:getControlValue"><span class="proto_prefix">midi.Event</span>:getControlValue ()</a></td> | |||
<td class="summary">Get control value.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#Event.time"><span class="proto_prefix">midi.Event</span>.time</a></td> | |||
<td class="summary">Sample position relatively to the start of the block.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#Event.dataSize"><span class="proto_prefix">midi.Event</span>.dataSize</a></td> | |||
<td class="summary">Size of the MIDI message in bytes</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#Event.data"><span class="proto_prefix">midi.Event</span>.data</a></td> | |||
<td class="summary">The raw MIDI message | |||
(<code>const uint8_t*</code> cdata)</td> | |||
</tr> | |||
</table> | |||
<br/> | |||
<br/> | |||
<h2><a name="Functions"></a>Functions</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "noteToFreq"></a> | |||
<strong><span class="proto_prefix">midi</span>.noteToFreq (note)</strong> | |||
</dt> | |||
<dd> | |||
Convert a MIDI note number to frequency. | |||
Call this function to get a note's frequency. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">note</span> | |||
the MIDI note (0-127) | |||
</li> | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
the frequency in samples^-1 | |||
</ol> | |||
</dd> | |||
</dl> | |||
<h2><a name="Class_midi_Buffer"></a>Class midi.Buffer </h2> | |||
A buffer containing midi events, as received by <a href="../modules/plugin.html#processBlock">plugin.processBlock</a> | |||
<br><br> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "Buffer:eachEvent"></a> | |||
<strong><span class="proto_prefix">midi.Buffer</span>:eachEvent ()</strong> | |||
</dt> | |||
<dd> | |||
Iterate over each <a href="../modules/midi.html#midi.Event">midi.Event</a> in the buffer. | |||
</ul> | |||
<h3>Usage:</h3> | |||
<ul> | |||
<pre class="example"><span class="keyword">for</span> ev <span class="keyword">in</span> myBuffer:eachEvent() <span class="keyword">do</span> <span class="global">print</span>(ev:getNote()) <span class="keyword">end</span></pre> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "Buffer:clear"></a> | |||
<strong><span class="proto_prefix">midi.Buffer</span>:clear ()</strong> | |||
</dt> | |||
<dd> | |||
Remove all MIDI events from the buffer. | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "Buffer:addEvent"></a> | |||
<strong><span class="proto_prefix">midi.Buffer</span>:addEvent (event)</strong> | |||
</dt> | |||
<dd> | |||
Add a MIDI event. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">event</span> | |||
<span class="types"><a class="type" href="../modules/midi.html#midi.Event">midi.Event</a></span> | |||
</li> | |||
</ul> | |||
</dd> | |||
</dl> | |||
<h2><a name="Class_midi_Event"></a>Class midi.Event </h2> | |||
A single midi event as returned by <a href="../modules/midi.html#Buffer:eachEvent">Buffer:eachEvent</a> | |||
<br><br> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "midi.Event:Event"></a> | |||
<strong><span class="proto_prefix">midi</span>.Event (other)</strong> | |||
</dt> | |||
<dd> | |||
Constructor : copy another event. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">other</span> | |||
<span class="types"><a class="type" href="../modules/midi.html#midi.Event">midi.Event</a></span> | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "midi.Event:Event"></a> | |||
<strong><span class="proto_prefix">midi</span>.Event (time, dataSize[, data])</strong> | |||
</dt> | |||
<dd> | |||
Constructor : create a custom event. | |||
Create an event from given bytes (or zeros if not supplied) | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">time</span> | |||
</li> | |||
<li><span class="parameter">dataSize</span> | |||
</li> | |||
<li><span class="parameter">data</span> | |||
</li> | |||
</ul> | |||
<h3>Usage:</h3> | |||
<ul> | |||
<pre class="example">myEv = midi.Event(<span class="number">0</span>, <span class="number">3</span>, {<span class="number">0x90</span>, <span class="number">0x30</span>, <span class="number">0x7f</span>}) -- note on</pre> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "Event.noteOn"></a> | |||
<strong><span class="proto_prefix">midi.Event</span>.noteOn (channel, note, vel[, pos=0])</strong> | |||
</dt> | |||
<dd> | |||
Constructor : note on. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">channel</span> | |||
(1-16) | |||
</li> | |||
<li><span class="parameter">note</span> | |||
(0-127) | |||
</li> | |||
<li><span class="parameter">vel</span> | |||
(1-127) | |||
</li> | |||
<li><span class="parameter">pos</span> | |||
sample offset | |||
(<em>default</em> 0) | |||
</li> | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<span class="types"><a class="type" href="../modules/midi.html#midi.Event">midi.Event</a></span> | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "Event.noteOff"></a> | |||
<strong><span class="proto_prefix">midi.Event</span>.noteOff (channel, note[, vel=0[, pos=0]])</strong> | |||
</dt> | |||
<dd> | |||
Constructor : note off. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">channel</span> | |||
(1-16) | |||
</li> | |||
<li><span class="parameter">note</span> | |||
(0-127) | |||
</li> | |||
<li><span class="parameter">vel</span> | |||
(0-127) | |||
(<em>default</em> 0) | |||
</li> | |||
<li><span class="parameter">pos</span> | |||
sample offset | |||
(<em>default</em> 0) | |||
</li> | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<span class="types"><a class="type" href="../modules/midi.html#midi.Event">midi.Event</a></span> | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "Event.pitchBend"></a> | |||
<strong><span class="proto_prefix">midi.Event</span>.pitchBend (channel, pitch[, pos=0])</strong> | |||
</dt> | |||
<dd> | |||
Constructor : pitch bend. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">channel</span> | |||
(1-16) | |||
</li> | |||
<li><span class="parameter">pitch</span> | |||
bend value (0-16383) | |||
</li> | |||
<li><span class="parameter">pos</span> | |||
sample offset | |||
(<em>default</em> 0) | |||
</li> | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<span class="types"><a class="type" href="../modules/midi.html#midi.Event">midi.Event</a></span> | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "Event.control"></a> | |||
<strong><span class="proto_prefix">midi.Event</span>.control (channel, number, value[, pos=0])</strong> | |||
</dt> | |||
<dd> | |||
Constructor : Control change. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">channel</span> | |||
(1-16) | |||
</li> | |||
<li><span class="parameter">number</span> | |||
control number (0-247) | |||
</li> | |||
<li><span class="parameter">value</span> | |||
control value (0-127) | |||
</li> | |||
<li><span class="parameter">pos</span> | |||
sample offset | |||
(<em>default</em> 0) | |||
</li> | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<span class="types"><a class="type" href="../modules/midi.html#midi.Event">midi.Event</a></span> | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "Event:getChannel"></a> | |||
<strong><span class="proto_prefix">midi.Event</span>:getChannel ()</strong> | |||
</dt> | |||
<dd> | |||
Get channel. | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
the MIDI channel (1-16) | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "Event:setChannel"></a> | |||
<strong><span class="proto_prefix">midi.Event</span>:setChannel (channel)</strong> | |||
</dt> | |||
<dd> | |||
Set channel. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">channel</span> | |||
the MIDI channel (1-16) | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "Event:isNoteOn"></a> | |||
<strong><span class="proto_prefix">midi.Event</span>:isNoteOn ()</strong> | |||
</dt> | |||
<dd> | |||
Is a note on event. | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<span class="types"><span class="type">boolean</span></span> | |||
whether event is a note on. | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "Event:isNoteOff"></a> | |||
<strong><span class="proto_prefix">midi.Event</span>:isNoteOff ()</strong> | |||
</dt> | |||
<dd> | |||
Is a note off event. | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<span class="types"><span class="type">boolean</span></span> | |||
whether event is a note off. | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "Event:getNote"></a> | |||
<strong><span class="proto_prefix">midi.Event</span>:getNote ()</strong> | |||
</dt> | |||
<dd> | |||
Get note. | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
the MIDI note number (0-127) | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "Event:setNote"></a> | |||
<strong><span class="proto_prefix">midi.Event</span>:setNote (note)</strong> | |||
</dt> | |||
<dd> | |||
Set note. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">note</span> | |||
the MIDI note number (0-127) | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "Event:getVel"></a> | |||
<strong><span class="proto_prefix">midi.Event</span>:getVel ()</strong> | |||
</dt> | |||
<dd> | |||
Get velocity. | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
the MIDI velocity (1-127) | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "Event:setVel"></a> | |||
<strong><span class="proto_prefix">midi.Event</span>:setVel (vel)</strong> | |||
</dt> | |||
<dd> | |||
Set velocity. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">vel</span> | |||
the MIDI velocity (1-127) | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "Event:isPitchBend"></a> | |||
<strong><span class="proto_prefix">midi.Event</span>:isPitchBend ()</strong> | |||
</dt> | |||
<dd> | |||
Is a pitch bend event. | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<span class="types"><span class="type">boolean</span></span> | |||
whether event is a pitch bend on. | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "Event:getPitchBendValue"></a> | |||
<strong><span class="proto_prefix">midi.Event</span>:getPitchBendValue ()</strong> | |||
</dt> | |||
<dd> | |||
Get pitch bend value. | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
pitch bend value (0-16383). | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "Event:isControl"></a> | |||
<strong><span class="proto_prefix">midi.Event</span>:isControl ()</strong> | |||
</dt> | |||
<dd> | |||
Is a Control Change event. | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<span class="types"><span class="type">boolean</span></span> | |||
whether event is a control change. | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "Event:getControlNumber"></a> | |||
<strong><span class="proto_prefix">midi.Event</span>:getControlNumber ()</strong> | |||
</dt> | |||
<dd> | |||
Get control number. | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
control number (0-247). | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "Event:getControlValue"></a> | |||
<strong><span class="proto_prefix">midi.Event</span>:getControlValue ()</strong> | |||
</dt> | |||
<dd> | |||
Get control value. | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
control value (0-127). | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "Event.time"></a> | |||
<strong><span class="proto_prefix">midi.Event</span>.time</strong> | |||
</dt> | |||
<dd> | |||
Sample position relatively to the start of the block. | |||
This value is often 0 because most hosts call <a href="../modules/plugin.html#processBlock">plugin.processBlock</a> at the | |||
beginning of beats and beat divisions. It is never higher than the | |||
current <a href="../modules/plugin.html#processBlock">plugin.processBlock</a>'s <code>smax</code> and any events created by the script | |||
should respect this rule. | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "Event.dataSize"></a> | |||
<strong><span class="proto_prefix">midi.Event</span>.dataSize</strong> | |||
</dt> | |||
<dd> | |||
Size of the MIDI message in bytes | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "Event.data"></a> | |||
<strong><span class="proto_prefix">midi.Event</span>.data</strong> | |||
</dt> | |||
<dd> | |||
The raw MIDI message | |||
(<code>const uint8_t*</code> cdata) | |||
</ul> | |||
</dd> | |||
</dl> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,792 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Module plugin</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Contents</h2> | |||
<ul> | |||
<li><a href="#Callback_functions">Callback functions </a></li> | |||
<li><a href="#Override_functions">Override functions </a></li> | |||
<li><a href="#Class_plugin_PositionInfo">Class plugin.PositionInfo </a></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><strong>plugin</strong></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<h1>Module <code>plugin</code></h1> | |||
<p>Use <a href="../modules/plugin.html#">plugin</a> to define the AU/VST audio plugin's behaviour.</p> | |||
<p> | |||
<p> The <a href="../modules/plugin.html#">plugin</a> global is available to every protoplug script after including the | |||
main protoplug header :</p> | |||
<pre><code>require "include/protoplug" | |||
</code></pre> | |||
</p> | |||
<h2><a href="#Callback_functions">Callback functions </a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#manageParams"><span class="proto_prefix">plugin</span>.manageParams (paramList)</a></td> | |||
<td class="summary">Automatically set up a list of parameters.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#setParameter"><span class="proto_prefix">plugin</span>.setParameter (index, value)</a></td> | |||
<td class="summary">Set (automate) a parameter's value.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#getParameter"><span class="proto_prefix">plugin</span>.getParameter (index)</a></td> | |||
<td class="summary">Get a parameter's value.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#getCurrentPosition"><span class="proto_prefix">plugin</span>.getCurrentPosition ()</a></td> | |||
<td class="summary">Get host position info, if available.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#getSampleRate"><span class="proto_prefix">plugin</span>.getSampleRate ()</a></td> | |||
<td class="summary">Get host samplerate.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#isSampleRateKnown"><span class="proto_prefix">plugin</span>.isSampleRateKnown ()</a></td> | |||
<td class="summary">Check if the samplerate is known.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#addHandler"><span class="proto_prefix">plugin</span>.addHandler (event, handler)</a></td> | |||
<td class="summary">Add a handler for a VST/AU event.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Override_functions">Override functions </a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#processBlock"><span class="proto_prefix">plugin</span>.processBlock (samples, smax, midiBuf)</a></td> | |||
<td class="summary">Process Audio Block.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#getParameterName"><span class="proto_prefix">plugin</span>.getParameterName (index)</a></td> | |||
<td class="summary">Return the name of a parameter.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#getParameterText"><span class="proto_prefix">plugin</span>.getParameterText (index)</a></td> | |||
<td class="summary">Return the representation of a parameter's value.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#paramChanged"><span class="proto_prefix">plugin</span>.paramChanged (index)</a></td> | |||
<td class="summary">Handle parameter changes.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#getTailLengthSeconds"><span class="proto_prefix">plugin</span>.getTailLengthSeconds ()</a></td> | |||
<td class="summary">Return the tail length in seconds (effects only).</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Class_plugin_PositionInfo">Class plugin.PositionInfo </a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#PositionInfo.bpm"><span class="proto_prefix">plugin.PositionInfo</span>.bpm</a></td> | |||
<td class="summary">Host tempo (beats per minute)</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#PositionInfo.timeSigNumerator"><span class="proto_prefix">plugin.PositionInfo</span>.timeSigNumerator</a></td> | |||
<td class="summary">Time signature numerator ie.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#PositionInfo.timeSigDenominator"><span class="proto_prefix">plugin.PositionInfo</span>.timeSigDenominator</a></td> | |||
<td class="summary">Time signature denominator ie.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#PositionInfo.timeInSamples"><span class="proto_prefix">plugin.PositionInfo</span>.timeInSamples</a></td> | |||
<td class="summary">Current position on the host's timeline (samples)</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#PositionInfo.timeInSeconds"><span class="proto_prefix">plugin.PositionInfo</span>.timeInSeconds</a></td> | |||
<td class="summary">Current position on the host's timeline (seconds)</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#PositionInfo.editOriginTime"><span class="proto_prefix">plugin.PositionInfo</span>.editOriginTime</a></td> | |||
<td class="summary">Position of the start of the edit region on the host's timeline</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#PositionInfo.ppqPosition"><span class="proto_prefix">plugin.PositionInfo</span>.ppqPosition</a></td> | |||
<td class="summary">Current position on the host's timeline (pulses-per-quarter-note)</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#PositionInfo.ppqPositionOfLastBarStart"><span class="proto_prefix">plugin.PositionInfo</span>.ppqPositionOfLastBarStart</a></td> | |||
<td class="summary">Position of the last bar start (pulses-per-quarter-note).</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#PositionInfo.frameRate"><span class="proto_prefix">plugin.PositionInfo</span>.frameRate</a></td> | |||
<td class="summary">Video frame rate</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#PositionInfo.isPlaying"><span class="proto_prefix">plugin.PositionInfo</span>.isPlaying</a></td> | |||
<td class="summary">Is playing</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#PositionInfo.isRecording"><span class="proto_prefix">plugin.PositionInfo</span>.isRecording</a></td> | |||
<td class="summary">Is recording</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#PositionInfo.ppqLoopStart"><span class="proto_prefix">plugin.PositionInfo</span>.ppqLoopStart</a></td> | |||
<td class="summary">Position of the loop start (pulses-per-quarter-note).</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#PositionInfo.ppqLoopEnd"><span class="proto_prefix">plugin.PositionInfo</span>.ppqLoopEnd</a></td> | |||
<td class="summary">Position of the loop end (pulses-per-quarter-note).</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#PositionInfo.isLooping"><span class="proto_prefix">plugin.PositionInfo</span>.isLooping</a></td> | |||
<td class="summary">Is looping</td> | |||
</tr> | |||
</table> | |||
<br/> | |||
<br/> | |||
<h2><a name="Callback_functions"></a>Callback functions </h2> | |||
Functions that your script can call. | |||
<br><br> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "manageParams"></a> | |||
<strong><span class="proto_prefix">plugin</span>.manageParams (paramList)</strong> | |||
</dt> | |||
<dd> | |||
Automatically set up a list of parameters. | |||
Call this function with a table containing parameter definitions as argument, and | |||
it will perform the repetitive task of defining all the parameter-related overrides.</p> | |||
<p> The format of the parameter list is demonstrated in <a href="../examples/classic-filter.lua.html#">classic-filter.lua</a> | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">paramList</span> | |||
a table with parameter definitions (see example) | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "setParameter"></a> | |||
<strong><span class="proto_prefix">plugin</span>.setParameter (index, value)</strong> | |||
</dt> | |||
<dd> | |||
Set (automate) a parameter's value. | |||
The value must be normalized to be between 0 and 1. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">index</span> | |||
parameter index (0-126) | |||
</li> | |||
<li><span class="parameter">value</span> | |||
parameter value (0-1) | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "getParameter"></a> | |||
<strong><span class="proto_prefix">plugin</span>.getParameter (index)</strong> | |||
</dt> | |||
<dd> | |||
Get a parameter's value. | |||
The values are between 0 and 1, but different minimums and maximums can | |||
be easily simulated using <a href="../modules/plugin.html#manageParams">plugin.manageParams</a>. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">index</span> | |||
parameter index (0-126) | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "getCurrentPosition"></a> | |||
<strong><span class="proto_prefix">plugin</span>.getCurrentPosition ()</strong> | |||
</dt> | |||
<dd> | |||
Get host position info, if available. | |||
Only call this from within <a href="../modules/plugin.html#processBlock">processBlock</a>. | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<span class="types"><a class="type" href="../modules/plugin.html#plugin.PositionInfo">plugin.PositionInfo</a></span> | |||
current position info, or <code>nil</code> depending on the host. | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "getSampleRate"></a> | |||
<strong><span class="proto_prefix">plugin</span>.getSampleRate ()</strong> | |||
</dt> | |||
<dd> | |||
Get host samplerate. | |||
The value is unknown until the plugin <code>prepareToPlay</code> event has been emitted. | |||
The value is always known in <a href="../modules/plugin.html#processBlock">processBlock</a>. An error is caused if an | |||
attempt is made to access the sample rate prematurely. | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
current samplerate. | |||
</ol> | |||
<h3>See also:</h3> | |||
<ul> | |||
<a href="../modules/plugin.html#addHandler">plugin.addHandler</a> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "isSampleRateKnown"></a> | |||
<strong><span class="proto_prefix">plugin</span>.isSampleRateKnown ()</strong> | |||
</dt> | |||
<dd> | |||
Check if the samplerate is known. | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<span class="types"><span class="type">boolean</span></span> | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "addHandler"></a> | |||
<strong><span class="proto_prefix">plugin</span>.addHandler (event, handler)</strong> | |||
</dt> | |||
<dd> | |||
<p>Add a handler for a VST/AU event. | |||
The following events are available :</p> | |||
<ul> | |||
<li><code>"prepareToPlay"</code> - Emitted before the first call to <a href="../modules/plugin.html#processBlock">processBlock</a>, when the samplerate is known.</li> | |||
</ul> | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">event</span> | |||
<span class="types"><a class="type" href="http://www.lua.org/manual/5.1/manual.html#5.4">string</a></span> | |||
the event to handle | |||
</li> | |||
<li><span class="parameter">handler</span> | |||
<span class="types"><span class="type">function</span></span> | |||
a function to add the event's handlers | |||
</li> | |||
</ul> | |||
<h3>See also:</h3> | |||
<ul> | |||
<li><a href="../modules/script.html#addHandler">script.addHandler</a></li> | |||
<li><a href="../modules/gui.html#addHandler">gui.addHandler</a></li> | |||
</ul> | |||
</dd> | |||
</dl> | |||
<h2><a name="Override_functions"></a>Override functions </h2> | |||
Define these functions and the host will call them. | |||
<br><br> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "processBlock"></a> | |||
<strong><span class="proto_prefix">plugin</span>.processBlock (samples, smax, midiBuf)</strong> | |||
</dt> | |||
<dd> | |||
Process Audio Block. | |||
Override this function to input and output audio and MIDI data.</p> | |||
<p> This override is handled automatically if <a href="../modules/stereoFx.html#">stereoFx</a> or <a href="../modules/polyGen.html#">polyGen</a> are used. | |||
Use this function to handle the raw data instead. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">samples</span> | |||
a C float** pointing to two channels of samples, serving as input and output | |||
</li> | |||
<li><span class="parameter">smax</span> | |||
the maximum sample index (nSamples - 1) | |||
</li> | |||
<li><span class="parameter">midiBuf</span> | |||
<span class="types"><a class="type" href="../modules/midi.html#midi.Buffer">midi.Buffer</a></span> | |||
the MIDI data for this block, serving as input and output | |||
</li> | |||
</ul> | |||
<h3>Usage:</h3> | |||
<ul> | |||
<pre class="example"> <span class="keyword">function</span> plugin.processBlock (samples, smax) <span class="comment">-- let's ignore midi for this example | |||
</span> <span class="keyword">for</span> i = <span class="number">0</span>, smax <span class="keyword">do</span> | |||
samples[<span class="number">0</span>][i] = sin(myTime) <span class="comment">-- left channel | |||
</span> samples[<span class="number">1</span>][i] = sin(myTime) <span class="comment">-- right channel | |||
</span> myTime = myTime + myDelta | |||
<span class="keyword">end</span> | |||
<span class="keyword">end</span></pre> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "getParameterName"></a> | |||
<strong><span class="proto_prefix">plugin</span>.getParameterName (index)</strong> | |||
</dt> | |||
<dd> | |||
Return the name of a parameter. </p> | |||
<p> This override is handled automatically if <a href="../modules/plugin.html#manageParams">manageParams</a> is used. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">index</span> | |||
parameter index (0-126) | |||
</li> | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<span class="types"><a class="type" href="http://www.lua.org/manual/5.1/manual.html#5.4">string</a></span> | |||
the parameter's name | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "getParameterText"></a> | |||
<strong><span class="proto_prefix">plugin</span>.getParameterText (index)</strong> | |||
</dt> | |||
<dd> | |||
Return the representation of a parameter's value. | |||
Override this function to choose how each parameter's value should | |||
be displayed by the host. The parameter's current value can be obtained | |||
using <a href="../modules/plugin.html#getParameter">plugin.getParameter</a></p> | |||
<p> This override is handled automatically if <a href="../modules/plugin.html#manageParams">manageParams</a> is used. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">index</span> | |||
parameter index (0-126) | |||
</li> | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<span class="types"><a class="type" href="http://www.lua.org/manual/5.1/manual.html#5.4">string</a></span> | |||
a string representation of the parameter's current value | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "paramChanged"></a> | |||
<strong><span class="proto_prefix">plugin</span>.paramChanged (index)</strong> | |||
</dt> | |||
<dd> | |||
Handle parameter changes. | |||
Override this function to do something when a parameter changes | |||
The parameter's current value can be obtained using <a href="../modules/plugin.html#getParameter">plugin.getParameter</a></p> | |||
<p> This override is handled automatically if <a href="../modules/plugin.html#manageParams">manageParams</a> is used. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">index</span> | |||
parameter index (0-126) | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "getTailLengthSeconds"></a> | |||
<strong><span class="proto_prefix">plugin</span>.getTailLengthSeconds ()</strong> | |||
</dt> | |||
<dd> | |||
Return the tail length in seconds (effects only). | |||
Override this function to define the effect's audio tail length. | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
the tail length in seconds | |||
</ol> | |||
</dd> | |||
</dl> | |||
<h2><a name="Class_plugin_PositionInfo"></a>Class plugin.PositionInfo </h2> | |||
A container type for host-related information as returned by <a href="../modules/plugin.html#getCurrentPosition">plugin.getCurrentPosition</a></p> | |||
<p> Is a <a href="http://www.juce.com/api/structAudioPlayHead_1_1CurrentPositionInfo.html">JUCE AudioPlayHead::CurrentPositionInfo</a> | |||
<br><br> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "PositionInfo.bpm"></a> | |||
<strong><span class="proto_prefix">plugin.PositionInfo</span>.bpm</strong> | |||
</dt> | |||
<dd> | |||
Host tempo (beats per minute) | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "PositionInfo.timeSigNumerator"></a> | |||
<strong><span class="proto_prefix">plugin.PositionInfo</span>.timeSigNumerator</strong> | |||
</dt> | |||
<dd> | |||
Time signature numerator ie. <em>3</em>/4 | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "PositionInfo.timeSigDenominator"></a> | |||
<strong><span class="proto_prefix">plugin.PositionInfo</span>.timeSigDenominator</strong> | |||
</dt> | |||
<dd> | |||
Time signature denominator ie. 3/<em>4</em> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "PositionInfo.timeInSamples"></a> | |||
<strong><span class="proto_prefix">plugin.PositionInfo</span>.timeInSamples</strong> | |||
</dt> | |||
<dd> | |||
Current position on the host's timeline (samples) | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "PositionInfo.timeInSeconds"></a> | |||
<strong><span class="proto_prefix">plugin.PositionInfo</span>.timeInSeconds</strong> | |||
</dt> | |||
<dd> | |||
Current position on the host's timeline (seconds) | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "PositionInfo.editOriginTime"></a> | |||
<strong><span class="proto_prefix">plugin.PositionInfo</span>.editOriginTime</strong> | |||
</dt> | |||
<dd> | |||
Position of the start of the edit region on the host's timeline | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "PositionInfo.ppqPosition"></a> | |||
<strong><span class="proto_prefix">plugin.PositionInfo</span>.ppqPosition</strong> | |||
</dt> | |||
<dd> | |||
Current position on the host's timeline (pulses-per-quarter-note) | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "PositionInfo.ppqPositionOfLastBarStart"></a> | |||
<strong><span class="proto_prefix">plugin.PositionInfo</span>.ppqPositionOfLastBarStart</strong> | |||
</dt> | |||
<dd> | |||
Position of the last bar start (pulses-per-quarter-note). | |||
(or zero if unavailable.) | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "PositionInfo.frameRate"></a> | |||
<strong><span class="proto_prefix">plugin.PositionInfo</span>.frameRate</strong> | |||
</dt> | |||
<dd> | |||
Video frame rate | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "PositionInfo.isPlaying"></a> | |||
<strong><span class="proto_prefix">plugin.PositionInfo</span>.isPlaying</strong> | |||
</dt> | |||
<dd> | |||
Is playing | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "PositionInfo.isRecording"></a> | |||
<strong><span class="proto_prefix">plugin.PositionInfo</span>.isRecording</strong> | |||
</dt> | |||
<dd> | |||
Is recording | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "PositionInfo.ppqLoopStart"></a> | |||
<strong><span class="proto_prefix">plugin.PositionInfo</span>.ppqLoopStart</strong> | |||
</dt> | |||
<dd> | |||
Position of the loop start (pulses-per-quarter-note). | |||
(or zero if unavailable.) | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "PositionInfo.ppqLoopEnd"></a> | |||
<strong><span class="proto_prefix">plugin.PositionInfo</span>.ppqLoopEnd</strong> | |||
</dt> | |||
<dd> | |||
Position of the loop end (pulses-per-quarter-note). | |||
(or zero if unavailable.) | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "PositionInfo.isLooping"></a> | |||
<strong><span class="proto_prefix">plugin.PositionInfo</span>.isLooping</strong> | |||
</dt> | |||
<dd> | |||
Is looping | |||
</ul> | |||
</dd> | |||
</dl> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,378 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Module polyGen</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Contents</h2> | |||
<ul> | |||
<li><a href="#Functions">Functions</a></li> | |||
<li><a href="#Class_polyGen_VTrack">Class polyGen.VTrack </a></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><strong>polyGen</strong></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<h1>Module <code>polyGen</code></h1> | |||
<p>Use this module to create a polyphonic generator with virtual tracks.</p> | |||
<p> | |||
<p> Example at <a href="../examples/sine-organ.lua.html#">sine-organ.lua</a>.</p> | |||
<p> This module facilitates the creation of polyphonic instruments. It acts | |||
as a layer that covers the <a href="../modules/plugin.html#processBlock">plugin.processBlock</a> function, receives MIDI | |||
notes and dispatches them to virtual tracks. The <a href="../modules/polyGen.html#polyGen.VTrack">polyGen.VTrack</a> prototype | |||
is exposed for you to define audio processing in a simple, | |||
monophonic, per-note fashion. Initialize this module by calling <a href="../modules/polyGen.html#initTracks">polyGen.initTracks</a> .</p> | |||
<p> The <a href="../modules/polyGen.html#">polyGen</a> global is available to every protoplug script after including the | |||
main protoplug header :</p> | |||
<pre><code>require "include/protoplug" | |||
</code></pre> | |||
</p> | |||
<h2><a href="#Functions">Functions</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#initTracks"><span class="proto_prefix">polyGen</span>.initTracks ([n=8])</a></td> | |||
<td class="summary">Set up virtual tracks.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Class_polyGen_VTrack">Class polyGen.VTrack </a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#VTrack:addProcessBlock"><span class="proto_prefix">polyGen.VTrack</span>:addProcessBlock (samples, smax)</a></td> | |||
<td class="summary">Override to additively process an audio block.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#VTrack:noteOn"><span class="proto_prefix">polyGen.VTrack</span>:noteOn (note, vel)</a></td> | |||
<td class="summary">Override to recieve note on.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#VTrack:noteOff"><span class="proto_prefix">polyGen.VTrack</span>:noteOff (note)</a></td> | |||
<td class="summary">Override to recieve note off.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#VTrack:init"><span class="proto_prefix">polyGen.VTrack</span>:init ()</a></td> | |||
<td class="summary">Override to allow initialisation.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#VTrack.i"><span class="proto_prefix">polyGen.VTrack</span>.i</a></td> | |||
<td class="summary">Track number.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#VTrack.note"><span class="proto_prefix">polyGen.VTrack</span>.note</a></td> | |||
<td class="summary">Current MIDI note.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#VTrack.noteFreq"><span class="proto_prefix">polyGen.VTrack</span>.noteFreq</a></td> | |||
<td class="summary">Current note frequency.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#VTrack.notePeriod"><span class="proto_prefix">polyGen.VTrack</span>.notePeriod</a></td> | |||
<td class="summary">Current note period.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#VTrack.noteIsOn"><span class="proto_prefix">polyGen.VTrack</span>.noteIsOn</a></td> | |||
<td class="summary">Note is on.</td> | |||
</tr> | |||
</table> | |||
<br/> | |||
<br/> | |||
<h2><a name="Functions"></a>Functions</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "initTracks"></a> | |||
<strong><span class="proto_prefix">polyGen</span>.initTracks ([n=8])</strong> | |||
</dt> | |||
<dd> | |||
Set up virtual tracks. | |||
This function must be called by any script that wishes to use this module. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">n</span> | |||
the number of virtual tracks to use (aka. voices or polyphony) | |||
(<em>default</em> 8) | |||
</li> | |||
</ul> | |||
</dd> | |||
</dl> | |||
<h2><a name="Class_polyGen_VTrack"></a>Class polyGen.VTrack </h2> | |||
Virtual track. A monophonic voice that defines the instrument's sound. | |||
<br><br> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "VTrack:addProcessBlock"></a> | |||
<strong><span class="proto_prefix">polyGen.VTrack</span>:addProcessBlock (samples, smax)</strong> | |||
</dt> | |||
<dd> | |||
Override to additively process an audio block. | |||
Define the output of a virtual track in this method. | |||
Use <code>self.noteIsOn</code>, <code>self.noteFreq</code>, or any fields you defined to | |||
determine current the state of the calling track.</p> | |||
<p> This method is called successively on every track, | |||
which should <em>add</em> their output to <code>samples</code>. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">samples</span> | |||
a C <code>float**</code> pointing to two channels of samples to add to. | |||
</li> | |||
<li><span class="parameter">smax</span> | |||
the maximum sample index (nSamples - 1) | |||
</li> | |||
</ul> | |||
<h3>See also:</h3> | |||
<ul> | |||
<a href="../examples/sine-organ.lua.html#">sine-organ.lua</a> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "VTrack:noteOn"></a> | |||
<strong><span class="proto_prefix">polyGen.VTrack</span>:noteOn (note, vel)</strong> | |||
</dt> | |||
<dd> | |||
Override to recieve note on. | |||
Override this method to handle a note getting dispatched to a virtual track. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">note</span> | |||
the MIDI note number (0-127) | |||
</li> | |||
<li><span class="parameter">vel</span> | |||
the MIDI velocity (0-127) | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "VTrack:noteOff"></a> | |||
<strong><span class="proto_prefix">polyGen.VTrack</span>:noteOff (note)</strong> | |||
</dt> | |||
<dd> | |||
Override to recieve note off. | |||
Override this method to handle a note off on a virtual track. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">note</span> | |||
a reminder of the MIDI note number | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "VTrack:init"></a> | |||
<strong><span class="proto_prefix">polyGen.VTrack</span>:init ()</strong> | |||
</dt> | |||
<dd> | |||
Override to allow initialisation. | |||
Override this method to perform initialisation tasks on each track, | |||
for example to create any per-track fields. | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "VTrack.i"></a> | |||
<strong><span class="proto_prefix">polyGen.VTrack</span>.i</strong> | |||
</dt> | |||
<dd> | |||
Track number. | |||
Use <code>self.i</code> to check which virtual track is being called. | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "VTrack.note"></a> | |||
<strong><span class="proto_prefix">polyGen.VTrack</span>.note</strong> | |||
</dt> | |||
<dd> | |||
Current MIDI note. | |||
The MIDI note number that is currently being played by this track, | |||
or <code>-1</code> if in note off state. | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "VTrack.noteFreq"></a> | |||
<strong><span class="proto_prefix">polyGen.VTrack</span>.noteFreq</strong> | |||
</dt> | |||
<dd> | |||
Current note frequency. | |||
The note frequency that is currently being played by this track. | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "VTrack.notePeriod"></a> | |||
<strong><span class="proto_prefix">polyGen.VTrack</span>.notePeriod</strong> | |||
</dt> | |||
<dd> | |||
Current note period. | |||
<code>1/noteFreq</code> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "VTrack.noteIsOn"></a> | |||
<strong><span class="proto_prefix">polyGen.VTrack</span>.noteIsOn</strong> | |||
</dt> | |||
<dd> | |||
Note is on. | |||
Whether the track is playing a note (<code>boolean</code>). | |||
</ul> | |||
</dd> | |||
</dl> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,304 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Module script</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Contents</h2> | |||
<ul> | |||
<li><a href="#Functions">Functions</a></li> | |||
<li><a href="#Predefined_values">Predefined values</a></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><strong>script</strong></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><a href="../modules/stereoFx.html">stereoFx</a></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<h1>Module <code>script</code></h1> | |||
<p>Use <a href="../modules/script.html#">script</a> to handle script events, libraries and files.</p> | |||
<p> | |||
<p> The <a href="../modules/script.html#">script</a> global is available to every protoplug script after including the | |||
main protoplug header :</p> | |||
<pre><code>require "include/protoplug" | |||
</code></pre> | |||
</p> | |||
<h2><a href="#Functions">Functions</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#addHandler"><span class="proto_prefix">script</span>.addHandler (event, handler)</a></td> | |||
<td class="summary">Add a handler for a script event.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#saveData"><span class="proto_prefix">script</span>.saveData ()</a></td> | |||
<td class="summary">Save script data.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#loadData"><span class="proto_prefix">script</span>.loadData (data)</a></td> | |||
<td class="summary">Load script data.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#ffiLoad"><span class="proto_prefix">script</span>.ffiLoad (libName[, ...])</a></td> | |||
<td class="summary">Load shared libraries.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Predefined_values">Predefined values</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#protoplugDir"><span class="proto_prefix">script</span>.protoplugDir</a></td> | |||
<td class="summary">Current protoplug directory.</td> | |||
</tr> | |||
</table> | |||
<br/> | |||
<br/> | |||
<h2><a name="Functions"></a>Functions</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "addHandler"></a> | |||
<strong><span class="proto_prefix">script</span>.addHandler (event, handler)</strong> | |||
</dt> | |||
<dd> | |||
<p>Add a handler for a script event. | |||
The following events are available :</p> | |||
<ul> | |||
<li><code>"init"</code> - Emitted after the script has been compiled and run.</li> | |||
<li><code>"preClose"</code> - Emitted before the script state gets destroyed.</li> | |||
</ul> | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">event</span> | |||
<span class="types"><a class="type" href="http://www.lua.org/manual/5.1/manual.html#5.4">string</a></span> | |||
the event to handle | |||
</li> | |||
<li><span class="parameter">handler</span> | |||
<span class="types"><span class="type">function</span></span> | |||
a function to add the event's handlers | |||
</li> | |||
</ul> | |||
<h3>See also:</h3> | |||
<ul> | |||
<li><a href="../modules/plugin.html#addHandler">plugin.addHandler</a></li> | |||
<li><a href="../modules/gui.html#addHandler">gui.addHandler</a></li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "saveData"></a> | |||
<strong><span class="proto_prefix">script</span>.saveData ()</strong> | |||
</dt> | |||
<dd> | |||
Save script data. | |||
Override this function to save any custom data.</p> | |||
<p> This gets called : | |||
- when the host saves the plugin's state (eg. when saving a project) | |||
- right before the script is recompiled, to keep custom data across compilations. | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
<span class="types"><a class="type" href="http://www.lua.org/manual/5.1/manual.html#5.4">string</a></span> | |||
the data to be saved | |||
</ol> | |||
</dd> | |||
<dt> | |||
<a name = "loadData"></a> | |||
<strong><span class="proto_prefix">script</span>.loadData (data)</strong> | |||
</dt> | |||
<dd> | |||
Load script data. | |||
Override this function to load any custom data. | |||
Be warned that the data might originate from another script, so it's a good | |||
idea to start the data with a header confirming the format.</p> | |||
<p> This gets called : | |||
- when the host loads the plugin's state (eg. when loading a project) | |||
- right after the script is recompiled, to keep custom data across compilations. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">data</span> | |||
<span class="types"><a class="type" href="http://www.lua.org/manual/5.1/manual.html#5.4">string</a></span> | |||
the data to be loaded | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "ffiLoad"></a> | |||
<strong><span class="proto_prefix">script</span>.ffiLoad (libName[, ...])</strong> | |||
</dt> | |||
<dd> | |||
Load shared libraries. | |||
Protoplug scripts should use this wrapper function instead of LuaJIT's | |||
<a href="http://luajit.org/ext_ffi_api.html#ffi_load">ffi.load</a>. | |||
It has the same behaviour as <code>ffi.load</code>, but it adds <code>protoplug/lib</code> as a | |||
search path, and can accept multiple arguments to test for different | |||
library names. The names are tested from left to right until one load | |||
successfully. If none of them work, an error is raised.</p> | |||
<pre><code>sdl = script.ffiLoad("sdl") | |||
</code></pre> | |||
<p> This looks for <code>libsdl.so</code> or <code>sdl.dll</code> in protoplug's lib folder and | |||
in the system paths. </p> | |||
<pre><code>fftw = script.ffiLoad("libfftw3.so.3", "libfftw3-3.dll") | |||
</code></pre> | |||
<p> This looks for the supplied names in the same locations as above. This is | |||
necessary for libs like FFTW, that have has platform-dependent names. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">libName</span> | |||
<span class="types"><a class="type" href="http://www.lua.org/manual/5.1/manual.html#5.4">string</a></span> | |||
</li> | |||
<li><span class="parameter">...</span> | |||
<span class="types"><a class="type" href="http://www.lua.org/manual/5.1/manual.html#5.4">string</a></span> | |||
alternate names for the same library | |||
</li> | |||
</ul> | |||
<h3>Returns:</h3> | |||
<ol> | |||
The library's ffi namespace | |||
</ol> | |||
</dd> | |||
</dl> | |||
<h2><a name="Predefined_values"></a>Predefined values</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "protoplugDir"></a> | |||
<strong><span class="proto_prefix">script</span>.protoplugDir</strong> | |||
</dt> | |||
<dd> | |||
Current protoplug directory. | |||
The full path of the <code>protoplug</code> directory currently being used. It should | |||
be alongside the protoplug fx and gen dynamic libraries. | |||
</ul> | |||
</dd> | |||
</dl> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,204 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |||
<head> | |||
<title>protoplug: Module stereoFx</title> | |||
<link rel="stylesheet" href="../ldoc.css" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>protoplug</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
<ul> | |||
<li><a href="../index.html">Index</a></li> | |||
</ul> | |||
<h2>Contents</h2> | |||
<ul> | |||
<li><a href="#Functions">Functions</a></li> | |||
<li><a href="#Class_stereoFx_Channel">Class stereoFx.Channel </a></li> | |||
</ul> | |||
<h2>Modules</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../modules/plugin.html">plugin</a></li> | |||
<li><a href="../modules/script.html">script</a></li> | |||
<li><a href="../modules/midi.html">midi</a></li> | |||
<li><a href="../modules/gui.html">gui</a></li> | |||
<li><a href="../modules/polyGen.html">polyGen</a></li> | |||
<li><strong>stereoFx</strong></li> | |||
</ul> | |||
<h2>Classes</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../classes/juce.AffineTransform.html">juce.AffineTransform</a></li> | |||
<li><a href="../classes/juce.AudioFormatReader.html">juce.AudioFormatReader</a></li> | |||
<li><a href="../classes/juce.Colour.html">juce.Colour</a></li> | |||
<li><a href="../classes/juce.ColourGradient.html">juce.ColourGradient</a></li> | |||
<li><a href="../classes/juce.Component.html">juce.Component</a></li> | |||
<li><a href="../classes/juce.FillType.html">juce.FillType</a></li> | |||
<li><a href="../classes/juce.Font.html">juce.Font</a></li> | |||
<li><a href="../classes/juce.Graphics.html">juce.Graphics</a></li> | |||
<li><a href="../classes/juce.Image.html">juce.Image</a></li> | |||
<li><a href="../classes/juce.Justification.html">juce.Justification</a></li> | |||
<li><a href="../classes/juce.LagrangeInterpolator.html">juce.LagrangeInterpolator</a></li> | |||
<li><a href="../classes/juce.Line.html">juce.Line</a></li> | |||
<li><a href="../classes/juce.Path.html">juce.Path</a></li> | |||
<li><a href="../classes/juce.Point.html">juce.Point</a></li> | |||
<li><a href="../classes/juce.RectanglePlacement.html">juce.RectanglePlacement</a></li> | |||
<li><a href="../classes/juce.Rectangle_float.html">juce.Rectangle_float</a></li> | |||
<li><a href="../classes/juce.Rectangle_int.html">juce.Rectangle_int</a></li> | |||
</ul> | |||
<h2>Examples</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
<li><a href="../examples/classic-filter.lua.html">classic-filter.lua</a></li> | |||
<li><a href="../examples/sine-organ.lua.html">sine-organ.lua</a></li> | |||
<li><a href="../examples/midi-chordify.lua.html">midi-chordify.lua</a></li> | |||
<li><a href="../examples/sinemouse-demo.lua.html">sinemouse-demo.lua</a></li> | |||
<li><a href="../examples/soundfile-test.lua.html">soundfile-test.lua</a></li> | |||
</ul> | |||
</div> | |||
<div id="content"> | |||
<h1>Module <code>stereoFx</code></h1> | |||
<p>Use this module to create a stereo effect.</p> | |||
<p> | |||
<p> Example at <a href="../examples/classic-filter.lua.html#">classic-filter.lua</a>.</p> | |||
<p> This module acts as a layer that conceals the <a href="../modules/plugin.html#processBlock">plugin.processBlock</a> function, | |||
manages stereo channels, and exposes the <a href="../modules/stereoFx.html#stereoFx.Channel">stereoFx.Channel</a> prototype for you | |||
define per-channel audio processing. Initialize it by calling <a href="../modules/stereoFx.html#init">stereoFx.init</a> .</p> | |||
<p> The <a href="../modules/stereoFx.html#">stereoFx</a> global is available to every protoplug script after including the | |||
main protoplug header :</p> | |||
<pre><code>require "include/protoplug" | |||
</code></pre> | |||
</p> | |||
<h2><a href="#Functions">Functions</a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#init"><span class="proto_prefix">stereoFx</span>.init ()</a></td> | |||
<td class="summary">Set up channels.</td> | |||
</tr> | |||
</table> | |||
<h2><a href="#Class_stereoFx_Channel">Class stereoFx.Channel </a></h2> | |||
<table class="function_list"> | |||
<tr> | |||
<td class="name" nowrap><a href="#Channel:processBlock"><span class="proto_prefix">stereoFx.Channel</span>:processBlock (samples, smax)</a></td> | |||
<td class="summary">Override to process a channel's audio block.</td> | |||
</tr> | |||
<tr> | |||
<td class="name" nowrap><a href="#Channel:init"><span class="proto_prefix">stereoFx.Channel</span>:init ()</a></td> | |||
<td class="summary">Override to handle initialisation.</td> | |||
</tr> | |||
</table> | |||
<br/> | |||
<br/> | |||
<h2><a name="Functions"></a>Functions</h2> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "init"></a> | |||
<strong><span class="proto_prefix">stereoFx</span>.init ()</strong> | |||
</dt> | |||
<dd> | |||
Set up channels. | |||
This function must be called by any script that wishes to use this module. | |||
</ul> | |||
</dd> | |||
</dl> | |||
<h2><a name="Class_stereoFx_Channel"></a>Class stereoFx.Channel </h2> | |||
This class represents a channel (ie. left or right). | |||
<br><br> | |||
<dl class="function"> | |||
<dt> | |||
<a name = "Channel:processBlock"></a> | |||
<strong><span class="proto_prefix">stereoFx.Channel</span>:processBlock (samples, smax)</strong> | |||
</dt> | |||
<dd> | |||
Override to process a channel's audio block. | |||
Define the audio processing of a single channel in this function. | |||
</ul> | |||
<h3>Parameters:</h3> | |||
<ul> | |||
<li><span class="parameter">samples</span> | |||
a C float* serving as input and output | |||
</li> | |||
<li><span class="parameter">smax</span> | |||
the maximum sample index (nSamples - 1) | |||
</li> | |||
</ul> | |||
</dd> | |||
<dt> | |||
<a name = "Channel:init"></a> | |||
<strong><span class="proto_prefix">stereoFx.Channel</span>:init ()</strong> | |||
</dt> | |||
<dd> | |||
Override to handle initialisation. | |||
Override this method to perform initialisation tasks on each channel, | |||
for example to create any per-channel fields. | |||
</ul> | |||
</dd> | |||
</dl> | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,3 @@ | |||
cd "C:\Users\pac\Documents\Visual Studio 2010\Projects\protoplug\ProtoplugFiles\doc\src" | |||
lua c:\SDKs\ldoc\ldoc.lua -d ../ . | |||
pause |
@@ -0,0 +1,77 @@ | |||
-- ldoc configuration file | |||
-- works with ldoc 1.4.2 (http://stevedonovan.github.io/ldoc/) | |||
title = "Protoplug Lua API Reference" | |||
project = "protoplug" | |||
description = [[ | |||
Protoplug Lua API Reference | |||
]] | |||
local function softenPrefix(s) | |||
if s:find("^%b<>.-[%.:][^%.%:]-$") then | |||
-- already wrapped function : leave wrap outisde | |||
return s:gsub("^(%b<>)(.-)([%.:])([^%.%:]-)%((.-)$", "%1<span class=\"proto_prefix\">%2</span>%3%4%(%5") | |||
elseif s:find("^.-[%.:][^%.%:]-%(.-$") then | |||
-- function : allow for dots in optional parameter values | |||
return s:gsub("^(.-)([%.:])([^%.%:]-)%((.-)$", "<span class=\"proto_prefix\">%1</span>%2%3%(%4") | |||
elseif s:find("[%.:][^%.%:]-$") then | |||
return "<span class=\"proto_prefix\">"..s:gsub("([%.:])([^%.%:]-)$", "</span>%1%2") | |||
else | |||
return s | |||
end | |||
end | |||
local forcePrefix = {"plugin", "script", "gui", "midi", "polyGen", "stereoFx"} | |||
local function formatName(item, default_display_name) | |||
for _, v in ipairs(forcePrefix) do | |||
if item.module.name == v then | |||
-- display the prefix on globals to be more explicit | |||
if item.tags.display then | |||
return item.tags.display[1].." "..item.args | |||
else | |||
return item.module.name.."."..default_display_name(item) | |||
end | |||
end | |||
end | |||
if item.tags.constructor then | |||
-- constructors that are a metatable __call | |||
return item.module.name.." "..item.args | |||
elseif #default_display_name(item) >100 then | |||
-- auto wrap ridiculously long names (it's ugly but better than nothing) | |||
return '<span class="wrapman">'..(item.display_name or item.name)..'<br> '..item.args..'</span>' | |||
elseif #default_display_name(item) >60 then | |||
-- manually wrap slightly long names | |||
return (item.display_name or item.name)..'<br> '..item.args | |||
end | |||
-- mostly class/classmod methods fall into the default display | |||
return default_display_name(item) | |||
end | |||
custom_display_name_handler = function(item, default_display_name) | |||
return softenPrefix(formatName(item, default_display_name)) | |||
end | |||
custom_tags = { { "display", hidden = true } } | |||
new_type("simplefield","Fields") | |||
new_type("predefined","Predefined values") | |||
file = { | |||
'../../include/core/plugin.lua'; | |||
'../../include/core/script.lua'; | |||
'../../include/core/midi.lua'; | |||
'../../include/core/gui.lua'; | |||
'../../include/core/polygen.lua'; | |||
'../../include/core/stereofx.lua'; | |||
'../../include/protojuce'; | |||
} | |||
examples = { | |||
'../../effects/classic-filter.lua'; | |||
'../../generators/sine-organ.lua'; | |||
'../../generators/midi-chordify.lua'; | |||
'../../generators/sinemouse-demo.lua'; | |||
'../../generators/soundfile-test.lua'; | |||
} | |||
format = 'markdown' | |||
style = true | |||
template = true |
@@ -0,0 +1,333 @@ | |||
/* BEGIN RESET | |||
Copyright (c) 2010, Yahoo! Inc. All rights reserved. | |||
Code licensed under the BSD License: | |||
http://developer.yahoo.com/yui/license.html | |||
version: 2.8.2r1 | |||
*/ | |||
html { | |||
color: #000; | |||
background: #FFF; | |||
} | |||
body { | |||
text-align: center; | |||
} | |||
body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,button,textarea,p,blockquote,th,td { | |||
margin: 0; | |||
padding: 0; | |||
} | |||
table { | |||
border-collapse: collapse; | |||
border-spacing: 0; | |||
} | |||
fieldset,img { | |||
border: 0; | |||
} | |||
address,caption,cite,code,dfn,em,strong,th,var,optgroup { | |||
font-style: inherit; | |||
font-weight: inherit; | |||
} | |||
del,ins { | |||
text-decoration: none; | |||
} | |||
li { | |||
list-style: bullet; | |||
margin-left: 20px; | |||
} | |||
caption,th { | |||
text-align: left; | |||
} | |||
h1,h2,h3,h4,h5,h6 { | |||
font-size: 100%; | |||
font-weight: bold; | |||
} | |||
q:before,q:after { | |||
content: ''; | |||
} | |||
abbr,acronym { | |||
border: 0; | |||
font-variant: normal; | |||
} | |||
sup { | |||
vertical-align: baseline; | |||
} | |||
sub { | |||
vertical-align: baseline; | |||
} | |||
legend { | |||
color: #000; | |||
} | |||
input,button,textarea,select,optgroup,option { | |||
font-family: inherit; | |||
font-size: inherit; | |||
font-style: inherit; | |||
font-weight: inherit; | |||
} | |||
input,button,textarea,select {*font-size:100%; | |||
} | |||
/* END RESET */ | |||
body { | |||
margin-left: 1em; | |||
margin-right: 1em; | |||
font-family: arial, helvetica, geneva, sans-serif; | |||
background-color: #ffffff; margin: 0px; | |||
} | |||
code, tt { font-family: monospace; } | |||
span.parameter { font-family:monospace; } | |||
span.parameter:after { content:":"; } | |||
span.types:before { content:"("; } | |||
span.types:after { content:")"; } | |||
.type { font-weight: bold; font-style:italic } | |||
body, p, td, th { font-size: .95em; line-height: 1.2em;} | |||
p, ul { margin: 10px 0 0 0px;} | |||
strong { font-weight: bold;} | |||
em { font-style: italic;} | |||
h1 { | |||
font-size: 1.5em; | |||
margin: 10px 0 20px 0; | |||
} | |||
h2, h3, h4 { margin: 15px 0 10px 0; } | |||
h2 { | |||
border-bottom: 2px solid #ccc; | |||
font-size: 1.25em; | |||
margin: 19px 0 12px; | |||
} | |||
h3 { font-size: 1.15em; } | |||
h4 { font-size: 1.06em; } | |||
a:link { font-weight: bold; color: #004080; text-decoration: none; } | |||
a:visited { font-weight: bold; color: #006699; text-decoration: none; } | |||
a:link:hover { text-decoration: underline; } | |||
hr { | |||
color:#cccccc; | |||
background: #00007f; | |||
height: 1px; | |||
} | |||
blockquote { margin-left: 3em; } | |||
ul { list-style-type: disc; } | |||
p.name { | |||
font-family: Consolas, monaco, monospace; | |||
padding-top: 1em; | |||
} | |||
pre.example { | |||
background-color: rgb(245, 245, 245); | |||
border: 1px solid silver; | |||
padding: 10px; | |||
margin: 10px 0 10px 0; | |||
font-family: Consolas, monaco, monospace; | |||
font-size: .85em; | |||
} | |||
pre { | |||
background-color: rgb(245,245,255); | |||
border: 1px solid #cccccc; | |||
padding: 10px; | |||
margin: 10px 0 10px 0; | |||
overflow: auto; | |||
font-family: Consolas, monaco, monospace; | |||
-moz-tab-size: 4; | |||
-o-tab-size: 4; | |||
tab-size: 4; | |||
font-size: 14px; | |||
} | |||
table.index { border: 1px #00007f; } | |||
table.index td { text-align: left; vertical-align: top; } | |||
#container { | |||
/*margin-left: 1em; | |||
margin-right: 1em; | |||
background-color: #f4f4ff;*/ | |||
display: inline-block; | |||
margin: 0 auto; | |||
text-align: left; | |||
} | |||
#product { | |||
text-align: center; | |||
border-bottom: 1px solid #cccccc; | |||
background-color: #ffffff; | |||
} | |||
#product big { | |||
font-size: 2em; | |||
} | |||
#main { | |||
background-color:#FFFFFF; | |||
/*border-left: 2px solid #cccccc;*/ | |||
} | |||
#navigation { | |||
float: left; | |||
width: 14em; | |||
vertical-align: top; | |||
background-color:#FFFFFF; | |||
overflow: visible; | |||
} | |||
#navigation h2 { | |||
background-color:#FFFFFF; | |||
font-size:1.1em; | |||
color:#000000; | |||
text-align: left; | |||
padding:0.2em; | |||
/*border-top:1px solid #dddddd;*/ | |||
border-bottom:1px solid #dddddd; | |||
} | |||
#navigation ul | |||
{ | |||
font-size:1em; | |||
list-style-type: none; | |||
margin: 1px 1px 10px 1px; | |||
} | |||
#navigation li { | |||
text-indent: -1em; | |||
display: block; | |||
margin: 3px 0px 0px 22px; | |||
word-wrap: break-word; | |||
} | |||
#navigation li li a { | |||
margin: 0px 3px 0px -1em; | |||
} | |||
#content { | |||
margin-left: 14em; | |||
padding: 1em; | |||
width: 700px; | |||
border-left: 2px solid #cccccc; | |||
/*border-right: 2px solid #cccccc;*/ | |||
background-color: #ffffff; | |||
} | |||
#about { | |||
clear: both; | |||
padding: 5px; | |||
border-top: 2px solid #cccccc; | |||
background-color: #ffffff; | |||
} | |||
@media print { | |||
body { | |||
font: 12pt "Times New Roman", "TimeNR", Times, serif; | |||
} | |||
a { font-weight: bold; color: #004080; text-decoration: underline; } | |||
#main { | |||
background-color: #ffffff; | |||
border-left: 0px; | |||
} | |||
#container { | |||
margin-left: 2%; | |||
margin-right: 2%; | |||
background-color: #ffffff; | |||
} | |||
#content { | |||
padding: 1em; | |||
background-color: #ffffff; | |||
} | |||
#navigation { | |||
display: none; | |||
} | |||
pre.example { | |||
font-family: Consolas, monaco, monospace; | |||
font-size: 10pt; | |||
page-break-inside: avoid; | |||
} | |||
} | |||
table.module_list { | |||
border-width: 1px; | |||
border-style: solid; | |||
border-color: #cccccc; | |||
border-collapse: collapse; | |||
} | |||
table.module_list td { | |||
border-width: 1px; | |||
padding: 3px; | |||
border-style: solid; | |||
border-color: #cccccc; | |||
} | |||
table.module_list td.name { background-color: #f4f4ff; ; min-width: 200px; } | |||
table.module_list td.summary { width: 100%; } | |||
table.function_list { | |||
border-width: 1px; | |||
border-style: solid; | |||
border-color: #cccccc; | |||
border-collapse: collapse; | |||
} | |||
table.function_list td { | |||
border-width: 1px; | |||
padding: 3px; | |||
border-style: solid; | |||
border-color: #cccccc; | |||
} | |||
table.function_list td.name { background-color: #f6f6ff; ; min-width: 200px; padding: 7px 5px; } | |||
table.function_list td.summary { width: 100%; } | |||
dl.table dt, dl.function dt { | |||
background-color: #f4f4ff; | |||
border-bottom: 1px solid #ccc; | |||
border-left: 1px solid #ccc; | |||
border-top: 1px solid #ccc; | |||
padding: 0.7em 0 0.5em 1em; | |||
} | |||
dl.table dd, dl.function dd {padding-bottom: 1em; margin: 10px 0 0 20px;} | |||
dl.table h3, dl.function h3 {font-size: .95em;} | |||
ul.nowrap { | |||
overflow:auto; | |||
whitespace:nowrap; | |||
} | |||
/* stop sublists from having initial vertical space */ | |||
ul ul { margin-top: 0px; } | |||
ol ul { margin-top: 0px; } | |||
ol ol { margin-top: 0px; } | |||
ul ol { margin-top: 0px; } | |||
/* styles for prettification of source */ | |||
pre .comment { color: #558817; } | |||
pre .constant { color: #a8660d; } | |||
pre .escape { color: #844631; } | |||
pre .keyword { color: #2239a8; font-weight: bold; } | |||
pre .library { color: #0e7c6b; } | |||
pre .marker { color: #512b1e; background: #fedc56; font-weight: bold; } | |||
pre .string { color: #a8660d; } | |||
pre .number { color: #f8660d; } | |||
pre .operator { color: #2239a8; font-weight: bold; } | |||
pre .preprocessor, pre .prepro { color: #a33243; } | |||
pre .global { color: #800080; } | |||
pre .prompt { color: #558817; } | |||
pre .url { color: #272fc2; text-decoration: underline; } | |||
.wrapman { display: inline-block; white-space: normal; min-width: 460px; } | |||
.proto_subtitle {color: #888; position: relative; top: -12px;} | |||
.function_list .proto_prefix {color: #789;} | |||
.osarlogo { | |||
display: block; | |||
width: 132px; | |||
height: 121px; | |||
background: url("osar-121.png") no-repeat scroll 0 0 transparent; | |||
margin: 0 auto; | |||
} |
@@ -0,0 +1,340 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html> | |||
# -- pac : fix ldoc ordering issues (?) | |||
# if module then | |||
# local function startsWith(a, b) | |||
# return (a:sub(1, b:len()) == b) | |||
# end | |||
# local finalOrder = { | |||
# "Callback"; | |||
# "Override"; | |||
# "Constructors"; | |||
# "Functions"; | |||
# "Methods"; | |||
# "Tables"; | |||
# "Fields"; | |||
# "Predefined"; | |||
# "Class"; | |||
# ""; | |||
# } | |||
# local sorted = {} | |||
# local twodim = {} | |||
# for k, v in ldoc.ipairs(finalOrder) do twodim[k] = {} end | |||
# for kind, items in module.kinds() do | |||
# for k, v in ldoc.ipairs(finalOrder) do | |||
# if startsWith(kind, v) then | |||
# twodim[k][#twodim[k]+1] = {kind, items} | |||
# break | |||
# end | |||
# end | |||
# end | |||
# for k, v in ldoc.ipairs(twodim) do | |||
# for k2, v2 in ldoc.ipairs(v) do | |||
# sorted[#sorted+1] = v2 | |||
# end | |||
# end | |||
# function getKinds() | |||
# local i = 0 | |||
# return function () | |||
# i = i + 1 | |||
# if sorted[i] then | |||
# return sorted[i][1], sorted[i][2] | |||
# end | |||
# end | |||
# end | |||
# end | |||
<meta http-equiv="Content-Type" content="text/html; charset=$(ldoc.doc_charset)"/> | |||
<head> | |||
# if module then | |||
<title>$(ldoc.project): $(ldoc.module_typename(module)) $(module.name)</title> | |||
# else | |||
<title>$(ldoc.title)</title> | |||
# end | |||
<link rel="stylesheet" href="$(ldoc.css)" type="text/css" /> | |||
</head> | |||
<body> | |||
<div id="container"> | |||
<div id="product"> | |||
<div id="product_logo"></div> | |||
<div id="product_name"><big><b></b></big></div> | |||
<div id="product_description"></div> | |||
</div> <!-- id="product" --> | |||
<div id="main"> | |||
# local no_spaces = ldoc.no_spaces | |||
# local use_li = ldoc.use_li | |||
# local display_name = ldoc.display_name | |||
# local iter = ldoc.modules.iter | |||
# local function M(txt,item) return ldoc.markup(txt,item,ldoc.plain) end | |||
# local nowrap = ldoc.wrap and '' or 'nowrap' | |||
<!-- Menu --> | |||
<div id="navigation"> | |||
<a href="http://osar.fr"> | |||
<div class=osarlogo> </div> | |||
</a> | |||
<br/> | |||
<a href="http://osar.fr/protoplug"> | |||
<h1>$(ldoc.project)</h1> | |||
</a> | |||
<span class="proto_subtitle">Lua API reference</span> | |||
# if not ldoc.single and module then -- reference back to project index | |||
<ul> | |||
<li><a href="../$(ldoc.output).html">Index</a></li> | |||
</ul> | |||
# end | |||
# --------- contents of module ------------- | |||
# if module and not ldoc.no_summary and #module.items > 0 then | |||
<h2>Contents</h2> | |||
<ul> | |||
# for kind, items in getKinds() do | |||
<li><a href="#$(no_spaces(kind))">$(kind)</a></li> | |||
# end | |||
</ul> | |||
# end | |||
# if ldoc.no_summary and module and not ldoc.one then -- bang out the functions on the side | |||
# for kind, items in getKinds() do | |||
<h2>$(kind)</h2> | |||
<ul class="nowrap"> | |||
# for item in items() do | |||
<li><a href="#$(item.name)">$(display_name(item))</a></li> | |||
# end | |||
</ul> | |||
# end | |||
# end | |||
# -------- contents of project ---------- | |||
# local this_mod = module and module.name | |||
# for kind, mods, type in ldoc.kinds() do | |||
# if not ldoc.kinds_allowed or ldoc.kinds_allowed[type] then | |||
<h2>$(kind)</h2> | |||
<ul class="$(kind=='Topics' and '' or 'nowrap'"> | |||
# for mod in mods() do local name = ldoc.module_name(mod) | |||
# if mod.name == this_mod then | |||
<li><strong>$(name)</strong></li> | |||
# else | |||
<li><a href="$(ldoc.ref_to_module(mod))">$(name)</a></li> | |||
# end | |||
# end | |||
# end | |||
</ul> | |||
# end | |||
</div> | |||
<div id="content"> | |||
# if ldoc.body then -- verbatim HTML as contents; 'non-code' entries | |||
$(ldoc.body) | |||
# elseif module then -- module documentation | |||
<h1>$(ldoc.module_typename(module)) <code>$(module.name)</code></h1> | |||
<p>$(M(module.summary,module))</p> | |||
<p>$(M(module.description,module))</p> | |||
# if module.usage then | |||
# local li,il = use_li(module.usage) | |||
<h3>Usage:</h3> | |||
<ul> | |||
# for usage in iter(module.usage) do | |||
$(li)<pre class="example">$(ldoc.escape(usage))</pre>$(il) | |||
# end -- for | |||
</ul> | |||
# end -- if usage | |||
# if module.info then | |||
<h3>Info:</h3> | |||
<ul> | |||
# for tag, value in module.info:iter() do | |||
<li><strong>$(tag)</strong>: $(M(value,module))</li> | |||
# end | |||
</ul> | |||
# end -- if module.info | |||
# if not ldoc.no_summary then | |||
# -- bang out the tables of item types for this module (e.g Functions, Tables, etc) | |||
# for kind, items in getKinds() do | |||
<h2><a href="#$(no_spaces(kind))">$(kind)</a></h2> | |||
<table class="function_list"> | |||
# for item in items() do | |||
<tr> | |||
<td class="name" $(nowrap)><a href="#$(item.name)">$(display_name(item))</a></td> | |||
<td class="summary">$(M(item.summary,item))</td> | |||
</tr> | |||
# end -- for items | |||
</table> | |||
#end -- for kinds | |||
<br/> | |||
<br/> | |||
#end -- if not no_summary | |||
# --- currently works for both Functions and Tables. The params field either contains | |||
# --- function parameters or table fields. | |||
# local show_return = not ldoc.no_return_or_parms | |||
# local show_parms = show_return | |||
# for kind, items in getKinds() do | |||
# local kitem = module.kinds:get_item(kind) | |||
<h2><a name="$(no_spaces(kind))"></a>$(kind)</h2> | |||
#-- $(M(module.kinds:get_section_description(kind),nil)) | |||
# if kitem then | |||
$(M(ldoc.descript(kitem),kitem)) | |||
# if kitem.usage then | |||
<h3>Usage:</h3> | |||
<pre class="example">$(ldoc.prettify(kitem.usage[1]))</pre> | |||
# end | |||
# end | |||
<dl class="function"> | |||
# for item in items() do | |||
<dt> | |||
<a name = "$(item.name)"></a> | |||
<strong>$(display_name(item))</strong> | |||
</dt> | |||
<dd> | |||
$(M(ldoc.descript(item),item)) | |||
# if ldoc.custom_tags then | |||
# for custom in iter(ldoc.custom_tags) do | |||
# local tag = item.tags[custom[1]] | |||
# if tag and not custom.hidden then | |||
# local li,il = use_li(tag) | |||
<h3>$(custom.title or custom[1]):</h3> | |||
<ul> | |||
# for value in iter(tag) do | |||
$(li)$(custom.format and custom.format(value) or M(value))$(il) | |||
# end -- for | |||
# end -- if tag | |||
</ul> | |||
# end -- iter tags | |||
# end | |||
# if show_parms and item.params and #item.params > 0 then | |||
# local subnames = module.kinds:type_of(item).subnames | |||
# if subnames then | |||
<h3>$(subnames):</h3> | |||
# end | |||
<ul> | |||
# for parm in iter(item.params) do | |||
# local param,sublist = item:subparam(parm) | |||
# if sublist then | |||
<li><span class="parameter">$(sublist)</span>$(M(item.params[sublist],item)) | |||
<ul> | |||
# end | |||
# for p in iter(param) do | |||
# local name,tp,def = item:display_name_of(p), ldoc.typename(item:type_of_param(p)), item:default_of_param(p) | |||
<li><span class="parameter">$(name)</span> | |||
# if tp ~= '' then | |||
<span class="types">$(tp)</span> | |||
# end | |||
$(M(item.params[p],item)) | |||
# if def then | |||
(<em>default</em> $(def)) | |||
# end | |||
# if item:readonly(p) then | |||
<em>readonly</em> | |||
# end | |||
</li> | |||
# end | |||
# if sublist then | |||
</li></ul> | |||
# end | |||
# end -- for | |||
</ul> | |||
# end -- if params | |||
# if show_return and item.retgroups then local groups = item.retgroups | |||
<h3>Returns:</h3> | |||
# for i,group in ldoc.ipairs(groups) do local li,il = use_li(group) | |||
<ol> | |||
# for r in group:iter() do local type, ctypes = item:return_type(r); local rt = ldoc.typename(type) | |||
$(li) | |||
# if rt ~= '' then | |||
<span class="types">$(rt)</span> | |||
# end | |||
$(M(r.text,item))$(il) | |||
# if ctypes then | |||
<ul> | |||
# for c in ctypes:iter() do | |||
<li><span class="parameter">$(c.name)</span> | |||
<span class="types">$(ldoc.typename(c.type))</span> | |||
$(M(c.comment,item))</li> | |||
# end | |||
</ul> | |||
# end -- if ctypes | |||
# end -- for r | |||
</ol> | |||
# if i < #groups then | |||
<h3>Or</h3> | |||
# end | |||
# end -- for group | |||
# end -- if returns | |||
# if show_return and item.raise then | |||
<h3>Raises:</h3> | |||
$(M(item.raise,item)) | |||
# end | |||
# if item.see then | |||
# local li,il = use_li(item.see) | |||
<h3>See also:</h3> | |||
<ul> | |||
# for see in iter(item.see) do | |||
$(li)<a href="$(ldoc.href(see))">$(see.label)</a>$(il) | |||
# end -- for | |||
</ul> | |||
# end -- if see | |||
# if item.usage then | |||
# local li,il = use_li(item.usage) | |||
<h3>Usage:</h3> | |||
<ul> | |||
# for usage in iter(item.usage) do | |||
$(li)<pre class="example">$(ldoc.prettify(usage))</pre>$(il) | |||
# end -- for | |||
</ul> | |||
# end -- if usage | |||
</dd> | |||
# end -- for items | |||
</dl> | |||
# end -- for kinds | |||
# else -- if module; project-level contents | |||
# if ldoc.description then | |||
<h2>$(M(ldoc.description,nil))</h2> | |||
# end | |||
# if ldoc.full_description then | |||
<p>$(M(ldoc.full_description,nil))</p> | |||
# end | |||
# for kind, mods in ldoc.kinds() do | |||
<h2>$(kind)</h2> | |||
# kind = kind:lower() | |||
<table class="module_list"> | |||
# for m in mods() do | |||
<tr> | |||
<td class="name" $(nowrap)><a href="$(no_spaces(kind))/$(m.name).html">$(m.name)</a></td> | |||
<td class="summary">$(M(m.summary,m))</td> | |||
</tr> | |||
# end -- for modules | |||
</table> | |||
# end -- for kinds | |||
# end -- if module | |||
</div> <!-- id="content" --> | |||
</div> <!-- id="main" --> | |||
<div id="about"> | |||
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i> | |||
</div> <!-- id="about" --> | |||
</div> <!-- id="container" --> | |||
</body> | |||
</html> |
@@ -0,0 +1,74 @@ | |||
--[[ | |||
name: Classic Filter | |||
description: > | |||
Straightforward application of RBJ's cookbook filters. Formulae by | |||
Robert Bristow-Johnson, implementation from Worp by Ico Doornekamp. | |||
author: osar.fr | |||
--]] | |||
require "include/protoplug" | |||
local cbFilter = require "include/pac/cookbook filters" | |||
local filters = {} | |||
stereoFx.init() | |||
function stereoFx.Channel:init() | |||
-- create per-channel fields (filters) | |||
self.filter = cbFilter | |||
{ | |||
-- initialize filters with current param values | |||
type = params[1].getValue(); | |||
f = params[2].getValue()/2; | |||
gain = params[3].getValue(); | |||
Q = params[4].getValue(); | |||
} | |||
table.insert(filters, self.filter) | |||
end | |||
function stereoFx.Channel:processBlock(s, smax) | |||
for i = 0,smax do | |||
s[i] = self.filter.process(s[i]) | |||
end | |||
end | |||
local function updateFilters(args) | |||
for _, f in pairs(filters) do | |||
f.update(args) | |||
end | |||
end | |||
params = plugin.manageParams { | |||
-- automatable VST/AU parameters | |||
-- note the new 1.3 way of declaring them | |||
{ | |||
name = "Type"; | |||
type = "list"; | |||
values = {"hp"; "lp"; "bp"; "bs"; "ls"; "hs"; "ap"; "eq"}; | |||
default = "hp"; | |||
changed = function(val) updateFilters{type=val} end; | |||
}; | |||
{ | |||
name = "Frequency"; | |||
min = 10; | |||
max = 20000; | |||
default = 440; | |||
changed = function(val) updateFilters{f=val} end; | |||
}; | |||
{ | |||
name = "Gain"; | |||
min = -30; | |||
max = 30; | |||
default = 0; | |||
changed = function(val) updateFilters{gain=val} end; | |||
}; | |||
{ | |||
name = "Resonance"; | |||
min = 0.1; | |||
max = 30; | |||
default = 1; | |||
changed = function(val) updateFilters{Q=val} end; | |||
}; | |||
} | |||
-- Reset the plugin parameters like this : | |||
-- params.resetToDefaults() |
@@ -0,0 +1,3 @@ | |||
require "include/protoplug" | |||
--Welcome to Lua Protoplug effect (version 1.3.0) |
@@ -0,0 +1,59 @@ | |||
--[[ | |||
name: Delay Line | |||
description: Simple delay line effect with DC removal | |||
author: osar.fr | |||
--]] | |||
require "include/protoplug" | |||
local length, feedback | |||
stereoFx.init() | |||
-- everything is per stereo channel | |||
function stereoFx.Channel:init() | |||
self.buf = ffi.new("double[512]") | |||
self.it = 0 -- iterator | |||
self.dc1, self.dc2 = 0,0 | |||
end | |||
function stereoFx.Channel:goBack() | |||
local nit = self.it-length | |||
if nit<0 then nit = nit+512 end | |||
local o = self.buf[nit] | |||
nit = nit-1 | |||
if nit<0 then nit = nit+512 end | |||
o = o+self.buf[nit] | |||
o = o*0.4992*feedback | |||
return o | |||
end | |||
function stereoFx.Channel:dcRemove(s) | |||
self.dc1 = self.dc1 + (s - self.dc2) * 0.000002 | |||
self.dc2 = self.dc2 + self.dc1 | |||
self.dc1 = self.dc1 * 0.96 | |||
return s-self.dc2 | |||
end | |||
function stereoFx.Channel:processBlock(samples, smax) | |||
for i = 0,smax do | |||
samples[i] = samples[i]+self:dcRemove(samples[i]+self:goBack()) | |||
self.buf[self.it] = samples[i] | |||
self.it = self.it+1 | |||
if self.it>=512 then self.it=0 end | |||
end | |||
end | |||
params = plugin.manageParams { | |||
{ | |||
name = "Length"; | |||
type = "int"; | |||
max = 510; | |||
changed = function(val) length = val end; | |||
}; | |||
{ | |||
name = "Feedback"; | |||
max = 1; | |||
changed = function(val) feedback = val end; | |||
}; | |||
} |
@@ -0,0 +1,37 @@ | |||
--[[ | |||
name: Badass Distortion | |||
description: The one from the website | |||
author: osar.fr | |||
--]] | |||
require "include/protoplug" | |||
local cbFilter = require "include/pac/cookbook filters" | |||
local power | |||
local function dist (x) | |||
if x<0 then return -1*math.pow (-1*x,power) end | |||
return math.pow (x,power) | |||
end | |||
stereoFx.init () | |||
function stereoFx.Channel:init () | |||
-- create per-channel fields (filters) | |||
self.low = cbFilter {type = "lp"; f = 100; gain = 0; Q = 0.3} | |||
self.high = cbFilter {type = "hp"; f = 50; gain = 0; Q = 0.3} | |||
end | |||
function stereoFx.Channel:processBlock (samples, smax) | |||
for i = 0, smax do | |||
local s = dist (self.high.process (samples[i])) | |||
samples[i] = s + self.low.process (samples[i])*2 | |||
end | |||
end | |||
params = plugin.manageParams { | |||
{ | |||
name = "Power"; | |||
min = 1; | |||
max = 0.01; | |||
changed = function (val) power = val end; | |||
}; | |||
} |
@@ -0,0 +1,189 @@ | |||
--[[ | |||
name: Pitch Distort | |||
description: > | |||
graphical pitch distortion, | |||
shifts each frequency band by a different factor | |||
author: osar.fr | |||
--]] | |||
require "include/protoplug" | |||
require "include/Pickle" | |||
stereoFx.init() | |||
fftlib = script.ffiLoad("libfftw3.so.3", "libfftw3-3") | |||
ffi.cdef[[ | |||
typedef double fftw_complex[2]; | |||
void *fftw_plan_dft_r2c_1d(int n, double *in, fftw_complex *out, unsigned int flags); | |||
void *fftw_plan_dft_c2r_1d(int n, fftw_complex *in, double *out, unsigned int flags); | |||
void fftw_execute(void *plan); | |||
]] | |||
-- settings | |||
local fftSize = 1024 -- 1024 seems good | |||
local steps = 8 -- 4=low-fi, 16=high cpu | |||
local xPixels = 400 | |||
local yPixels = 300 | |||
-- useful constants | |||
local lineMax = fftSize | |||
local rescale = 0.5/(fftSize*steps) | |||
local cplxSize = math.floor(fftSize/2+1) | |||
local stepSize = fftSize/steps | |||
local expct = 2*math.pi*stepSize/fftSize; | |||
-- global buffers | |||
local graph = ffi.new ("double[?]", cplxSize) | |||
for i = 0,cplxSize-1 do graph[i] = 0.25 end | |||
local dbuf = ffi.new("double[?]", fftSize) | |||
local spectrum = ffi.new("fftw_complex[?]", cplxSize) | |||
local r2c = fftlib.fftw_plan_dft_r2c_1d(fftSize, dbuf, spectrum, 64) | |||
local c2r = fftlib.fftw_plan_dft_c2r_1d(fftSize, spectrum, dbuf, 64) | |||
local anaMagn = ffi.new("double[?]", cplxSize) | |||
local anaFreq = ffi.new("double[?]", cplxSize) | |||
local synMagn = ffi.new("double[?]", cplxSize) | |||
local synFreq = ffi.new("double[?]", cplxSize) | |||
local hw = ffi.new("double[?]", fftSize) -- Hann window | |||
for i = 0,fftSize-1 do | |||
hw[i] = (1 - math.cos(2*math.pi*i/(fftSize-1)))*rescale | |||
end | |||
local function ApplyWindow (samples) | |||
for i = 0,fftSize-1 do | |||
samples[i] = samples[i] * hw[i] | |||
end | |||
end | |||
-- channel buffers | |||
function stereoFx.Channel:init() | |||
self.inbuf = ffi.new("double[?]", lineMax) | |||
self.outbuf = ffi.new("double[?]", lineMax) | |||
self.bufi = 0 | |||
self.inphase = ffi.new("double[?]", cplxSize) | |||
self.outphase = ffi.new("double[?]", cplxSize) | |||
end | |||
-- filter the "spectrum" global given a channel's phases | |||
local function ApplyFilter (inphase, outphase) | |||
-- setup | |||
for i=0,cplxSize-1 do | |||
synMagn[i] = 0 | |||
synFreq[i] = 0 | |||
end | |||
-- analysis | |||
for i=0,cplxSize-1 do | |||
local real = spectrum[i][0] | |||
local imag = spectrum[i][1] | |||
local magn = 2*math.sqrt(real*real+imag*imag) | |||
local phase = math.atan2(imag, real) | |||
local x = phase - inphase[i] | |||
inphase[i] = phase | |||
x = x - i*expct | |||
x = (x+math.pi)%(math.pi*2)-math.pi | |||
x = steps*x/(2*math.pi) | |||
x = i + x | |||
anaMagn[i] = magn | |||
anaFreq[i] = x | |||
end | |||
-- processing | |||
for i=0,cplxSize-1 do | |||
local shift = graph[i]*2+0.5 | |||
local i2 = math.floor(i*shift) | |||
if i2<cplxSize and i2>0 then | |||
synMagn[i2] = anaMagn[i] + synMagn[i2] | |||
synFreq[i2] = anaFreq[i] * shift | |||
end | |||
end | |||
-- resynthesis | |||
for i=0,cplxSize-1 do | |||
local magn = synMagn[i] | |||
x = synFreq[i] | |||
x = x - i | |||
x = 2*math.pi*x/steps | |||
x = x + i*expct | |||
outphase[i] = outphase[i] + x | |||
local phase = outphase[i] | |||
spectrum[i][0] = magn * math.cos(phase) | |||
spectrum[i][1] = magn * math.sin(phase) | |||
end | |||
end | |||
function wrap (i) | |||
return (i>lineMax-1) and i-lineMax or i | |||
end | |||
function stereoFx.Channel:processBlock(s, smax) | |||
for i = 0,smax do | |||
self.inbuf[self.bufi] = s[i] | |||
s[i] = self.outbuf[self.bufi] | |||
self.outbuf[self.bufi] = 0 | |||
if self.bufi%stepSize==0 then | |||
for j=0,fftSize-1 do | |||
dbuf[j] = self.inbuf[wrap(self.bufi+j)] | |||
end | |||
-- revive cdata (inexplicably required, todo-narrow down the cause): | |||
tostring(dbuf); tostring(spectrum) | |||
fftlib.fftw_execute(r2c) | |||
ApplyFilter (self.inphase, self.outphase) | |||
fftlib.fftw_execute(c2r) | |||
ApplyWindow(dbuf) | |||
for j=0,fftSize-1 do | |||
self.outbuf[wrap(self.bufi+j)] = | |||
self.outbuf[wrap(self.bufi+j)] + dbuf[j] | |||
end | |||
end | |||
self.bufi = wrap(self.bufi+1) | |||
end | |||
end | |||
-- Graphics -- | |||
local Freqgraph = require "include/pac/freqgraph" | |||
local J = require "include/protojuce" | |||
local fg = Freqgraph { | |||
title = "Pitch distortion"; | |||
data = graph; | |||
dataSize = cplxSize; | |||
yAxis = { | |||
name = "shift (%)"; | |||
values = { | |||
[0] = "50"; | |||
[0.25] = "100"; | |||
[0.5] = "150"; | |||
[1] = "250"; | |||
} | |||
} | |||
} | |||
function gui.paint(g) | |||
g:fillAll() | |||
fg:paint(g) | |||
end | |||
-- Save & load -- | |||
local header = "pac pitch distort 1" | |||
function script.loadData(data) | |||
-- check data begins with our header | |||
if string.sub(data, 1, string.len(header)) ~= header then return end | |||
data = unpickle(string.sub(data, string.len(header)+1, -1)) | |||
-- check string was turned into a table without errors | |||
if data==nil then return end | |||
for i=0,cplxSize-1 do | |||
if data[i] ~= nil then | |||
graph[i] = data[i] | |||
end | |||
end | |||
end | |||
function script.saveData() | |||
local picktable = {} | |||
for i=0,cplxSize-1 do | |||
picktable[i] = graph[i] | |||
end | |||
return header..pickle(picktable) | |||
end |
@@ -0,0 +1,157 @@ | |||
--[[ | |||
name: Pitch Shift - Bernsee Algo | |||
description: "Simple" FFT pitch shifter after S.Bernsee's famous article. | |||
author: osar.fr | |||
--]] | |||
require "include/protoplug" | |||
stereoFx.init() | |||
fftlib = script.ffiLoad("libfftw3.so.3", "libfftw3-3") | |||
-- params | |||
local shift = 1 -- param=0.5 -> shift=1.0 (no shift) | |||
-- settings | |||
local fftSize = 1024 -- 1024 seems good | |||
local steps = 8 -- 4=low-fi, 16=high cpu | |||
-- useful constants | |||
local lineMax = fftSize | |||
local rescale = 1/(fftSize*steps) | |||
local cplxSize = math.floor(fftSize/2+1) | |||
local stepSize = fftSize/steps | |||
local expct = 2*math.pi*stepSize/fftSize; | |||
ffi.cdef[[ | |||
typedef double fftw_complex[2]; | |||
void *fftw_plan_dft_r2c_1d(int n, double *in, fftw_complex *out, unsigned int flags); | |||
void *fftw_plan_dft_c2r_1d(int n, fftw_complex *in, double *out, unsigned int flags); | |||
void fftw_execute(void *plan); | |||
]] | |||
-- global buffers | |||
local dbuf = ffi.new("double[?]", fftSize) | |||
local spectrum = ffi.new("fftw_complex[?]", cplxSize) | |||
local anaMagn = ffi.new("double[?]", cplxSize) | |||
local anaFreq = ffi.new("double[?]", cplxSize) | |||
local synMagn = ffi.new("double[?]", cplxSize) | |||
local synFreq = ffi.new("double[?]", cplxSize) | |||
local hw = ffi.new("double[?]", fftSize) -- Hann window | |||
for i = 0,fftSize-1 do | |||
hw[i] = (1 - math.cos(2*math.pi*i/(fftSize-1)))*rescale | |||
end | |||
local function applyWindow (samples) | |||
for i = 0,fftSize-1 do | |||
samples[i] = samples[i] * hw[i] | |||
end | |||
end | |||
-- fftw plans | |||
local r2c = fftlib.fftw_plan_dft_r2c_1d(fftSize, dbuf, spectrum, 64) | |||
local c2r = fftlib.fftw_plan_dft_c2r_1d(fftSize, spectrum, dbuf, 64) | |||
-- per-channel buffers | |||
function stereoFx.Channel:init() | |||
self.inbuf = ffi.new("double[?]", lineMax) | |||
self.outbuf = ffi.new("double[?]", lineMax) | |||
self.bufi = 0 | |||
self.inphase = ffi.new("double[?]", cplxSize) | |||
self.outphase = ffi.new("double[?]", cplxSize) | |||
end | |||
-- shift data already in the "spectrum" global | |||
local function applyFilter (inphase, outphase) | |||
-- setup | |||
for i=0,cplxSize-1 do | |||
synMagn[i] = 0 | |||
synFreq[i] = 0 | |||
end | |||
-- analysis | |||
for i=0,cplxSize-1 do | |||
local real = spectrum[i][0] | |||
local imag = spectrum[i][1] | |||
local magn = 2*math.sqrt(real*real+imag*imag) | |||
local phase = math.atan2(imag, real) | |||
local x = phase - inphase[i] | |||
inphase[i] = phase | |||
x = x - i*expct | |||
x = (x+math.pi)%(math.pi*2)-math.pi | |||
x = steps*x/(2*math.pi) | |||
x = i + x | |||
anaMagn[i] = magn | |||
anaFreq[i] = x | |||
end | |||
-- loop-merging optimization, not sure if useful | |||
if shift>=1 then | |||
for i=0,cplxSize-1 do | |||
shiftAndSynth(i, outphase) | |||
end | |||
else | |||
for i=cplxSize-1,0,-1 do | |||
shiftAndSynth(i, outphase) | |||
end | |||
end | |||
end | |||
function shiftAndSynth(i, outphase) | |||
-- processing | |||
local i2 = math.floor(i*shift+0.5) -- bigger | |||
if i2<cplxSize and i2>0 then -- only for backward | |||
synMagn[i2] = anaMagn[i] + synMagn[i2] | |||
synFreq[i2] = anaFreq[i] * shift | |||
end | |||
-- resynthesis | |||
local magn = synMagn[i] | |||
x = synFreq[i] | |||
x = x - i | |||
x = 2*math.pi*x/steps | |||
x = x + i*expct | |||
outphase[i] = outphase[i] + x | |||
local phase = outphase[i] | |||
spectrum[i][0] = magn * math.cos(phase) | |||
spectrum[i][1] = magn * math.sin(phase) | |||
end | |||
function wrap (i) | |||
return (i>lineMax-1) and i-lineMax or i | |||
end | |||
function stereoFx.Channel:processBlock(s, smax) | |||
for i = 0,smax do | |||
self.inbuf[self.bufi] = s[i] | |||
s[i] = self.outbuf[self.bufi] | |||
self.outbuf[self.bufi] = 0 | |||
if self.bufi%stepSize==0 then | |||
for j=0,fftSize-1 do | |||
dbuf[j] = self.inbuf[wrap(self.bufi+j)] | |||
end | |||
-- revive cdata (inexplicably required, todo narrow down the cause): | |||
tostring(dbuf); tostring(spectrum) | |||
fftlib.fftw_execute(r2c) | |||
applyFilter (self.inphase, self.outphase) | |||
fftlib.fftw_execute(c2r) | |||
applyWindow(dbuf) | |||
for j=0,fftSize-1 do | |||
self.outbuf[wrap(self.bufi+j)] = | |||
self.outbuf[wrap(self.bufi+j)] + dbuf[j] | |||
end | |||
end | |||
self.bufi = wrap(self.bufi+1) | |||
end | |||
end | |||
plugin.manageParams { | |||
{ | |||
name = "Shift"; | |||
changed = function(val) | |||
if val<0.5 then | |||
shift = (val+0.1)/0.6 | |||
else | |||
shift = val*8-3 | |||
end | |||
end; | |||
}; | |||
} |
@@ -0,0 +1,135 @@ | |||
--[[ | |||
name: Spectral Filter | |||
description: graphical spectral filter using fftw | |||
author: osar.fr | |||
--]] | |||
require "include/protoplug" | |||
require "include/Pickle" | |||
stereoFx.init() | |||
-- settings (change these here) | |||
local fftSize = 512 | |||
local xPixels = 400 | |||
local yPixels = 300 | |||
-- open FFTW and define the stuff we need | |||
fftlib = script.ffiLoad("libfftw3.so.3", "libfftw3-3") | |||
ffi.cdef[[ | |||
typedef double fftw_complex[2]; | |||
void *fftw_plan_dft_r2c_1d(int n, double *in, fftw_complex *out, unsigned int flags); | |||
void *fftw_plan_dft_c2r_1d(int n, fftw_complex *in, double *out, unsigned int flags); | |||
void fftw_execute(void *plan); | |||
]] | |||
-- useful constants | |||
local stepSize = math.floor(fftSize/2) | |||
local cplxSize = stepSize+1 | |||
local rescale = 1/fftSize-- no /2 because we use 200% as max | |||
-- global buffers : actual filter and Hann window | |||
local graph = ffi.new ("double[?]", cplxSize) | |||
for i = 0,cplxSize-2 do graph[i] = 0.5 end | |||
graph[cplxSize-1] = 0 -- no one wants DC | |||
local hw = ffi.new("double[?]", fftSize) | |||
for i = 0,fftSize-1 do | |||
hw[i] = (1 - math.cos(2*math.pi*i/(fftSize-1)))*rescale | |||
end | |||
local function applyFilter (spectrum) | |||
for i=0,cplxSize-1 do | |||
spectrum[i][0] = spectrum[i][0]*graph[i] -- real | |||
spectrum[i][1] = spectrum[i][1]*graph[i] -- imaginary | |||
-- do more interesting stuff here :) | |||
end | |||
end | |||
local function applyWindow (samples) | |||
for i = 0,fftSize-1 do | |||
samples[i] = samples[i] * hw[i] | |||
end | |||
end | |||
-- global working buffers and their fftw plans | |||
local samples = ffi.new("double[?]", fftSize) | |||
local spectrum = ffi.new("fftw_complex[?]", cplxSize) | |||
local r2c = fftlib.fftw_plan_dft_r2c_1d(fftSize, samples, spectrum, 64) | |||
local c2r = fftlib.fftw_plan_dft_c2r_1d(fftSize, spectrum, samples, 64) | |||
-- per-channel buffers | |||
function stereoFx.Channel:init() | |||
self.inbuf = ffi.new("double[?]", fftSize) | |||
self.outbuf = ffi.new("double[?]", fftSize) | |||
self.bufi = 0 | |||
end | |||
local function wrap (i) | |||
return (i>fftSize-1) and i-fftSize or i | |||
end | |||
function stereoFx.Channel:processBlock(s, smax) | |||
for i = 0,smax do | |||
self.inbuf[self.bufi] = s[i] | |||
s[i] = self.outbuf[self.bufi] | |||
self.outbuf[self.bufi] = 0 | |||
if self.bufi%stepSize==0 then | |||
for j=0,fftSize-1 do | |||
samples[j] = self.inbuf[wrap(self.bufi+j)] | |||
end | |||
-- revive cdata (inexplicably required, todo narrow down the cause): | |||
tostring(samples); tostring(spectrum) | |||
fftlib.fftw_execute(r2c) | |||
applyFilter (spectrum) | |||
fftlib.fftw_execute(c2r) | |||
applyWindow(samples) | |||
for j=0,fftSize-1 do | |||
self.outbuf[wrap(self.bufi+j)] = | |||
self.outbuf[wrap(self.bufi+j)] + samples[j] | |||
end | |||
end | |||
self.bufi = wrap(self.bufi+1) | |||
end | |||
end | |||
-- Graphics -- | |||
local Freqgraph = require "include/pac/freqgraph" | |||
local J = require "include/protojuce" | |||
local fg = Freqgraph { | |||
title = "Spectral Filter"; | |||
data = graph; | |||
dataSize = cplxSize-1; -- don't touch the last partial (DC) | |||
} | |||
function gui.paint(g) | |||
g:fillAll() | |||
fg:paint(g) | |||
end | |||
-- Save & load -- | |||
local header = "pac spectral filter 1" | |||
function script.loadData(data) | |||
-- check data begins with our header | |||
if string.sub(data, 1, string.len(header)) ~= header then return end | |||
data = unpickle(string.sub(data, string.len(header)+1, -1)) | |||
-- check string was turned into a table without errors | |||
if data==nil then return end | |||
for i=0,cplxSize-1 do | |||
if data[i] ~= nil then | |||
graph[i] = data[i] | |||
end | |||
end | |||
end | |||
function script.saveData() | |||
local picktable = {} | |||
for i=0,cplxSize-1 do | |||
picktable[i] = graph[i] | |||
end | |||
return header..pickle(picktable) | |||
end |
@@ -0,0 +1,3 @@ | |||
require "include/protoplug" | |||
--Welcome to Lua Protoplug generator (version 1.3.0) |
@@ -0,0 +1,111 @@ | |||
--[[ | |||
name: FFT sweeper | |||
description: testing | |||
author: osar.fr | |||
--]] | |||
require "include/protoplug" | |||
fftlib = script.ffiLoad("libfftw3.so.3", "libfftw3-3") | |||
ffi.cdef[[ | |||
typedef enum { | |||
FFTW_R2HC=0, FFTW_HC2R=1, FFTW_DHT=2, | |||
FFTW_REDFT00=3, FFTW_REDFT01=4, FFTW_REDFT10=5, FFTW_REDFT11=6, | |||
FFTW_RODFT00=7, FFTW_RODFT01=8, FFTW_RODFT10=9, FFTW_RODFT11=10 | |||
} fftw_r2r_kind; | |||
void *fftw_plan_r2r_1d(int n, double *in, double *out, fftw_r2r_kind kind, unsigned int flags); | |||
void fftw_execute(void *plan); | |||
]] | |||
fftsz = 1024 | |||
winsz = 1000 | |||
fd = ffi.new("double[?]", fftsz) -- halfcomplex freq domain | |||
td1 = ffi.new("double[?]", fftsz) -- time domain | |||
td2 = ffi.new("double[?]", fftsz) -- time domain (alternating) | |||
hw = ffi.new("double[?]", fftsz) -- Hann window function | |||
plan1 = fftlib.fftw_plan_r2r_1d(fftsz, fd, td1, 1, 64) | |||
plan2 = fftlib.fftw_plan_r2r_1d(fftsz, fd, td2, 1, 64) | |||
-- prepare Hann window | |||
for i = 0,winsz-1 do | |||
hw[i] = 0.00003 * (1 - math.cos(2*math.pi*i/(winsz-1))); | |||
end | |||
function ApplyWindow (buf) | |||
for i = 0,winsz-1 do | |||
buf[i] = buf[i] * hw[i] | |||
end | |||
end | |||
cphase = 0 | |||
gapper = 0 | |||
function FillFD (buf) | |||
local center = math.sin(cphase)*10+15 | |||
gapper = gapper+1 | |||
if gapper > 1 then gapper = 0 end | |||
if gapper > 0 then | |||
--for i = 0,fftsz-1 do | |||
-- buf[i] = 0 | |||
--end | |||
--return | |||
center = center*4 | |||
end | |||
for i = 0,fftsz-1 do | |||
local sharm = math.sin(i-center) | |||
local x = i/(fftsz*0.0004883) | |||
buf[i] = 10000/((x-center)*(x-center)+10)*sharm*sharm | |||
buf[i] = buf[i] + 33457/((x-center*8)*(x-center*8)+1000) | |||
buf[i] = buf[i] + 34321/((x-center*12)*(x-center*12)+1000) | |||
--buf[i] = buf[i] + 100/((i-center*2)*(i-center*2)+1) | |||
--buf[i] = buf[i] + 10/((i-center*4)*(i-center*4)+1) | |||
--if i<center then buf[i] = 0 end | |||
if i%5==1 then buf[i] = buf[i]*0.1 end | |||
if i%3==1 then buf[i] = buf[i]*-1 end | |||
if buf[i] > 10 then buf[i] = 10 end | |||
end | |||
cphase = cphase + 0.01 | |||
end | |||
FillFD(fd) | |||
fftlib.fftw_execute(plan1) | |||
fftlib.fftw_execute(plan2) | |||
ApplyWindow(td1) | |||
ApplyWindow(td2) | |||
tdpos1 = 0 | |||
tdpos2 = winsz*0.5 | |||
alt1 = false | |||
alt2 = false | |||
function plugin.processBlock(s, smax) | |||
for i = 0,smax do | |||
s[0][i] = td1[tdpos1] + td2[tdpos2] | |||
s[1][i] = td1[tdpos1] + td2[tdpos2] | |||
tdpos1 = tdpos1+1 | |||
tdpos2 = tdpos2+1 | |||
if tdpos1 >= winsz then | |||
tdpos1 = 0 | |||
if alt1 then | |||
alt1 = false | |||
FillFD(fd) | |||
fftlib.fftw_execute(plan1) | |||
ApplyWindow(td1) | |||
else | |||
alt1 = true | |||
end | |||
end | |||
if tdpos2 >= winsz then | |||
tdpos2 = 0 | |||
if alt2 then | |||
alt2 = false | |||
FillFD(fd) | |||
fftlib.fftw_execute(plan2) | |||
ApplyWindow(td2) | |||
else | |||
alt2 = true | |||
end | |||
end | |||
end | |||
return 1 | |||
end |
@@ -0,0 +1,61 @@ | |||
-- outputs a stream of semi-chaotic notes on MIDI channel 1 | |||
require "include/protoplug" | |||
--Welcome to Lua Protoplug generator (version 1.0.0) | |||
x=0 | |||
function plugin.processBlock(samples, smax, midiBuf) | |||
newEvents = {} | |||
if not interval then updateInterval() end | |||
if not i then i = interval + 1 end | |||
for s=0,smax do | |||
if i>=interval then | |||
local f1,v1 = magic(x) | |||
local f2 = magic(x-5) | |||
if f1 then noteOn(f1, v1) end | |||
if f1 then noteOn(f1-5, v1) end | |||
if f2 then noteOff(f2) end | |||
if f2 then noteOff(f2-5) end | |||
i = 0 | |||
x = x + 1 | |||
end | |||
i = i + 1 | |||
end | |||
midiBuf:clear() | |||
if #newEvents>0 then | |||
for _,e in ipairs(newEvents) do | |||
midiBuf:addEvent(e) | |||
end | |||
end | |||
end | |||
function noteOn(n,v) | |||
if n>100 then return end | |||
table.insert(newEvents, midi.Event.noteOn(1, n, v)) | |||
end | |||
function noteOff(n) | |||
table.insert(newEvents, midi.Event.noteOff(1, n, 0)) | |||
end | |||
function magic(x) | |||
if ((x%19)%11)%4==0 then | |||
return 40+x%((x/6)%8+2)*8, 20+((x/6)%8+2)*8 | |||
end | |||
end | |||
function updateInterval() | |||
local int = params[1].getValue() | |||
bpm = plugin.getCurrentPosition().bpm | |||
interval = math.floor((plugin.getSampleRate()*int)/(bpm)) | |||
end | |||
params = plugin.manageParams { | |||
{ | |||
name = "Interval"; | |||
type = "int"; | |||
min = 3; | |||
max = 30; | |||
default = 60; | |||
changed = function(val) interval = nil end; | |||
}; | |||
} |
@@ -0,0 +1,49 @@ | |||
--[[ | |||
name: midi chordify | |||
description: MIDI processor VST/AU. Notes go in, chords come out. | |||
author: osar.fr | |||
--]] | |||
require "include/protoplug" | |||
-- what kind of chord ? | |||
local chordStructure = {0, 3, 5, 7, 11} | |||
local blockEvents = {} | |||
function plugin.processBlock(samples, smax, midiBuf) | |||
blockEvents = {} | |||
-- analyse midi buffer and prepare a chord for each note | |||
for ev in midiBuf:eachEvent() do | |||
if ev:isNoteOn() then | |||
chordOn(ev) | |||
elseif ev:isNoteOff() then | |||
chordOff(ev) | |||
end | |||
end | |||
-- fill midi buffer with prepared notes | |||
midiBuf:clear() | |||
if #blockEvents>0 then | |||
for _,e in ipairs(blockEvents) do | |||
midiBuf:addEvent(e) | |||
end | |||
end | |||
end | |||
function chordOn(root) | |||
for _, offset in ipairs(chordStructure) do | |||
local newEv = midi.Event.noteOn( | |||
root:getChannel(), | |||
root:getNote()+offset, | |||
root:getVel()) | |||
table.insert(blockEvents, newEv) | |||
end | |||
end | |||
function chordOff(root) | |||
for _, offset in ipairs(chordStructure) do | |||
local newEv = midi.Event.noteOff( | |||
root:getChannel(), | |||
root:getNote()+offset) | |||
table.insert(blockEvents, newEv) | |||
end | |||
end |
@@ -0,0 +1,45 @@ | |||
--[[ | |||
name: sine organ | |||
description: A simple organ-like sinewave VST/AU. | |||
author: osar.fr | |||
--]] | |||
require "include/protoplug" | |||
local release = 10000 | |||
local decayRate = 1/release | |||
polyGen.initTracks(8) | |||
function polyGen.VTrack:init() | |||
-- create per-track fields here | |||
self.phase = 0 | |||
self.releasePos = release | |||
end | |||
function polyGen.VTrack:addProcessBlock(samples, smax) | |||
local amp = 1 | |||
for i = 0,smax do | |||
if not self.noteIsOn then | |||
-- release is finished : idle track | |||
if self.releasePos>=release then break end | |||
-- release is under way | |||
amp = 1-self.releasePos*decayRate | |||
self.releasePos = self.releasePos+1 | |||
end | |||
self.phase = self.phase + (self.noteFreq*math.pi*2) | |||
-- math.sin is slow but once per sample is no tragedy | |||
local trackSample = math.sin(self.phase)*amp*0.3 | |||
samples[0][i] = samples[0][i] + trackSample -- left | |||
samples[1][i] = samples[1][i] + trackSample -- right | |||
end | |||
end | |||
function polyGen.VTrack:noteOff(note, ev) | |||
self.releasePos = 0 | |||
end | |||
function polyGen.VTrack:noteOn(note, vel, ev) | |||
-- start the sinewave at 0 for a clickless attack | |||
self.phase = 0 | |||
end |
@@ -0,0 +1,47 @@ | |||
--[[ | |||
name: sinemouse demo | |||
description: > | |||
Custom GUI demonstration : Drag your mouse around in the | |||
frame to control the sine wave's amplitude and frequency. | |||
author: osar.fr | |||
--]] | |||
require "include/protoplug" | |||
local freq,amp = 440, 0 | |||
local delta, phase = 0.06, 0 | |||
function plugin.processBlock(samples, smax) | |||
for i=0,smax do | |||
local s = math.sin(phase)*amp | |||
samples[0][i] = s -- left | |||
samples[1][i] = s -- right | |||
phase = phase + delta | |||
end | |||
end | |||
local J = juce | |||
local frame = J.Rectangle_int(20,20,400,300) | |||
local sideways = J.AffineTransform():rotated(math.pi*0.5) | |||
function gui.paint(g) | |||
g:fillAll() | |||
g:setColour(J.Colour.green) | |||
g:drawRect(frame) | |||
g:drawText("Frequency", 20, 320, 400, 20, J.Justification.centred) | |||
g:addTransform(sideways) | |||
g:drawText("amplitude", 20, -440, 300, 20, J.Justification.centred) | |||
end | |||
local function mouseHandler(event) | |||
if not frame:contains(J.Point(event.x,event.y)) then | |||
return | |||
end | |||
freq = event.x + 80 | |||
amp = (320-event.y)/300 | |||
local sr = plugin.isSampleRateKnown() and plugin.getSampleRate() or 44100 | |||
delta = 2*math.pi*freq/sr | |||
end | |||
gui.addHandler("mouseDrag", mouseHandler) | |||
gui.addHandler("mouseDown", mouseHandler) |
@@ -0,0 +1,39 @@ | |||
--[[ | |||
name: soundfile test | |||
description: A simple demo that plays an audio file. | |||
author: osar.fr | |||
--]] | |||
require "include/protoplug" | |||
local path = "C:\\temp\\pluck44.wav" | |||
local wave, len | |||
-- 'prepareToPlay' will be triggered when the host sample rate is known, | |||
-- so we can load sound files with automatic sample rate conversion: | |||
plugin.addHandler('prepareToPlay', function() | |||
local readr = juce.AudioFormatReader(path) | |||
if readr==nil then error ("can't open wave: "..path) end | |||
wave, len = readr:readToFloat(2) -- require 2 channels | |||
end) | |||
polyGen.initTracks(8) | |||
function polyGen.VTrack:noteOn(note, vel, ev) | |||
self.playing = true | |||
self.wavepos = 0 | |||
end | |||
function polyGen.VTrack:noteOff(note, ev) | |||
self.playing = false | |||
end | |||
function polyGen.VTrack:addProcessBlock(samples, smax) | |||
for i = 0,smax do | |||
if self.playing and self.wavepos < len then | |||
self.wavepos = self.wavepos + 1 | |||
samples[0][i] = samples[0][i] + wave[0][self.wavepos] -- left | |||
samples[1][i] = samples[1][i] + wave[1][self.wavepos] -- right | |||
end | |||
end | |||
end |
@@ -0,0 +1,88 @@ | |||
---------------------------------------------- | |||
-- Pickle.lua | |||
-- A table serialization utility for lua | |||
-- Steve Dekorte, http://www.dekorte.com, Apr 2000 | |||
-- Freeware | |||
---------------------------------------------- | |||
function pickle(t) | |||
return Pickle:clone():pickle_(t) | |||
end | |||
Pickle = { | |||
clone = function (t) | |||
local nt={}; | |||
for i, v in pairs(t) do | |||
nt[i]=v | |||
end | |||
return nt | |||
end | |||
} | |||
function Pickle:pickle_(root) | |||
if type(root) ~= "table" then | |||
error("can only pickle tables, not ".. type(root).."s") | |||
end | |||
self._tableToRef = {} | |||
self._refToTable = {} | |||
local savecount = 0 | |||
self:ref_(root) | |||
local s = "" | |||
while table.getn(self._refToTable) > savecount do | |||
savecount = savecount + 1 | |||
local t = self._refToTable[savecount] | |||
s = s.."{\n" | |||
for i, v in pairs(t) do | |||
s = string.format("%s[%s]=%s,\n", s, self:value_(i), self:value_(v)) | |||
end | |||
s = s.."},\n" | |||
end | |||
return string.format("{%s}", s) | |||
end | |||
function Pickle:value_(v) | |||
local vtype = type(v) | |||
if vtype == "string" then return string.format("%q", v) | |||
elseif vtype == "number" then return v | |||
elseif vtype == "table" then return "{"..self:ref_(v).."}" | |||
else --error("pickle a "..type(v).." is not supported") | |||
end | |||
end | |||
function Pickle:ref_(t) | |||
local ref = self._tableToRef[t] | |||
if not ref then | |||
if t == self then error("can't pickle the pickle class") end | |||
table.insert(self._refToTable, t) | |||
ref = table.getn(self._refToTable) | |||
self._tableToRef[t] = ref | |||
end | |||
return ref | |||
end | |||
---------------------------------------------- | |||
-- unpickle | |||
---------------------------------------------- | |||
function unpickle(s) | |||
if type(s) ~= "string" then | |||
error("can't unpickle a "..type(s)..", only strings") | |||
end | |||
local gentables = loadstring("return "..s) | |||
local tables = gentables() | |||
for tnum = 1, table.getn(tables) do | |||
local t = tables[tnum] | |||
local tcopy = {}; for i, v in pairs(t) do tcopy[i] = v end | |||
for i, v in pairs(tcopy) do | |||
local ni, nv | |||
if type(i) == "table" then ni = tables[i[1]] else ni = i end | |||
if type(v) == "table" then nv = tables[v[1]] else nv = v end | |||
t[i] = nil | |||
t[ni] = nv | |||
end | |||
end | |||
return tables[1] | |||
end |
@@ -0,0 +1,268 @@ | |||
--- Use `gui` to define your script's custom graphical user interface. | |||
-- Custom GUI example : @{sinemouse-demo.lua} | |||
-- | |||
-- The `gui` global is available to every protoplug script after including the | |||
-- main protoplug header : | |||
-- require "include/protoplug" | |||
-- @module gui | |||
local gui = {} | |||
--- Focus change causes. | |||
-- Values received by the `focusGained` and `focusLost` handlers. | |||
-- @see gui.addHandler | |||
-- @table FocusCause | |||
gui.FocusCause = | |||
{ | |||
focusChangedByMouseClick = 0; -- 0 | |||
focusChangedByTabKey = 1; -- 1 | |||
focusChangedDirectly = 2; -- 2 | |||
}; | |||
--- Keyboard and mouse modifiers. | |||
-- Contained in every @{gui.MouseEvent} and received by the | |||
-- `modifierKeysChanged` handler. | |||
-- @table ModifierKeys | |||
gui.ModifierKeys = | |||
{ | |||
noModifiers = 0; -- 0 | |||
shiftModifier = 1; -- 1 | |||
ctrlModifier = 2; -- 2 | |||
altModifier = 4; -- 4 | |||
leftButtonModifier = 16; -- 16 | |||
rightButtonModifier = 32; -- 32 | |||
middleButtonModifier = 64; -- 64 | |||
commandModifier = 8; -- 8 | |||
ctrlAltCommandModifiers = 14; -- 14 | |||
}; | |||
local script = require "include/core/script" | |||
--[[--- Add a handler for a GUI event. | |||
Here's a list of the events and their parameters, showing how they | |||
should be received : | |||
gui.addHandler("resized", function() ... end) | |||
gui.addHandler("focusGained", function(focusCause) ... end) | |||
gui.addHandler("focusLost", function(focusCause) ... end) | |||
gui.addHandler("modifierKeysChanged", function(modifierKeys) ... end) | |||
gui.addHandler("mouseMove", function(mouseEvent) ... end) | |||
gui.addHandler("mouseEnter", function(mouseEvent) ... end) | |||
gui.addHandler("mouseExit", function(mouseEvent) ... end) | |||
gui.addHandler("mouseDown", function(mouseEvent) ... end) | |||
gui.addHandler("mouseDrag", function(mouseEvent) ... end) | |||
gui.addHandler("mouseUp", function(mouseEvent) ... end) | |||
gui.addHandler("mouseDoubleClick", function(mouseEvent) ... end) | |||
gui.addHandler("mouseWheelMove", function(mouseEvent, mouseWheelDetails) ... end) | |||
gui.addHandler("keyPressed", function(keyPress, srcComponent) ... end) | |||
gui.addHandler("keyStateChanged", function(keyPress, srcComponent) ... end) | |||
Parameters received by the event handlers are of | |||
type @{FocusCause}, @{ModifierKeys}, @{MouseEvent}, @{MouseWheelDetails}, | |||
and @{KeyPress}. | |||
@see script.addHandler | |||
@see plugin.addHandler | |||
@tparam string event the event to handle | |||
@tparam function handler a function to add the event's handlers | |||
--]] | |||
function gui.addHandler(event, handler) | |||
if not gui[event] then gui[event] = {} end | |||
table.insert(gui[event], handler) | |||
end | |||
-- assumes handler existence already checked | |||
local function gui_emit(event, ...) | |||
for _,v in ipairs(gui[event]) do | |||
v(...) | |||
end | |||
end | |||
-- returns nil if no handler (prevents useless definitions) | |||
local function gui_getEmitter(event) | |||
if not gui[event] then return end | |||
return function (...) | |||
gui_emit(event, ...) | |||
end | |||
end | |||
script.addHandler("init", function () | |||
--- Override to paint a custom GUI. | |||
-- Define this function to paint something in the custom GUI space. | |||
-- @tparam juce.Graphics g a JUCE graphics target | |||
-- @function gui.paint | |||
if type(gui.paint) == "function" then | |||
function gui_paint(g) | |||
g = ffi.typeof("pGraphics")(g) | |||
gui.paint(g) | |||
end | |||
end | |||
gui_resized = gui_getEmitter("resized") | |||
gui_focusGained = gui_getEmitter("focusGained") | |||
gui_focusLost = gui_getEmitter("focusLost") | |||
gui_modifierKeysChanged = gui_getEmitter("modifierKeysChanged") | |||
-- event overrides with ffi conversion | |||
if gui.mouseMove then | |||
function gui_mouseMove(event) | |||
event = ffi.typeof("MouseEvent*")(event) | |||
gui_emit("mouseMove",event) | |||
end | |||
end | |||
if gui.mouseEnter then | |||
function gui_mouseEnter(event) | |||
event = ffi.typeof("MouseEvent*")(event) | |||
gui_emit("mouseEnter", event) | |||
end | |||
end | |||
if gui.mouseExit then | |||
function gui_mouseExit(event) | |||
event = ffi.typeof("MouseEvent*")(event) | |||
gui_emit("mouseExit", event) | |||
end | |||
end | |||
if gui.mouseDown then | |||
function gui_mouseDown(event) | |||
event = ffi.typeof("MouseEvent*")(event) | |||
gui_emit("mouseDown", event) | |||
end | |||
end | |||
if gui.mouseDrag then | |||
function gui_mouseDrag(event) | |||
event = ffi.typeof("MouseEvent*")(event) | |||
gui_emit("mouseDrag", event) | |||
end | |||
end | |||
if gui.mouseUp then | |||
function gui_mouseUp(event) | |||
event = ffi.typeof("MouseEvent*")(event) | |||
gui_emit("mouseUp", event) | |||
end | |||
end | |||
if gui.mouseDoubleClick then | |||
function gui_mouseDoubleClick(event) | |||
event = ffi.typeof("MouseEvent*")(event) | |||
gui_emit("mouseDoubleClick", event) | |||
end | |||
end | |||
if gui.mouseWheelMove then | |||
function gui_mouseWheelMove(event, wheel) | |||
event = ffi.typeof("MouseEvent*")(event) | |||
wheel = ffi.typeof("MouseWheelDetails*")(wheel) | |||
gui_emit("mouseWheelMove", event, wheel) | |||
end | |||
end | |||
if gui.keyPressed then | |||
function gui_keyPressed(key, component) | |||
key = ffi.typeof("KeyPress*")(key) | |||
component = ffi.typeof("pComponent")(component) | |||
gui_emit("keyPressed", key, component) | |||
return true | |||
end | |||
end | |||
if gui.keyStateChanged then | |||
function gui_keyStateChanged(isKeyDown, component) | |||
component = ffi.typeof("pComponent")(component) | |||
gui_emit("keyStateChanged", isKeyDown, component) | |||
return true | |||
end | |||
end | |||
end) | |||
gui.ppcomponent = ffi.typeof("pComponent*")(gui_component) | |||
--- Get GUI Component. | |||
-- @return the current GUI component, or `nil` if the GUI | |||
-- has not been opened yet. | |||
function gui.getComponent() | |||
if gui.ppcomponent[0].pointer~=nil then | |||
return gui.ppcomponent[0] | |||
end | |||
end | |||
--- Mouse Event. | |||
-- A mouse event as received by GUI handlers (see @{gui.addHandler}) | |||
-- <br><br> | |||
-- @type gui.MouseEvent | |||
--- X. | |||
-- @field MouseEvent.x | |||
--- Y. | |||
-- @field MouseEvent.y | |||
--- Modifier keys. | |||
-- Values defined in @{gui.ModifierKeys} | |||
-- @field MouseEvent.mods | |||
--- Event component. | |||
-- @field MouseEvent.eventComponent | |||
--- Original component. | |||
-- @field MouseEvent.originalComponent | |||
--- Time. | |||
-- @field MouseEvent.eventTime | |||
--- Mouse down time. | |||
-- @field MouseEvent.mouseDownTime | |||
--- Mouse down position. | |||
-- @field MouseEvent.mouseDownPos | |||
--- Number of clicks. | |||
-- @field MouseEvent.numberOfClicks | |||
--- Was moved since mouse down. | |||
-- @field MouseEvent.wasMovedSinceMouseDown | |||
--- Mouse Wheel Details. | |||
-- As received by the `mouseWheelMove` handler (see @{gui.addHandler}) | |||
-- <br><br> | |||
-- @type gui.MouseWheelDetails | |||
--- X delta. | |||
-- @field MouseWheelDetails.deltaX | |||
--- Y delta. | |||
-- @field MouseWheelDetails.deltaY | |||
--- Is reversed. | |||
-- @field MouseWheelDetails.isReversed | |||
--- Is smooth. | |||
-- @field MouseWheelDetails.isSmooth | |||
--- Key Press. | |||
-- As received by the `keyPressed` and `keyStateChanged` handlers (see @{gui.addHandler}) | |||
-- <br><br> | |||
-- @type gui.KeyPress | |||
--- Key code. | |||
-- (undecipherable for now) | |||
-- @field KeyPress.keyCode | |||
--- Modifier Keys. | |||
-- @field KeyPress.mods | |||
--- Text character. | |||
-- @field KeyPress.textCharacter | |||
return gui |
@@ -0,0 +1,162 @@ | |||
-- Manage Params | |||
-- takes a list of parameter descriptions and manages all the parameter overrides. | |||
--[[ example usage : | |||
params = plugin.manageParams { | |||
Harshness = { | |||
max = 510; | |||
changed = function(val) DoSomethingWithNewValue(val) end; | |||
}; | |||
["Wave Style"] = { | |||
type = "list"; | |||
values = {"peaky"; "siney"; "wavey"}; | |||
changed = function(val) myVar = var end; | |||
}; | |||
} | |||
--]] | |||
local util = require "include/luautil" | |||
local script = require "include/core/script" | |||
local paramConstructors = | |||
{ | |||
double = function(param) | |||
param.min = param.min or 0 | |||
param.max = param.max or 1 | |||
param.showDecimals = param.showDecimals or 4 | |||
param.getText = function() | |||
return tostring( | |||
util.roundDecimal( | |||
plugin.getParameter(param.index)*(param.max-param.min)+param.min | |||
,param.showDecimals) | |||
) | |||
end | |||
param.getValue = function() | |||
return plugin.getParameter(param.index)*(param.max-param.min)+param.min | |||
end | |||
param.Value2Raw = function(val) | |||
return (val-param.min)/(param.max-param.min) | |||
end | |||
return param | |||
end; | |||
int = function(param) | |||
param.min = param.min or 0 | |||
param.max = param.max or 127 | |||
param.getText = function() | |||
return tostring( | |||
math.floor(plugin.getParameter(param.index)*(param.max-param.min)+param.min) | |||
) | |||
end | |||
param.getValue = function() | |||
return math.floor(plugin.getParameter(param.index)*(param.max-param.min)+param.min) | |||
end | |||
param.Value2Raw = function(val) | |||
return (val-param.min)/(param.max-param.min) | |||
end | |||
return param | |||
end; | |||
list = function(param) | |||
param.getText = function() | |||
local i = plugin.getParameter(param.index)*(#param.values-0.1)+1 | |||
return tostring(param.values[math.floor(i)]) | |||
end | |||
param.getValue = function() | |||
local i = plugin.getParameter(param.index)*(#param.values-0.1)+1 | |||
return param.values[math.floor(i)] | |||
end | |||
param.getKey = function() | |||
return plugin.getParameter(param.index)*(#param.values-0.1)+1 | |||
end | |||
param.Value2Raw = function(val) | |||
for k,v in ipairs(param.values) do | |||
if v==val then | |||
return (k-1)/(#param.values-0.5) | |||
end | |||
end | |||
error ("value "..val.." not in value list for "..param.key) | |||
end | |||
return param | |||
end; | |||
} | |||
return function(args) | |||
local params = {} | |||
local index2param = {} | |||
for key, param in pairs(args) do | |||
param.type = param.type or "double" | |||
param.index = key - 1 | |||
param = paramConstructors[param.type](param) | |||
if type(param.name) ~= "string" then | |||
param.name = ("Param %i (%s)"):format(param.index, param.type) | |||
end | |||
param.set = function(val) | |||
plugin.setParameter(param.index, param.Value2Raw(val)) | |||
param.changed(param.getValue()) | |||
end | |||
params[key] = param | |||
index2param[param.index] = param | |||
end | |||
function plugin.getParameterName(index) | |||
local param = index2param[index] | |||
if param then | |||
return param.name | |||
end | |||
end | |||
function plugin.getParameterText(index) | |||
local param = index2param[index] | |||
if param then | |||
return param.getText() | |||
end | |||
end | |||
function plugin.parameterText2Double(index, text) | |||
local param = index2param[index] | |||
if param then | |||
return param.Value2Raw(text) | |||
end | |||
end | |||
function plugin.paramChanged(index) | |||
local param = index2param[index] | |||
if param and param.changed then | |||
param.changed(param.getValue()) | |||
end | |||
end | |||
local function iter (params, cur) | |||
local k,v = next(params, cur) | |||
while v and type(v)~="table" do | |||
k,v = next(params, k) | |||
end | |||
return k, v | |||
end | |||
function params.each() | |||
return iter, params, nil | |||
end | |||
function params.resetToDefaults() | |||
for key, param in pairs(args) do | |||
if type(param)=="table" then | |||
plugin.setParameter(param.index, param.Value2Raw(param.default)) | |||
param.changed(param.getValue()) | |||
end | |||
end | |||
end | |||
script.addHandler("init", function () | |||
for key, param in params.each() do | |||
param.changed(param.getValue()) | |||
end | |||
end) | |||
return params; | |||
end |
@@ -0,0 +1,379 @@ | |||
--- `midi` contains MIDI-related classes and functions. | |||
-- Example of receiving MIDI input : @{sine-organ.lua}. | |||
-- | |||
-- Example of producing MIDI output : @{midi-chordify.lua}. | |||
-- | |||
-- The `midi` global is available to every protoplug script after including the | |||
-- main protoplug header : | |||
-- require "include/protoplug" | |||
-- @module midi | |||
-- Bitte ein BitOp | |||
local bnot = bit.bnot | |||
local band, bor, bxor = bit.band, bit.bor, bit.bxor | |||
local lshift, rshift, rol = bit.lshift, bit.rshift, bit.rol | |||
ffi.cdef [[ | |||
typedef struct pMidiBuffer | |||
{ void *pointer; } pMidiBuffer; | |||
uint8_t *MidiBuffer_getDataPointer(pMidiBuffer mb); | |||
int MidiBuffer_getDataSize(pMidiBuffer mb); | |||
void MidiBuffer_resizeData(pMidiBuffer mb, int size); | |||
// artist's rendition of the juce::MidiBuffer internal format | |||
// ("don't write code that relies on it!" -Jules) | |||
typedef struct MidiEvent | |||
{ | |||
int32_t time; | |||
const uint16_t dataSize; | |||
uint8_t data[?]; | |||
} MidiEvent; | |||
]] | |||
local midi = {} | |||
--- Convert a MIDI note number to frequency. | |||
-- Call this function to get a note's frequency. | |||
-- @param note the MIDI note (0-127) | |||
-- @return the frequency in samples^-1 | |||
-- @function midi.noteToFreq | |||
function midi.noteToFreq(n) | |||
return 2^((n-69)/12)*440/plugin.getSampleRate() | |||
end | |||
--- Midi Event List. | |||
-- A buffer containing midi events, as received by @{plugin.processBlock} | |||
-- <br><br> | |||
-- @type midi.Buffer | |||
midi.Buffer = ffi.typeof("pMidiBuffer") | |||
local locks = {} | |||
local Buffer_mt = { | |||
-- methods | |||
__index = { | |||
--- Iterate over each @{midi.Event} in the buffer. | |||
-- @usage for ev in myBuffer:eachEvent() do print(ev:getNote()) end | |||
-- @function Buffer:eachEvent | |||
eachEvent = function (self) | |||
-- COROUTINE ITERATOR IS EVIL ITERATOR | |||
return coroutine.wrap(function () | |||
local dataStart = protolib.MidiBuffer_getDataPointer(self) | |||
local msg = dataStart | |||
local nBytes = protolib.MidiBuffer_getDataSize(self) | |||
self:lock() | |||
while msg < dataStart + nBytes do | |||
ret = ffi.cast("MidiEvent*",msg) | |||
coroutine.yield(ret) | |||
msg = msg + | |||
ffi.sizeof"int32_t" + | |||
ffi.sizeof"uint16_t" + | |||
ffi.sizeof"uint8_t" * ret.dataSize | |||
end | |||
self:unlock() | |||
end) | |||
end; | |||
--- Remove all MIDI events from the buffer. | |||
-- @function Buffer:clear | |||
clear = function (self) | |||
self:checkLock() | |||
protolib.MidiBuffer_resizeData(self, 0) | |||
end; | |||
--- Add a MIDI event. | |||
-- @tparam midi.Event event | |||
-- @function Buffer:addEvent | |||
addEvent = function (self, event) | |||
self:checkLock() | |||
local nBytes = protolib.MidiBuffer_getDataSize(self) | |||
protolib.MidiBuffer_resizeData(self, nBytes + event.dataSize+ffi.sizeof("int32_t")+ffi.sizeof("uint16_t")) | |||
local dataStart = protolib.MidiBuffer_getDataPointer(self) | |||
ffi.copy(dataStart + nBytes, event, event.dataSize+ffi.sizeof("int32_t")+ffi.sizeof("uint16_t")) | |||
end; | |||
-- internal | |||
lock = function (self) | |||
local addr = tonumber(ffi.cast("int", protolib.MidiBuffer_getDataPointer(self))) | |||
locks[addr] = locks[addr] and locks[addr] + 1 or 1 | |||
end; | |||
unlock = function (self) | |||
local addr = tonumber(ffi.cast("int", protolib.MidiBuffer_getDataPointer(self))) | |||
if not locks[addr] then return end | |||
locks[addr] = locks[addr] - 1 | |||
if locks[addr] < 1 then locks[addr] = nil end | |||
end; | |||
checkLock = function (self) | |||
local addr = tonumber(ffi.cast("int", protolib.MidiBuffer_getDataPointer(self))) | |||
if locks[addr] then | |||
error "Cannot modify a midi.Buffer while iterating through it." | |||
end | |||
end; | |||
debug = function (self) | |||
self:checkLock() | |||
local o = "" | |||
local max = protolib.MidiBuffer_getDataSize(self) | |||
local addr = protolib.MidiBuffer_getDataPointer(self) | |||
for i = 0,max-1 do | |||
addr = addr + 1 | |||
o = o..bit.tohex(addr[0],4).." " | |||
end | |||
print (o) | |||
end; | |||
}; | |||
} | |||
ffi.metatype(midi.Buffer, Buffer_mt) | |||
--- Midi Event. | |||
-- A single midi event as returned by @{Buffer:eachEvent} | |||
-- <br><br> | |||
-- @type midi.Event | |||
midi.Event = setmetatable ({}, { | |||
--- Constructor : copy another event. | |||
-- @tparam midi.Event other | |||
-- @display midi.Event | |||
-- @function Event | |||
--- Constructor : create a custom event. | |||
-- Create an event from given bytes (or zeros if not supplied) | |||
-- @usage myEv = midi.Event(0, 3, {0x90, 0x30, 0x7f}) -- note on | |||
-- @param time | |||
-- @param dataSize | |||
-- @param[opt] data | |||
-- @display midi.Event | |||
-- @function midi.Event | |||
__call = function(self, ...) | |||
if select("#", ...)==1 then | |||
local o = ... | |||
local n = ffi.new("MidiEvent", o.dataSize, o.time, o.dataSize) | |||
ffi.copy(n.data, o.data, o.dataSize) | |||
return n | |||
elseif select("#", ...)==2 then | |||
local time, dataSize, data = ... | |||
local n = ffi.new("MidiEvent", dataSize, time, dataSize) | |||
if data then | |||
for k,v in ipairs(data) do n.data[k-1] = v end | |||
else | |||
ffi.fill(n.data, dataSize) | |||
end | |||
return n | |||
end | |||
end; | |||
}) | |||
--- Constructor : note on. | |||
-- @param channel (1-16) | |||
-- @param note (0-127) | |||
-- @param vel (1-127) | |||
-- @param[opt=0] pos sample offset | |||
-- @treturn midi.Event | |||
-- @function Event.noteOn | |||
midi.Event.noteOn = function (channel, note, vel, pos) | |||
pos = pos or 0 | |||
local n = midi.Event(pos, 3) | |||
n.data[0] = bor(0x90, channel-1) | |||
n.data[1] = band(note, 127) | |||
n.data[2] = band(vel, 127) | |||
return n | |||
end | |||
--- Constructor : note off. | |||
-- @param channel (1-16) | |||
-- @param note (0-127) | |||
-- @param[opt=0] vel (0-127) | |||
-- @param[opt=0] pos sample offset | |||
-- @treturn midi.Event | |||
-- @function Event.noteOff | |||
midi.Event.noteOff = function (channel, note, vel, pos) | |||
pos = pos or 0 | |||
vel = vel or 0 | |||
local n = midi.Event(pos, 3) | |||
n.data[0] = bor(0x80, channel-1) | |||
n.data[1] = band(note, 127) | |||
n.data[2] = band(vel, 127) | |||
return n | |||
end | |||
--- Constructor : pitch bend. | |||
-- @param channel (1-16) | |||
-- @param pitch bend value (0-16383) | |||
-- @param[opt=0] pos sample offset | |||
-- @treturn midi.Event | |||
-- @function Event.pitchBend | |||
midi.Event.pitchBend = function (channel, val, pos) | |||
pos = pos or 0 | |||
local n = midi.Event(pos, 3) | |||
n.data[0] = bor(0xe0, channel-1) | |||
n.data[1] = band(val, 127) | |||
n.data[2] = band(rshift(val,7), 127) | |||
return n | |||
end | |||
--- Constructor : Control change. | |||
-- @param channel (1-16) | |||
-- @param number control number (0-247) | |||
-- @param value control value (0-127) | |||
-- @param[opt=0] pos sample offset | |||
-- @treturn midi.Event | |||
-- @function Event.control | |||
midi.Event.control = function (channel, num, val, pos) | |||
pos = pos or 0 | |||
local n = midi.Event(pos, 3) | |||
n.data[0] = bor(0xb0, channel-1) | |||
n.data[1] = band(num, 127) | |||
n.data[2] = band(val, 127) | |||
return n | |||
end | |||
local MidiEvent_mt = { | |||
-- todo precalculate ? | |||
-- status = band(self.data[0], 0xf0) | |||
-- note = band(self.data[1], 0x7f) | |||
-- vel = band(self.data[2], 0x7f) | |||
-- also sanity check ? if msg.dataSize>=3 then | |||
-- methods | |||
__index = { | |||
--- Get channel. | |||
-- @return the MIDI channel (1-16) | |||
-- @function Event:getChannel | |||
getChannel = function (self) | |||
if band(self.data[0], 0xf0) ~= 0xf0 then | |||
return band(self.data[0], 0xf) + 1 | |||
end | |||
end; | |||
--- Set channel. | |||
-- @param channel the MIDI channel (1-16) | |||
-- @function Event:setChannel | |||
setChannel = function (self, channel) | |||
if band(self.data[0], 0xf0) ~= 0xf0 then | |||
self.data[0] = | |||
bor( | |||
band(self.data[0], 0xf0), | |||
channel-1 | |||
) | |||
end | |||
end; | |||
--- Is a note on event. | |||
-- @treturn boolean whether event is a note on. | |||
-- @function Event:isNoteOn | |||
isNoteOn = function (self) | |||
return (band(self.data[0], 0xf0)==0x90 and band(self.data[2], 0x7f)~=0) | |||
end; | |||
--- Is a note off event. | |||
-- @treturn boolean whether event is a note off. | |||
-- @function Event:isNoteOff | |||
isNoteOff = function (self) | |||
return (band(self.data[0], 0xf0)==0x80 or (band(self.data[0], 0xf0)==0x90 and band(self.data[2], 0x7f)==0)) | |||
end; | |||
--- Get note. | |||
-- @return the MIDI note number (0-127) | |||
-- @function Event:getNote | |||
getNote = function (self) | |||
return band(self.data[1], 0x7f) | |||
end; | |||
--- Set note. | |||
-- @param note the MIDI note number (0-127) | |||
-- @function Event:setNote | |||
setNote = function (self, note) | |||
if self:isNoteOn() or self:isNoteOff() then | |||
self.data[1] = band(note, 127) | |||
end | |||
end; | |||
--- Get velocity. | |||
-- @return the MIDI velocity (1-127) | |||
-- @function Event:getVel | |||
getVel = function (self) | |||
return band(self.data[2], 0x7f) | |||
end; | |||
--- Set velocity. | |||
-- @param vel the MIDI velocity (1-127) | |||
-- @function Event:setVel | |||
setVel = function (self, vel) | |||
if self:isNoteOn() or self:isNoteOff() then | |||
self.data[2] = vel | |||
end | |||
end; | |||
--- Is a pitch bend event. | |||
-- @treturn boolean whether event is a pitch bend on. | |||
-- @function Event:isPitchBend | |||
isPitchBend = function (self) | |||
return band(self.data[0], 0xf0)==0xe0 | |||
end; | |||
--- Get pitch bend value. | |||
-- @return pitch bend value (0-16383). | |||
-- @function Event:getPitchBendValue | |||
getPitchBendValue = function (self) | |||
if not self:isPitchBend() then error "not a pitch bend event" end | |||
return bor(self.data[1], lshift(self.data[2], 7)) | |||
end; | |||
--- Is a Control Change event. | |||
-- @treturn boolean whether event is a control change. | |||
-- @function Event:isControl | |||
isControl = function (self) | |||
return band(self.data[0], 0xf0)==0xb0 | |||
end; | |||
--- Get control number. | |||
-- @return control number (0-247). | |||
-- @function Event:getControlNumber | |||
getControlNumber = function (self) | |||
if not self:isControl() then error "not a control event" end | |||
return self.data[1] | |||
end; | |||
--- Get control value. | |||
-- @return control value (0-127). | |||
-- @function Event:getControlValue | |||
getControlValue = function (self) | |||
if not self:isControl() then error "not a control event" end | |||
return self.data[2] | |||
end; | |||
debug = function (self) | |||
print (tonumber(self.time).." ".. | |||
tonumber(self.dataSize).." ".. | |||
bit.tohex(self.data[0],4).." ".. | |||
bit.tohex(self.data[1],4).." ".. | |||
bit.tohex(self.data[2],4)) | |||
end; | |||
}; | |||
} | |||
--- Sample position relatively to the start of the block. | |||
-- This value is often 0 because most hosts call @{plugin.processBlock} at the | |||
-- beginning of beats and beat divisions. It is never higher than the | |||
-- current @{plugin.processBlock}'s `smax` and any events created by the script | |||
-- should respect this rule. | |||
-- @field Event.time | |||
--- Size of the MIDI message in bytes | |||
-- @field Event.dataSize | |||
--- The raw MIDI message | |||
-- (`const uint8_t*` cdata) | |||
-- @field Event.data | |||
ffi.metatype("MidiEvent", MidiEvent_mt) | |||
return midi |
@@ -0,0 +1,273 @@ | |||
--- Use `plugin` to define the AU/VST audio plugin's behaviour. | |||
-- The `plugin` global is available to every protoplug script after including the | |||
-- main protoplug header : | |||
-- require "include/protoplug" | |||
-- @module plugin | |||
ffi.cdef [[ | |||
// pasted from juce_AudioPlayHead.h | |||
typedef struct CurrentPositionInfo | |||
{ | |||
double bpm; | |||
int timeSigNumerator; | |||
int timeSigDenominator; | |||
int64_t timeInSamples; | |||
double timeInSeconds; | |||
double editOriginTime; | |||
double ppqPosition; | |||
double ppqPositionOfLastBarStart; | |||
int frameRate; | |||
bool isPlaying; | |||
bool isRecording; | |||
double ppqLoopStart; | |||
double ppqLoopEnd; | |||
bool isLooping; | |||
} CurrentPositionInfo; | |||
typedef struct pAudioPlayHead | |||
{ void *pointer; } pAudioPlayHead; | |||
bool AudioPlayHead_getCurrentPosition(pAudioPlayHead self, CurrentPositionInfo& result); | |||
]] | |||
local script = require "include/core/script" | |||
local plugin = {} | |||
local sampleRate | |||
script.addHandler("init", function () | |||
--- Override functions. | |||
-- Define these functions and the host will call them. | |||
-- <br><br> | |||
-- @section overrides | |||
--- Process Audio Block. | |||
-- Override this function to input and output audio and MIDI data. | |||
-- | |||
-- This override is handled automatically if @{stereoFx} or @{polyGen} are used. | |||
-- Use this function to handle the raw data instead. | |||
-- @param samples a C float** pointing to two channels of samples, serving as input and output | |||
-- @param smax the maximum sample index (nSamples - 1) | |||
-- @tparam midi.Buffer midiBuf the MIDI data for this block, serving as input and output | |||
-- @usage function plugin.processBlock (samples, smax) -- let's ignore midi for this example | |||
-- for i = 0, smax do | |||
-- samples[0][i] = sin(myTime) -- left channel | |||
-- samples[1][i] = sin(myTime) -- right channel | |||
-- myTime = myTime + myDelta | |||
-- end | |||
-- end | |||
-- @function plugin.processBlock | |||
local dbged = false | |||
if type(plugin.processBlock) == "function" then | |||
local prepared = false | |||
function plugin_processBlock(nSamples, samples, midiBuf, playHead, _sampleRate) | |||
if not dbged then | |||
dbged=true | |||
end | |||
sampleRate = _sampleRate | |||
if not prepared then | |||
prepared = true | |||
if plugin.prepareToPlay then | |||
for _,v in ipairs(plugin.prepareToPlay) do | |||
v() | |||
end | |||
end | |||
end | |||
samples = ffi.typeof("float**")(samples) | |||
midiBuf = ffi.typeof("pMidiBuffer")(midiBuf) | |||
plugin.playHead = ffi.typeof("pAudioPlayHead")(playHead) | |||
plugin.processBlock(samples, nSamples-1, midiBuf) | |||
plugin.playHead = nil | |||
end | |||
end | |||
--- Return the name of a parameter. | |||
-- | |||
-- This override is handled automatically if @{manageParams} is used. | |||
-- @param index parameter index (0-126) | |||
-- @treturn string the parameter's name | |||
-- @function plugin.getParameterName | |||
plugin_getParameterName = plugin.getParameterName | |||
--- Return the representation of a parameter's value. | |||
-- Override this function to choose how each parameter's value should | |||
-- be displayed by the host. The parameter's current value can be obtained | |||
-- using @{plugin.getParameter} | |||
-- | |||
-- This override is handled automatically if @{manageParams} is used. | |||
-- @param index parameter index (0-126) | |||
-- @treturn string a string representation of the parameter's current value | |||
-- @function plugin.getParameterText | |||
plugin_getParameterText = plugin.getParameterText | |||
--- Handle parameter changes. | |||
-- Override this function to do something when a parameter changes | |||
-- The parameter's current value can be obtained using @{plugin.getParameter} | |||
-- | |||
-- This override is handled automatically if @{manageParams} is used. | |||
-- @param index parameter index (0-126) | |||
-- @function plugin.paramChanged | |||
plugin_paramChanged = plugin.paramChanged | |||
-- todo | |||
plugin_parameterText2Double = plugin.parameterText2Double | |||
--- Return the tail length in seconds (effects only). | |||
-- Override this function to define the effect's audio tail length. | |||
-- @return the tail length in seconds | |||
-- @function plugin.getTailLengthSeconds | |||
plugin_getTailLengthSeconds = plugin.getTailLengthSeconds | |||
end) | |||
--- Callback functions. | |||
-- Functions that your script can call. | |||
-- <br><br> | |||
-- @section callbacks | |||
--- Automatically set up a list of parameters. | |||
-- Call this function with a table containing parameter definitions as argument, and | |||
-- it will perform the repetitive task of defining all the parameter-related overrides. | |||
-- | |||
-- The format of the parameter list is demonstrated in @{classic-filter.lua} | |||
-- @param paramList a table with parameter definitions (see example) | |||
-- @function plugin.manageParams | |||
plugin.manageParams = require "include/core/manageparams" | |||
--- Set (automate) a parameter's value. | |||
-- The value must be normalized to be between 0 and 1. | |||
-- @param index parameter index (0-126) | |||
-- @param value parameter value (0-1) | |||
-- @function plugin.setParameter | |||
plugin.setParameter = plugin_setParameter | |||
--- Get a parameter's value. | |||
-- The values are between 0 and 1, but different minimums and maximums can | |||
-- be easily simulated using @{plugin.manageParams}. | |||
-- @param index parameter index (0-126) | |||
function plugin.getParameter(index) | |||
return plugin_params[index] | |||
end | |||
plugin_params = ffi.typeof("const double *")(plugin_params) | |||
--- Get host position info, if available. | |||
-- Only call this from within @{processBlock}. | |||
-- @treturn plugin.PositionInfo current position info, or `nil` depending on the host. | |||
-- @function plugin.getCurrentPosition | |||
plugin.getCurrentPosition = function () | |||
if not plugin.playHead then return end | |||
local pos = ffi.new("CurrentPositionInfo") | |||
local res = protolib.AudioPlayHead_getCurrentPosition(plugin.playHead, pos) | |||
if res==true then | |||
return pos | |||
end | |||
end | |||
--- Get host samplerate. | |||
-- The value is unknown until the plugin `prepareToPlay` event has been emitted. | |||
-- The value is always known in @{processBlock}. An error is caused if an | |||
-- attempt is made to access the sample rate prematurely. | |||
-- @see plugin.addHandler | |||
-- @return current samplerate. | |||
-- @function plugin.getSampleRate | |||
plugin.getSampleRate = function () | |||
if sampleRate == nil then | |||
error ("Trying to use sampleRate when it is not yet known. " .. | |||
"Use plugin.addHandler('prepareToPlay',...) to initialize and use the samplerate. ") | |||
end | |||
return sampleRate | |||
end | |||
--- Check if the samplerate is known. | |||
-- @treturn boolean | |||
-- @function plugin.isSampleRateKnown | |||
plugin.isSampleRateKnown = function () | |||
return (sampleRate ~= nil) | |||
end | |||
--- Add a handler for a VST/AU event. | |||
-- The following events are available : | |||
-- | |||
-- - `"prepareToPlay"` - Emitted before the first call to @{processBlock}, when the samplerate is known. | |||
-- @see script.addHandler | |||
-- @see gui.addHandler | |||
-- @tparam string event the event to handle | |||
-- @tparam function handler a function to add the event's handlers | |||
function plugin.addHandler(event, handler) | |||
if not plugin[event] then plugin[event] = {} end | |||
table.insert(plugin[event], handler) | |||
end | |||
--- Host position information. | |||
-- A container type for host-related information as returned by @{plugin.getCurrentPosition} | |||
-- | |||
-- Is a [JUCE AudioPlayHead::CurrentPositionInfo](http://www.juce.com/api/structAudioPlayHead_1_1CurrentPositionInfo.html) | |||
-- <br><br> | |||
--@type plugin.PositionInfo | |||
--- Host tempo (beats per minute) | |||
-- @field PositionInfo.bpm | |||
--- Time signature numerator ie. *3*/4 | |||
-- @field PositionInfo.timeSigNumerator | |||
--- Time signature denominator ie. 3/*4* | |||
-- @field PositionInfo.timeSigDenominator | |||
--- Current position on the host's timeline (samples) | |||
-- @field PositionInfo.timeInSamples | |||
--- Current position on the host's timeline (seconds) | |||
-- @field PositionInfo.timeInSeconds | |||
--- Position of the start of the edit region on the host's timeline | |||
-- @field PositionInfo.editOriginTime | |||
--- Current position on the host's timeline (pulses-per-quarter-note) | |||
-- @field PositionInfo.ppqPosition | |||
--- Position of the last bar start (pulses-per-quarter-note). | |||
-- (or zero if unavailable.) | |||
-- @field PositionInfo.ppqPositionOfLastBarStart | |||
--- Video frame rate | |||
-- @field PositionInfo.frameRate | |||
--- Is playing | |||
-- @field PositionInfo.isPlaying | |||
--- Is recording | |||
-- @field PositionInfo.isRecording | |||
--- Position of the loop start (pulses-per-quarter-note). | |||
-- (or zero if unavailable.) | |||
-- @field PositionInfo.ppqLoopStart | |||
--- Position of the loop end (pulses-per-quarter-note). | |||
-- (or zero if unavailable.) | |||
-- @field PositionInfo.ppqLoopEnd | |||
--- Is looping | |||
-- @field PositionInfo.isLooping | |||
return plugin |
@@ -0,0 +1,177 @@ | |||
--- Use this module to create a polyphonic generator with virtual tracks. | |||
-- Example at @{sine-organ.lua}. | |||
-- | |||
-- This module facilitates the creation of polyphonic instruments. It acts | |||
-- as a layer that covers the @{plugin.processBlock} function, receives MIDI | |||
-- notes and dispatches them to virtual tracks. The `polyGen.VTrack` prototype | |||
-- is exposed for you to define audio processing in a simple, | |||
-- monophonic, per-note fashion. Initialize this module by calling `polyGen.initTracks`. | |||
-- | |||
-- The `polyGen` global is available to every protoplug script after including the | |||
-- main protoplug header : | |||
-- require "include/protoplug" | |||
-- @module polyGen | |||
--- Set up virtual tracks. | |||
-- This function must be called by any script that wishes to use this module. | |||
-- @param[opt=8] n the number of virtual tracks to use (aka. voices or polyphony) | |||
-- @function polyGen.initTracks | |||
--- Virtual track. | |||
-- Virtual track. A monophonic voice that defines the instrument's sound. | |||
-- <br><br> | |||
-- @type polyGen.VTrack | |||
--- Override to additively process an audio block. | |||
-- Define the output of a virtual track in this method. | |||
-- Use `self.noteIsOn`, `self.noteFreq`, or any fields you defined to | |||
-- determine current the state of the calling track. | |||
-- | |||
-- This method is called successively on every track, | |||
-- which should *add* their output to `samples`. | |||
-- @param samples a C `float**` pointing to two channels of samples to add to. | |||
-- @param smax the maximum sample index (nSamples - 1) | |||
-- @see sine-organ.lua | |||
-- @function VTrack:addProcessBlock | |||
--- Override to recieve note on. | |||
-- Override this method to handle a note getting dispatched to a virtual track. | |||
-- @param note the MIDI note number (0-127) | |||
-- @param vel the MIDI velocity (0-127) | |||
-- @function VTrack:noteOn | |||
--- Override to recieve note off. | |||
-- Override this method to handle a note off on a virtual track. | |||
-- @param note a reminder of the MIDI note number | |||
-- @function VTrack:noteOff | |||
--- Override to allow initialisation. | |||
-- Override this method to perform initialisation tasks on each track, | |||
-- for example to create any per-track fields. | |||
-- @function VTrack:init | |||
local polyGen = {} | |||
local script = require "include/core/script" | |||
local VTrack = {noteIsOn = false, noteFreq=0.01, notePeriod=100, age = 0, note = -1} | |||
VTrack.__index = VTrack | |||
VTrack.tracks = { } | |||
function VTrack.new(i) | |||
local o = {} | |||
setmetatable(o,VTrack) | |||
o.i = i --same | |||
return o | |||
end | |||
local function processMidiEvent(msg) | |||
if msg:isNoteOn() then | |||
-- note on, choose the best track for a new note | |||
local oldestPlaying_age, oldestPlaying_i = -1, -1 | |||
local oldestReleased_age, oldestReleased_i = -1, -1 | |||
for i=1,VTrack.numTracks do | |||
vt = VTrack.tracks[i] | |||
vt.age = vt.age+1 | |||
if vt.note ~= -1 then | |||
-- track note is on | |||
if vt.age>oldestPlaying_age then | |||
oldestPlaying_i = i | |||
oldestPlaying_age = vt.age | |||
end | |||
else | |||
-- track is free | |||
if vt.age>oldestReleased_age then | |||
oldestReleased_i = i | |||
oldestReleased_age = vt.age | |||
end | |||
end | |||
end | |||
local chosentrack = {} | |||
if oldestReleased_i ~= -1 then | |||
chosentrack = VTrack.tracks[oldestReleased_i] | |||
else | |||
chosentrack = VTrack.tracks[oldestPlaying_i] | |||
end | |||
chosentrack.age = 0 | |||
chosentrack.note = msg:getNote() | |||
chosentrack.noteFreq = midi.noteToFreq(chosentrack.note) | |||
chosentrack.notePeriod = 1/chosentrack.noteFreq | |||
if VTrack.noteOn~=nil then | |||
chosentrack:noteOn(chosentrack.note, msg:getVel(), msg) | |||
end | |||
chosentrack.noteIsOn = true | |||
elseif msg:isNoteOff() then | |||
-- note off | |||
for i=1,VTrack.numTracks do | |||
vt = VTrack.tracks[i] | |||
if vt.note == msg:getNote() then | |||
vt.age = 0 | |||
vt.note = -1 | |||
if VTrack.noteOff~=nil then | |||
vt:noteOff(msg:getNote(), msg) | |||
end | |||
vt.noteIsOn = false | |||
end | |||
end | |||
end | |||
end | |||
function polyGen.initTracks(n) | |||
VTrack.numTracks = n or 8 | |||
for i=1,VTrack.numTracks do | |||
VTrack.tracks[i] = VTrack.new(i) | |||
end | |||
function plugin.processBlock (samples, smax, midiBuf) | |||
for msg in midiBuf:eachEvent() do | |||
processMidiEvent(msg) | |||
end | |||
for i=0,smax do | |||
samples[0][i] = 0 | |||
samples[1][i] = 0 | |||
end | |||
for i=1,VTrack.numTracks do | |||
if VTrack.addProcessBlock~=nil then | |||
VTrack.tracks[i]:addProcessBlock(samples, smax) | |||
end | |||
end | |||
end | |||
script.addHandler("init", function () | |||
if VTrack.init~=nil then | |||
for i = 1,VTrack.numTracks do | |||
VTrack.tracks[i]:init() | |||
end | |||
end | |||
end) | |||
end | |||
polyGen.VTrack = VTrack | |||
--- Track number. | |||
-- Use `self.i` to check which virtual track is being called. | |||
-- @field VTrack.i | |||
--- Current MIDI note. | |||
-- The MIDI note number that is currently being played by this track, | |||
-- or `-1` if in note off state. | |||
-- @field VTrack.note | |||
--- Current note frequency. | |||
-- The note frequency that is currently being played by this track. | |||
-- @field VTrack.noteFreq | |||
--- Current note period. | |||
-- `1/noteFreq` | |||
-- @field VTrack.notePeriod | |||
--- Note is on. | |||
-- Whether the track is playing a note (`boolean`). | |||
-- @field VTrack.noteIsOn | |||
return polyGen |
@@ -0,0 +1,136 @@ | |||
--- Use `script` to handle script events, libraries and files. | |||
-- The `script` global is available to every protoplug script after including the | |||
-- main protoplug header : | |||
-- require "include/protoplug" | |||
-- @module script | |||
local script = {} | |||
--- Add a handler for a script event. | |||
-- The following events are available : | |||
-- | |||
-- - `"init"` - Emitted after the script has been compiled and run. | |||
-- - `"preClose"` - Emitted before the script state gets destroyed. | |||
-- @see plugin.addHandler | |||
-- @see gui.addHandler | |||
-- @tparam string event the event to handle | |||
-- @tparam function handler a function to add the event's handlers | |||
function script.addHandler(event, handler) | |||
if not script[event] then script[event] = {} end | |||
table.insert(script[event], handler) | |||
end | |||
--- Save script data. | |||
-- Override this function to save any custom data. | |||
-- | |||
-- This gets called : | |||
-- - when the host saves the plugin's state (eg. when saving a project) | |||
-- - right before the script is recompiled, to keep custom data across compilations. | |||
-- @treturn string the data to be saved | |||
-- @function script.saveData | |||
--- Load script data. | |||
-- Override this function to load any custom data. | |||
-- Be warned that the data might originate from another script, so it's a good | |||
-- idea to start the data with a header confirming the format. | |||
-- | |||
-- This gets called : | |||
-- - when the host loads the plugin's state (eg. when loading a project) | |||
-- - right after the script is recompiled, to keep custom data across compilations. | |||
-- @tparam string data the data to be loaded | |||
-- @function script.loadData | |||
--- Load shared libraries. | |||
-- Protoplug scripts should use this wrapper function instead of LuaJIT's | |||
-- [ffi.load](http://luajit.org/ext_ffi_api.html#ffi_load). | |||
-- It has the same behaviour as `ffi.load`, but it adds `protoplug/lib` as a | |||
-- search path, and can accept multiple arguments to test for different | |||
-- library names. The names are tested from left to right until one load | |||
-- successfully. If none of them work, an error is raised. | |||
-- sdl = script.ffiLoad("sdl") | |||
-- This looks for `libsdl.so` or `sdl.dll` in protoplug's lib folder and | |||
-- in the system paths. | |||
-- | |||
-- fftw = script.ffiLoad("libfftw3.so.3", "libfftw3-3.dll") | |||
-- This looks for the supplied names in the same locations as above. This is | |||
-- necessary for libs like FFTW, that have has platform-dependent names. | |||
-- @tparam string libName | |||
-- @tparam[opt] string ... alternate names for the same library | |||
-- @return The library's ffi namespace | |||
-- @function script.ffiLoad | |||
local function file_exists(name) | |||
local f=io.open(name,"r") | |||
if f~=nil then io.close(f) return true else return false end | |||
end | |||
local function tryLoad(lib) | |||
if string.find(lib, "/") or string.find(lib, "\\") then | |||
return ffi.load(lib) | |||
end | |||
local libfile = lib | |||
if ffi.os=="Windows" then | |||
if not string.find(lib, "%.") then | |||
libfile = libfile..".dll" | |||
end | |||
else -- assuming posix | |||
if not string.find(lib,"%.") then | |||
libfile = libfile..".so" | |||
end | |||
if string.sub(lib, 1, 3) ~= "lib" then | |||
libfile = "lib"..libfile | |||
end | |||
end | |||
libfile = protoplug_dir.."/lib/"..libfile | |||
if file_exists(libfile) then | |||
return ffi.load(libfile) | |||
end | |||
local success, ret = pcall(ffi.load, lib) | |||
if success then return ret end | |||
end | |||
function script.ffiLoad(...) | |||
local args={...} | |||
local ret | |||
for _,lib in ipairs(args) do | |||
ret = tryLoad(lib) | |||
if ret then break end | |||
end | |||
return ret and ret or error("could not find library ".. | |||
table.concat({...}, ", ")) | |||
end | |||
--- Current protoplug directory. | |||
-- The full path of the `protoplug` directory currently being used. It should | |||
-- be alongside the protoplug fx and gen dynamic libraries. | |||
-- @predefined protoplugDir | |||
script.protoplugDir = protoplug_dir | |||
-- Wrap the raw global override called by protoplug | |||
function script_init() | |||
if script.preClose then | |||
function script_preClose() | |||
for _,v in ipairs(script.preClose) do | |||
v() | |||
end | |||
end | |||
end | |||
if script.init then | |||
for _,v in ipairs(script.init) do | |||
v() | |||
end | |||
end | |||
script_saveData = script.saveData | |||
script_loadData = script.loadData | |||
end | |||
-- add handler to repaint gui after recompiling | |||
script.addHandler("init", function () | |||
local gui = require "include/core/gui" | |||
local guiComp = gui.getComponent() | |||
if guiComp ~= nil then | |||
guiComp:repaint() | |||
end | |||
end) | |||
return script |
@@ -0,0 +1,69 @@ | |||
--- Use this module to create a stereo effect. | |||
-- Example at @{classic-filter.lua}. | |||
-- | |||
-- This module acts as a layer that conceals the @{plugin.processBlock} function, | |||
-- manages stereo channels, and exposes the `stereoFx.Channel` prototype for you | |||
-- define per-channel audio processing. Initialize it by calling `stereoFx.init`. | |||
-- | |||
-- The `stereoFx` global is available to every protoplug script after including the | |||
-- main protoplug header : | |||
-- require "include/protoplug" | |||
-- @module stereoFx | |||
--- Set up channels. | |||
-- This function must be called by any script that wishes to use this module. | |||
-- @function stereoFx.init | |||
--- Channel. | |||
-- This class represents a channel (ie. left or right). | |||
-- <br><br> | |||
-- @type stereoFx.Channel | |||
--- Override to process a channel's audio block. | |||
-- Define the audio processing of a single channel in this function. | |||
-- @param samples a C float* serving as input and output | |||
-- @param smax the maximum sample index (nSamples - 1) | |||
-- @function Channel:processBlock | |||
--- Override to handle initialisation. | |||
-- Override this method to perform initialisation tasks on each channel, | |||
-- for example to create any per-channel fields. | |||
-- @function Channel:init | |||
local stereoFx = {} | |||
local script = require "include/core/script" | |||
local Channel = { } | |||
function Channel:new (o) | |||
setmetatable(o, self) | |||
self.__index = self | |||
return o | |||
end | |||
local LChannel = Channel:new{ } | |||
local RChannel = Channel:new{ } | |||
function stereoFx.init() | |||
function plugin.processBlock (samples, smax) | |||
if Channel.processBlock==nil then return 0 end | |||
LChannel:processBlock(samples[0], smax) | |||
RChannel:processBlock(samples[1], smax) | |||
end | |||
script.addHandler("init", function () | |||
if Channel.init~=nil then | |||
LChannel:init() | |||
RChannel:init() | |||
end | |||
end) | |||
end | |||
stereoFx.Channel = Channel | |||
stereoFx.LChannel = LChannel | |||
stereoFx.RChannel = RChannel | |||
return stereoFx |
@@ -0,0 +1,250 @@ | |||
-- iluaembed.lua | |||
-- based on Steve Donovan's executable ilua.lua (2007) | |||
-- "A more friendly Lua interactive prompt | |||
-- doesn't need '=' | |||
-- will try to print out tables recursively, subject to the pretty_print_limit value." | |||
-- | |||
-- version by osar.fr to embed the interactive Lua console in C/C++ programs | |||
-- creates a global function to be called by the host | |||
-- | |||
local pretty_print_limit = 20 | |||
local max_depth = 7 | |||
local table_clever = true | |||
local prompt = '> ' | |||
local verbose = false | |||
local strict = true | |||
-- suppress strict warnings | |||
_ = true | |||
-- imported global functions | |||
local sub = string.sub | |||
local match = string.match | |||
local find = string.find | |||
local push = table.insert | |||
local pop = table.remove | |||
local append = table.insert | |||
local concat = table.concat | |||
local floor = math.floor | |||
local write = io.write | |||
local read = io.read | |||
local savef | |||
local collisions = {} | |||
local G_LIB = {} | |||
local declared = {} | |||
local line_handler_fn, global_handler_fn | |||
local print_handlers = {} | |||
ilua = {} | |||
local num_prec | |||
local num_all | |||
local jstack = {} | |||
local function oprint(...) | |||
if savef then | |||
savef:write(concat({...},' '),'\n') | |||
end | |||
print(...) | |||
end | |||
local function join(tbl,delim,limit,depth) | |||
if not limit then limit = pretty_print_limit end | |||
if not depth then depth = max_depth end | |||
local n = #tbl | |||
local res = '' | |||
local k = 0 | |||
-- very important to avoid disgracing ourselves with circular referencs... | |||
if #jstack > depth then | |||
return "..." | |||
end | |||
for i,t in ipairs(jstack) do | |||
if tbl == t then | |||
return "<self>" | |||
end | |||
end | |||
push(jstack,tbl) | |||
-- this is a hack to work out if a table is 'list-like' or 'map-like' | |||
-- you can switch it off with ilua.table_options {clever = false} | |||
local is_list | |||
if table_clever then | |||
local index1 = n > 0 and tbl[1] | |||
local index2 = n > 1 and tbl[2] | |||
is_list = index1 and index2 | |||
end | |||
if is_list then | |||
for i,v in ipairs(tbl) do | |||
res = res..delim..ilua.val2str(v) | |||
k = k + 1 | |||
if k > limit then | |||
res = res.." ... " | |||
break | |||
end | |||
end | |||
else | |||
for key,v in pairs(tbl) do | |||
if type(key) == 'number' then | |||
key = '['..tostring(key)..']' | |||
else | |||
key = tostring(key) | |||
end | |||
res = res..delim..key..'='..ilua.val2str(v) | |||
k = k + 1 | |||
if k > limit then | |||
res = res.." ... " | |||
break | |||
end | |||
end | |||
end | |||
pop(jstack) | |||
return sub(res,2) | |||
end | |||
function ilua.val2str(val) | |||
local tp = type(val) | |||
if print_handlers[tp] then | |||
local s = print_handlers[tp](val) | |||
return s or '?' | |||
end | |||
if tp == 'function' then | |||
return tostring(val) | |||
elseif tp == 'table' then | |||
if val.__tostring then | |||
return tostring(val) | |||
else | |||
return '{'..join(val,',')..'}' | |||
end | |||
elseif tp == 'string' then | |||
return "'"..val.."'" | |||
elseif tp == 'number' then | |||
-- we try only to apply floating-point precision for numbers deemed to be floating-point, | |||
-- unless the 3rd arg to precision() is true. | |||
if num_prec and (num_all or floor(val) ~= val) then | |||
return num_prec:format(val) | |||
else | |||
return tostring(val) | |||
end | |||
else | |||
return tostring(val) | |||
end | |||
end | |||
function ilua.pretty_print(...) | |||
local arg = {...} | |||
for i,val in ipairs(arg) do | |||
oprint(ilua.val2str(val)) | |||
end | |||
_G['_'] = arg[1] | |||
end | |||
function ilua.compile(line) | |||
if verbose then oprint(line) end | |||
local f,err = loadstring(line,'local') | |||
return err,f | |||
end | |||
function ilua.evaluate(chunk) | |||
local ok,res = pcall(chunk) | |||
if not ok then | |||
return res | |||
end | |||
return nil -- meaning, fine! | |||
end | |||
function ilua.eval_lua(line) | |||
if savef then | |||
savef:write(prompt,line,'\n') | |||
end | |||
-- is the line handler interested? | |||
if line_handler_fn then | |||
line = line_handler_fn(line) | |||
-- returning nil here means that the handler doesn't want | |||
-- Lua to see the string | |||
if not line then return end | |||
end | |||
-- is it an expression? | |||
local err,chunk = ilua.compile('ilua.pretty_print('..line..')') | |||
if err then | |||
-- otherwise, a statement? | |||
err,chunk = ilua.compile(line) | |||
end | |||
-- if compiled ok, then evaluate the chunk | |||
if not err then | |||
err = ilua.evaluate(chunk) | |||
end | |||
-- if there was any error, print it out | |||
if err then | |||
oprint(err) | |||
end | |||
end | |||
-- functions available in scripts | |||
function ilua.precision(len,prec,all) | |||
if not len then num_prec = nil | |||
else | |||
num_prec = '%'..len..'.'..prec..'f' | |||
end | |||
num_all = all | |||
end | |||
function ilua.table_options(t) | |||
if t.limit then pretty_print_limit = t.limit end | |||
if t.depth then max_depth = t.depth end | |||
if t.clever ~= nil then table_clever = t.clever end | |||
end | |||
-- inject @tbl into the global namespace | |||
function ilua.import(tbl,dont_complain,lib) | |||
lib = lib or '<unknown>' | |||
if type(tbl) == 'table' then | |||
for k,v in pairs(tbl) do | |||
local key = rawget(_G,k) | |||
-- NB to keep track of collisions! | |||
if key and k ~= '_M' and k ~= '_NAME' and k ~= '_PACKAGE' and k ~= '_VERSION' then | |||
append(collisions,{k,lib,G_LIB[k]}) | |||
end | |||
_G[k] = v | |||
G_LIB[k] = lib | |||
end | |||
end | |||
if not dont_complain and #collisions > 0 then | |||
for i, coll in ipairs(collisions) do | |||
local name,lib,oldlib = coll[1],coll[2],coll[3] | |||
write('warning: ',lib,'.',name,' overwrites ') | |||
if oldlib then | |||
write(oldlib,'.',name,'\n') | |||
else | |||
write('global ',name,'\n') | |||
end | |||
end | |||
end | |||
end | |||
function ilua.print_handler(name,handler) | |||
print_handlers[name] = handler | |||
end | |||
function ilua.line_handler(handler) | |||
line_handler_fn = handler | |||
end | |||
function ilua.global_handler(handler) | |||
global_handler_fn = handler | |||
end | |||
function ilua.print_variables() | |||
for name,v in pairs(declared) do | |||
print(name,type(_G[name])) | |||
end | |||
end | |||
function ilua_runline(line) | |||
ilua.eval_lua(line) | |||
end |
@@ -0,0 +1,29 @@ | |||
-- lua utils | |||
local util = {} | |||
-- include cdefs | |||
function util.requireCdef(incpath) | |||
local incfile = io.open(incpath) | |||
if incfile==nil then | |||
error ("can't open include file : "..incpath) | |||
end | |||
local incstring = incfile:read "*a" | |||
incfile:close() | |||
ffi.cdef (incstring) | |||
end | |||
-- merge in modules or tables in general | |||
function util.merge (src, dst) | |||
for k,v in pairs(src) do | |||
dst[k] = v | |||
end | |||
end | |||
-- round x to n decimal places | |||
function util.roundDecimal(x, n) | |||
local p = math.pow(10, n) | |||
return math.floor(x*p+0.5)/p | |||
end | |||
return util |
@@ -0,0 +1,111 @@ | |||
-- Cookbook Filters Module FLOAT TEST | |||
-- Based on Worp Filter.lua implementation by Ico Doornekamp. (https://github.com/zevv/worp) | |||
-- Based on the Cookbook formulae by Robert Bristow-Johnson <rbj@audioimagination.com> | |||
-- osar.fr | |||
--[[ | |||
example usage : | |||
local f = Filter { | |||
type = "lp" -- filter type, see below | |||
f = 440; -- frequency(Hz), (0-20000) | |||
gain = 0; -- filter gain(dB), (-60 to 60) | |||
Q = 1; -- resonance, (0.1-100) | |||
} | |||
for sample in eachSample() | |||
sample = f.process(sample) | |||
end | |||
filter types : | |||
hp: High pass | |||
lp: Low pass | |||
bp: Band pass | |||
bs: Band stop (aka, Notch) | |||
ls: Low shelf | |||
hs: High shelf | |||
ap: All pass | |||
eq: Peaking EQ filter | |||
--]] | |||
local Float = ffi.typeof("float[1]") | |||
--[[local function Float (n) | |||
return ffi.cast("float", n) | |||
end--]] | |||
local function Filter(params) | |||
local a0, a1, a2, b0, b1, b2 | |||
local x0, x1, x2 = Float(0), Float(0), Float(0) | |||
local y0, y1, y2 = Float(0), Float(0), Float(0) | |||
local params = params or {type = "lp", f = 440, gain = 0, Q = 1} | |||
public = { | |||
update = function (args) | |||
for k,v in pairs(args) do | |||
params[k] = v | |||
end | |||
--print ( | |||
-- "type "..params.type.. | |||
-- ", f "..params.f.. | |||
-- ", gain "..params.gain.. | |||
-- ", Q "..params.Q | |||
--) | |||
local w0 = 2 * math.pi * (params.f / plugin.getSampleRate()) | |||
local alpha = math.sin(w0) / (2*params.Q) | |||
local cos_w0 = math.cos(w0) | |||
local A = math.pow(10, params.gain/40) | |||
if params.type == "hp" then | |||
b0, b1, b2 = (1 + cos_w0)/2, -(1 + cos_w0), (1 + cos_w0)/2 | |||
a0, a1, a2 = 1 + alpha, -2*cos_w0, 1 - alpha | |||
elseif params.type == "lp" then | |||
b0, b1, b2 = (1 - cos_w0)/2, 1 - cos_w0, (1 - cos_w0)/2 | |||
a0, a1, a2 = 1 + alpha, -2*cos_w0, 1 - alpha | |||
elseif params.type == "bp" then | |||
b0, b1, b2 = params.Q*alpha, 0, -params.Q*alpha | |||
a0, a1, a2 = 1 + alpha, -2*cos_w0, 1 - alpha | |||
elseif params.type == "bs" then | |||
b0, b1, b2 = 1, -2*cos_w0, 1 | |||
a0, a1, a2 = 1 + alpha, -2*cos_w0, 1 - alpha | |||
elseif params.type == "ls" then | |||
local ap1, am1, tsAa = A+1, A-1, 2 * math.sqrt(A) * alpha | |||
local am1_cos_w0, ap1_cos_w0 = am1 * cos_w0, ap1 * cos_w0 | |||
b0, b1, b2 = A*( ap1 - am1_cos_w0 + tsAa ), 2*A*( am1 - ap1_cos_w0 ), A*( ap1 - am1_cos_w0 - tsAa ) | |||
a0, a1, a2 = ap1 + am1_cos_w0 + tsAa, -2*( am1 + ap1_cos_w0 ), ap1 + am1_cos_w0 - tsAa | |||
elseif params.type == "hs" then | |||
local ap1, am1, tsAa = A+1, A-1, 2 * math.sqrt(A) * alpha | |||
local am1_cos_w0, ap1_cos_w0 = am1 * cos_w0, ap1 * cos_w0 | |||
b0, b1, b2 = A*( ap1 + am1_cos_w0 + tsAa ), -2*A*( am1 + ap1_cos_w0 ), A*( ap1 + am1_cos_w0 - tsAa ) | |||
a0, a1, a2 = ap1 - am1_cos_w0 + tsAa, 2*( am1 - ap1_cos_w0 ), ap1 - am1_cos_w0 - tsAa | |||
elseif params.type == "eq" then | |||
b0, b1, b2 = 1 + alpha*A, -2*cos_w0, 1 - alpha*A | |||
a0, a1, a2 = 1 + alpha/A, -2*cos_w0, 1 - alpha/A | |||
elseif params.type == "ap" then | |||
b0, b1, b2 = 1 - alpha, -2*cos_w0, 1 + alpha | |||
a0, a1, a2 = 1 + alpha, -2*cos_w0, 1 - alpha | |||
else | |||
error("Unsupported filter type " .. params.type) | |||
end | |||
print(a0) | |||
a0, a1, a2, b0, b1, b2 = Float(a0), Float(a1), Float(a2), Float(b0), Float(b1), Float(b2) | |||
print(a0[0]) | |||
end; | |||
process = function (x0) | |||
y2[0], y1[0] = y1[0], y0[0] | |||
y0[0] = (b0[0] / a0[0]) * x0[0] + (b1[0] / a0[0]) * x1[0] + (b2[0] / a0[0]) * x2[0] - (a1[0] / a0[0]) * y1[0] - (a2[0] / a0[0]) * y2[0] | |||
x2[0], x1[0] = x1[0], x0[0] | |||
return y0[0] | |||
end; | |||
} | |||
public.update(params) | |||
return public | |||
end | |||
return Filter |
@@ -0,0 +1,108 @@ | |||
-- Cookbook Filters Module | |||
-- Based on Worp Filter.lua implementation by Ico Doornekamp. (https://github.com/zevv/worp) | |||
-- Based on the Cookbook formulae by Robert Bristow-Johnson <rbj@audioimagination.com> | |||
-- osar.fr | |||
--[[ | |||
example usage : | |||
local f = Filter { | |||
type = "lp" -- filter type, see below | |||
f = 440; -- frequency(Hz), (0-20000) | |||
gain = 0; -- filter gain(dB), (-60 to 60) | |||
Q = 1; -- resonance, (0.1-100) | |||
} | |||
for sample in eachSample() | |||
sample = f.process(sample) | |||
end | |||
filter types : | |||
hp: High pass | |||
lp: Low pass | |||
bp: Band pass | |||
bs: Band stop (aka, Notch) | |||
ls: Low shelf | |||
hs: High shelf | |||
ap: All pass | |||
eq: Peaking EQ filter | |||
--]] | |||
local function Filter(params) | |||
local a0, a1, a2, b0, b1, b2 | |||
local x0, x1, x2 = 0, 0, 0 | |||
local y0, y1, y2 = 0, 0, 0 | |||
local params = params or {type = "lp", f = 440, gain = 0, Q = 1} | |||
public = { | |||
update = function (args) | |||
args = args or {} | |||
for k,v in pairs(args) do | |||
params[k] = v | |||
end | |||
if params.f < 10 then params.f = 10 end | |||
if not plugin.isSampleRateKnown() then return end | |||
--print ( | |||
-- "type "..params.type.. | |||
-- ", f "..params.f.. | |||
-- ", gain "..params.gain.. | |||
-- ", Q "..params.Q | |||
--) | |||
local w0 = 2 * math.pi * (params.f / plugin.getSampleRate()) | |||
local alpha = math.sin(w0) / (2*params.Q) | |||
local cos_w0 = math.cos(w0) | |||
local A = math.pow(10, params.gain/40) | |||
if params.type == "hp" then | |||
b0, b1, b2 = (1 + cos_w0)/2, -(1 + cos_w0), (1 + cos_w0)/2 | |||
a0, a1, a2 = 1 + alpha, -2*cos_w0, 1 - alpha | |||
elseif params.type == "lp" then | |||
b0, b1, b2 = (1 - cos_w0)/2, 1 - cos_w0, (1 - cos_w0)/2 | |||
a0, a1, a2 = 1 + alpha, -2*cos_w0, 1 - alpha | |||
elseif params.type == "bp" then | |||
b0, b1, b2 = params.Q*alpha, 0, -params.Q*alpha | |||
a0, a1, a2 = 1 + alpha, -2*cos_w0, 1 - alpha | |||
elseif params.type == "bs" then | |||
b0, b1, b2 = 1, -2*cos_w0, 1 | |||
a0, a1, a2 = 1 + alpha, -2*cos_w0, 1 - alpha | |||
elseif params.type == "ls" then | |||
local ap1, am1, tsAa = A+1, A-1, 2 * math.sqrt(A) * alpha | |||
local am1_cos_w0, ap1_cos_w0 = am1 * cos_w0, ap1 * cos_w0 | |||
b0, b1, b2 = A*( ap1 - am1_cos_w0 + tsAa ), 2*A*( am1 - ap1_cos_w0 ), A*( ap1 - am1_cos_w0 - tsAa ) | |||
a0, a1, a2 = ap1 + am1_cos_w0 + tsAa, -2*( am1 + ap1_cos_w0 ), ap1 + am1_cos_w0 - tsAa | |||
elseif params.type == "hs" then | |||
local ap1, am1, tsAa = A+1, A-1, 2 * math.sqrt(A) * alpha | |||
local am1_cos_w0, ap1_cos_w0 = am1 * cos_w0, ap1 * cos_w0 | |||
b0, b1, b2 = A*( ap1 + am1_cos_w0 + tsAa ), -2*A*( am1 + ap1_cos_w0 ), A*( ap1 + am1_cos_w0 - tsAa ) | |||
a0, a1, a2 = ap1 - am1_cos_w0 + tsAa, 2*( am1 - ap1_cos_w0 ), ap1 - am1_cos_w0 - tsAa | |||
elseif params.type == "eq" then | |||
b0, b1, b2 = 1 + alpha*A, -2*cos_w0, 1 - alpha*A | |||
a0, a1, a2 = 1 + alpha/A, -2*cos_w0, 1 - alpha/A | |||
elseif params.type == "ap" then | |||
b0, b1, b2 = 1 - alpha, -2*cos_w0, 1 + alpha | |||
a0, a1, a2 = 1 + alpha, -2*cos_w0, 1 - alpha | |||
else | |||
error("Unsupported filter type " .. params.type) | |||
end | |||
end; | |||
process = function (x0) | |||
y2, y1 = y1, y0 | |||
y0 = (b0 / a0) * x0 + (b1 / a0) * x1 + (b2 / a0) * x2 - (a1 / a0) * y1 - (a2 / a0) * y2 | |||
x2, x1 = x1, x0 | |||
return y0 | |||
end; | |||
} | |||
-- initialize when the samplerate in known | |||
plugin.addHandler("prepareToPlay", public.update) | |||
return public | |||
end | |||
return Filter |
@@ -0,0 +1,38 @@ | |||
-- delay line 1 | |||
-- with dc filter and shitty linear interpolation | |||
-- todo test full float version | |||
-- and possibly pointer arithmetic version | |||
local function blend(a,b,p) return (a*p + b*(1-p)) end | |||
function Line (bufSize) | |||
local buf = ffi.new("double[?]", bufSize) | |||
local pos = 0 -- todo int | |||
local dc1, dc2 = 0, 0 | |||
return { | |||
goBack = function (dt) | |||
-- todo assert dt<bufSize | |||
local fpos = pos - dt | |||
local ipos1 = math.floor(fpos) | |||
local ipos2 = ipos1 + 1 | |||
local frac = fpos - ipos1 | |||
if ipos1 < 0 then ipos1 = ipos1 + bufSize end | |||
if ipos2 < 0 then ipos2 = ipos2 + bufSize end | |||
if (ipos1)>=bufSize or (ipos1)<0 then error("accessed buf "..(ipos1)) end -- DEBUG | |||
if (ipos2)>=bufSize or (ipos2)<0 then error("accessed buf "..(ipos2)) end -- DEBUG | |||
return blend(buf[ipos2], buf[ipos1], frac) | |||
end; | |||
push = function (s) | |||
pos = pos + 1 | |||
if pos >= bufSize then pos = 0 end | |||
dc1 = dc1 + (s - dc2) * 0.000002 | |||
dc2 = dc2 + dc1 | |||
dc1 = dc1 * 0.96 | |||
if (pos)>=bufSize or (pos)<0 then error("accessed buf "..(pos)) end -- DEBUG | |||
buf[pos] = s - dc2 | |||
end; | |||
} | |||
end | |||
return Line |
@@ -0,0 +1,259 @@ | |||
-- pac freqgraph.lua | |||
--[[ | |||
an interactive histogram-ish frequency graph | |||
used in "spectral filter" and "pitch distort" | |||
usage : | |||
local Freqgraph = require "include/pac/freqgraph" | |||
local fg = Freqgraph { | |||
-- required paramters : | |||
-- an array (Lua or C) containing the values to be read and modified by the interactive graph | |||
data = ; | |||
-- number of elements in the array | |||
dataSize = ; | |||
-- optional paramters : | |||
-- the position and size of the graph | |||
bounds = juce.Rectangle_int{15,0,480,330}; | |||
title = ""; | |||
yAxis = { | |||
name = "amplitude (%)"; | |||
values = { | |||
[0] = "0"; | |||
[0.5] = "50"; | |||
[1] = "100"; | |||
} | |||
} | |||
-- colours : pageBack, pageFore, graphBack, graphFore | |||
} | |||
-- public methods : | |||
-- paint the graph onto a pGraphics ctype | |||
fg:paint(g) | |||
-- change the graph's position | |||
fg:setPos(x, y) | |||
--]] | |||
local J = require "include/protojuce" | |||
-- class | |||
local M = { | |||
-- default values | |||
bounds = J.Rectangle_int{15,0,480,330}; | |||
pageBack = J.Colour.black; | |||
pageFore = J.Colour.green; | |||
graphBack = J.Colour{r=0, g=0, b=160}; | |||
graphFore = J.Colour.green; | |||
yAxis = { | |||
name = "amplitude (%)"; | |||
values = { | |||
[0] = "0"; | |||
[0.25] = "50"; | |||
[0.5] = "100"; | |||
[0.75] = "150"; | |||
[1] = "200"; | |||
} | |||
} | |||
} | |||
M.__index = M | |||
setmetatable(M, { | |||
-- constructor | |||
__call = function (_, arg) | |||
local self = setmetatable(arg, M) | |||
self.frame = J.Rectangle_int(4, 30, self.bounds.w-50, self.bounds.h-65) | |||
self.outFrame = J.Rectangle_int(2, 28, self.frame.w+4, self.frame.h+4) | |||
self.yAmp = 1/self.frame.h | |||
-- display-coord quarters in data coordinates | |||
self.q1 = self:x2bar(self.frame.w/4) | |||
self.q2 = self:x2bar(self.frame.w/2) | |||
self.bgFill = J.FillType(self.pageBack) | |||
self.bgFill2 = J.FillType(self.graphBack) | |||
self.fgFill = J.FillType(self.graphFore) | |||
self:InitBackBuffer() | |||
self.dirtyLeft, self.dirtyRight = 0, self.dataSize-1 | |||
gui.addHandler("mouseDrag", function (event) | |||
self:mouseDrag(event) | |||
end) | |||
gui.addHandler("mouseUp", function (event) | |||
self:mouseUp(event) | |||
end) | |||
plugin.addHandler("prepareToPlay", function () | |||
self:InitBackBuffer() | |||
end) | |||
return self | |||
end; | |||
}) | |||
-- Coordinate system conversion between displayed bars <-> data | |||
-- cheap log-like scale made of 3 linear functions | |||
function M:x2bar(x) | |||
if x<self.frame.w/4 then | |||
return math.floor(x*(self.dataSize/(4*self.frame.w))) | |||
elseif x<self.frame.w/2 then | |||
return math.floor(x*((3*self.dataSize)/(4*self.frame.w))-(self.dataSize/8)) | |||
else | |||
return math.floor(x*((3*self.dataSize)/(2*self.frame.w))-(self.dataSize/2)) | |||
end | |||
end | |||
function M:bar2x(s) | |||
if s<self.q1 then | |||
return math.floor((4*self.frame.w*s)/self.dataSize) | |||
elseif s<self.q2 then | |||
return math.floor((self.frame.w*(self.dataSize+8*s))/(6*self.dataSize)) | |||
else | |||
return math.floor((self.frame.w*(self.dataSize+2*s))/(3*self.dataSize)) | |||
end | |||
end | |||
function M:y2amp(y) return 1 - y*self.yAmp end | |||
function M:amp2y(a) return math.floor(self.frame.h - a*self.frame.h) end | |||
-- on mouse drag, interpolate the movement, update the data, and mark the dirty graph area | |||
function M:mouseDrag(event) | |||
if not self.bounds:contains(event.mouseDownPos) then | |||
return | |||
end | |||
if self.bar ~= nil then | |||
self.oldbar = self.bar | |||
self.oldamp = self.amp | |||
end | |||
self.bar = self:x2bar(event.x-self.frame.x-self.bounds.x) | |||
self.amp = self:y2amp(event.y-self.frame.y-self.bounds.y) | |||
-- limit to bounds | |||
if self.bar<0 then self.bar=0 end | |||
if self.bar>self.dataSize-1 then self.bar=self.dataSize-1 end | |||
if self.amp<0 then self.amp=0 end | |||
if self.amp>1 then self.amp=1 end | |||
-- interpolate and set | |||
local x1, x2, y1, y2 = self.oldbar,self.bar,self.oldamp,self.amp | |||
if x1 == nil or x1==x2 then | |||
x1,y1 = x2,y2 | |||
self.data[x2] = y2 | |||
else | |||
if x1>x2 then | |||
x1, x2, y1, y2 = x2, x1, y2, y1 | |||
end | |||
for i=x1,x2 do | |||
local x = (x2-i)/(x2-x1) | |||
self.data[i] = y1*x + y2*(1-x) | |||
end | |||
end | |||
-- create or enlarge the currently dirty area (ie. needing a repaint) | |||
if self.dirtyLeft then | |||
if x1<self.dirtyLeft then self.dirtyLeft = x1 end | |||
if x2>self.dirtyRight then self.dirtyRight = x2 end | |||
else | |||
self.dirtyLeft, self.dirtyRight = x1, x2 | |||
end | |||
event.originalComponent:repaint() | |||
end | |||
function M:mouseUp(event) | |||
self.bar = nil | |||
self.oldbar = nil | |||
end | |||
-- create the backbuffer and draw all permanent parts of the graph | |||
function M:InitBackBuffer() | |||
self.backBuffer = J.Image( | |||
J.Image.PixelFormat.RGB, | |||
self.bounds.w, | |||
self.bounds.h, true) | |||
local g = J.Graphics(self.backBuffer) | |||
g:fillAll(self.pageBack) | |||
g:setColour(self.graphFore) | |||
g:drawRect(self.outFrame, 1) | |||
g:setColour(self.pageFore) | |||
if self.title then | |||
g:setFont(17) | |||
g:drawText("== "..self.title.." ==", self.frame.x, 5, self.frame.w, 20, J.Justification.centred) | |||
end | |||
-- draw the Y axis labels | |||
g:saveState() | |||
g:addTransform(J.AffineTransform(0, -1, self.bounds.w, 1, 0, self.frame.y)) | |||
g:setFont(16) | |||
g:drawText(self.yAxis.name, 0, 0, self.frame.h, 20, J.Justification.centred) | |||
g:restoreState() | |||
g:setFont(14) | |||
for pos, label in pairs(self.yAxis.values) do | |||
local y = self.frame.y+((self.frame.h-10)*(1-pos))-6 | |||
g:drawText(tostring(label), self.frame:getR()+3, y, 33, 20) | |||
end | |||
-- draw the X axis labels | |||
g:setFont(16) | |||
g:drawText("frequency (kHz)", self.frame.x, self.bounds.h-20, self.frame.w, 20, J.Justification.centred) | |||
g:setFillType(self.fgFill) | |||
local sr = 44100 | |||
if plugin.isSampleRateKnown() then | |||
sr = plugin.getSampleRate() | |||
else | |||
-- if the samplerate is unknown, call this again when it becomes known | |||
plugin.addHandler('prepareToPlay', function() self:InitBackBuffer() end) | |||
end | |||
local f,fmax = 0, sr/2 | |||
local function f2x(f) | |||
return self:bar2x(f/fmax*self.dataSize)+self.frame.x | |||
end | |||
g:setFont(14) | |||
while f<fmax do | |||
if f%10000==0 then | |||
g:fillRect(f2x(f), self.frame:getB(), 3, 8) | |||
elseif f%1000==0 then | |||
g:fillRect(f2x(f), self.frame:getB(), 2, 4) | |||
end | |||
f = f + 100 | |||
end | |||
g:drawText("0", f2x(0)-2, self.frame:getB()+3, 20, 20) | |||
g:drawText("2", f2x(2000)-2, self.frame:getB()+3, 20, 20) | |||
g:drawText("10", f2x(10000)-2, self.frame:getB()+3, 20, 20) | |||
g:drawText("20", f2x(20000)-2, self.frame:getB()+3, 20, 20) | |||
g = nil | |||
-- draw the entire graph's contents | |||
self:DrawBars(0, self.dataSize-1) | |||
end | |||
-- update the graph between left and right | |||
function M:DrawBars(leftBar, rightBar) | |||
local g = J.Graphics(self.backBuffer) | |||
g:setFillType(self.bgFill2) | |||
local leftX, rightX = self:bar2x(leftBar), self:bar2x(rightBar+1) | |||
g:fillRect(leftX+self.frame.x, self.frame.y, rightX-leftX, self.frame.h) | |||
g:setFillType(self.fgFill) | |||
local lastX = -1 | |||
for i = leftBar, rightBar do | |||
local x = self:bar2x(i) | |||
if x~=lastX then | |||
local width = math.max(1,self:bar2x(i+1)-x) | |||
local y = self:amp2y(self.data[i]) | |||
local height = self.frame.h-y | |||
g:fillRect(J.Rectangle_int(x+self.frame.x, y+self.frame.y, width, height)) | |||
end | |||
lastX = x | |||
end | |||
end | |||
-- on paint, update the backbuffer where necessary, and blit it | |||
function M:paint(g) | |||
if self.dirtyLeft then | |||
local l, r = self.dirtyLeft, self.dirtyRight | |||
self.dirtyLeft, self.dirtyRight = nil, nil | |||
self:DrawBars(l, r) | |||
end | |||
g:drawImageAt(self.backBuffer, self.bounds.x, self.bounds.y) | |||
end | |||
function M:setPos(x,y) | |||
self.bounds.x, self.bounds.y = x, y | |||
local guiComp = gui.getComponent() | |||
if guiComp ~= nil then | |||
guiComp:repaint() | |||
end | |||
end | |||
return M |
@@ -0,0 +1,65 @@ | |||
-- harmograph | |||
local J = require "include/protojuce" | |||
function Harmograph(args) | |||
local bounds = args.bounds or J.Rectangle_int{15,0,480,330}; | |||
local pageBack = args.pageBack or J.Colour.white; | |||
local pageFore = args.pageFore or J.Colour.black; | |||
local graphBack = args.graphBack or J.Colour.white; | |||
local graphFore = args.graphFore or J.Colour.black; | |||
local yMax = args.yMax or 500 | |||
local pos = args.pos or 0 | |||
local frame = J.Rectangle_int(4, 30, bounds.w-50, bounds.h-65) | |||
local outFrame = J.Rectangle_int(2, 28, frame.w+4, frame.h+4) | |||
local backBuffer = J.Image(J.Image.PixelFormat.RGB, bounds.w, bounds.h, true) | |||
-- initialize backbuffer | |||
do | |||
local g = J.Graphics(backBuffer) | |||
g:fillAll(pageBack) | |||
g:setColour(graphFore) | |||
g:drawRect(outFrame, 1) | |||
g:setColour(pageFore) | |||
-- draw the Y axis labels | |||
g:setFont(14) | |||
for pos, label in pairs{0=0; 0.5=50; 1=100} do | |||
local y = self.frame.y+((self.frame.h-10)*(1-pos))-6 | |||
g:drawText(tostring(label), self.frame:getR()+3, y, 33, 20) | |||
end | |||
end | |||
local renderGraph = function() | |||
end | |||
renderGraph() | |||
local yfactor = 0.5*frame.h/yMax | |||
return { | |||
draw = function (g) | |||
g:setColour(J.Colour.black) | |||
for x=0,frame.w do | |||
if x==math.floor(pos*frame.w) then | |||
g:setColour(J.Colour.blue) | |||
g:drawLine(x+10, 10, x+10, 410) | |||
end | |||
local ls = makeLengths(x/graphW) | |||
g:setColour(J.Colour(64,64,64)) | |||
for k,v in ipairs(ls) do | |||
g:setPixel(x+10, graphH-(v*3)*yfactor) | |||
end | |||
g:setColour(J.Colour(128,128,128)) | |||
for k,v in ipairs(ls) do | |||
g:setPixel(x+10, graphH-(v*2)*yfactor) | |||
end | |||
g:setColour(J.Colour.black) | |||
for k,v in ipairs(ls) do | |||
g:setPixel(x+10, graphH-v*yfactor) | |||
end | |||
end | |||
end, | |||
} | |||
end | |||
return Harmograph |
@@ -0,0 +1,31 @@ | |||
-- protojuce.lua | |||
-- a GUI module for protoplug that wraps some JUCE features | |||
local util = require"include/luautil" | |||
local script = require "include/core/script" | |||
-- module | |||
local J = {} | |||
-- todo relative, wat ? | |||
util.requireCdef(script.protoplugDir.."/include/protojuce/cdef/typedefs.h") | |||
J.AudioFormatReader = require"include/protojuce/audioformatreader" | |||
J.LagrangeInterpolator= require"include/protojuce/lagrangeinterpolator" | |||
J.Colour = require"include/protojuce/colour" | |||
J.Path = require"include/protojuce/path" | |||
J.Graphics = require"include/protojuce/graphics" | |||
J.ColourGradient = require"include/protojuce/colourgradient" | |||
J.FillType = require"include/protojuce/filltype" | |||
J.Font = require"include/protojuce/font" | |||
J.Component = require"include/protojuce/component" | |||
J.AffineTransform = require"include/protojuce/affinetransform" | |||
J.Rectangle_int = require"include/protojuce/rectangle_int" | |||
J.Rectangle_float = require"include/protojuce/rectangle_float" | |||
J.RectanglePlacement= require"include/protojuce/rectangleplacement" | |||
J.Image = require"include/protojuce/image" | |||
J.Justification = require"include/protojuce/justification" | |||
J.Point = require"include/protojuce/point" | |||
J.Line = require"include/protojuce/line" | |||
return J |
@@ -0,0 +1,120 @@ | |||
--- A geometric transformation. | |||
-- Is converted to a [JUCE AffineTransform](http://www.juce.com/api/classAffineTransform.html). | |||
-- | |||
-- The default constructor makes an `identity` transform, so all kinds of | |||
-- transformations can be created as follows : | |||
-- rot180 = juce.AffineTransform():rotated(math.pi) | |||
-- chainey = juce.AffineTransform():scaled(2.5):translated(140,140) | |||
-- @classmod juce.AffineTransform | |||
--- Constuctor. | |||
-- parameters thusly define a transformation matrix : | |||
-- | |||
-- (mat00 mat01 mat02) | |||
-- (mat10 mat11 mat12) | |||
-- (0 0 1) | |||
-- @param mat00 | |||
-- @param mat01 | |||
-- @param mat02 | |||
-- @param mat10 | |||
-- @param mat11 | |||
-- @param mat12 | |||
-- @within Constructors | |||
-- @constructor | |||
-- @function AffineTransform | |||
local AffineTransform = setmetatable({}, { | |||
__call = function(self, ...) | |||
if select("#", ...)==0 then | |||
return ffi.new("AffineTransform", 1,0,0, 0,1,0) | |||
end | |||
return ffi.new("AffineTransform", ...) | |||
end; | |||
}) | |||
local AffineTransform_mt = { | |||
-- methods | |||
__index = { | |||
--- Translated. | |||
-- @param dx the horizontal offset | |||
-- @param dy the vertical offset | |||
-- @return a translated version of this transform | |||
-- @function translated | |||
translated = function (self, dx, dy) | |||
return AffineTransform( | |||
self.mat00, self.mat01, self.mat02 + dx, | |||
self.mat10, self.mat11, self.mat12 + dy) | |||
end; | |||
--- Rotated. | |||
-- @param rad the degree of rotation in radians | |||
-- @return a rotated version of this transform | |||
-- @function rotated | |||
rotated = function (self, rad) | |||
local cosRad = math.cos (rad) | |||
local sinRad = math.sin (rad) | |||
return AffineTransform( | |||
cosRad * self.mat00 + -sinRad * self.mat10, | |||
cosRad * self.mat01 + -sinRad * self.mat11, | |||
cosRad * self.mat02 + -sinRad * self.mat12, | |||
sinRad * self.mat00 + cosRad * self.mat10, | |||
sinRad * self.mat01 + cosRad * self.mat11, | |||
sinRad * self.mat02 + cosRad * self.mat12) | |||
end; | |||
--- Scaled. | |||
-- @param scaleX | |||
-- @param[opt=scaleX] scaleY | |||
-- @return a scaled version of this transform | |||
-- @function scaled | |||
scaled = function (self, scaleX, scaleY) | |||
scaleY = scaleY or scaleX | |||
return AffineTransform( | |||
scaleX * self.mat00, scaleX * self.mat01, scaleX * self.mat02, | |||
scaleY * self.mat10, scaleY * self.mat11, scaleY * self.mat12) | |||
end; | |||
--- Followed by. | |||
-- @param other | |||
-- @return a version of this transform followed by another | |||
-- @function followedBy | |||
followedBy = function (self, other) | |||
return AffineTransform( | |||
other.mat00 * self.mat00 + other.mat01 * self.mat10, | |||
other.mat00 * self.mat01 + other.mat01 * self.mat11, | |||
other.mat00 * self.mat02 + other.mat01 * self.mat12 + other.mat02, | |||
other.mat10 * self.mat00 + other.mat11 * self.mat10, | |||
other.mat10 * self.mat01 + other.mat11 * self.mat11, | |||
other.mat10 * self.mat02 + other.mat11 * self.mat12 + other.mat12) | |||
end; | |||
}; | |||
} | |||
ffi.metatype("AffineTransform", AffineTransform_mt) | |||
--- Matrix [0] [0] | |||
-- @simplefield mat00 | |||
--- Matrix [0] [1] | |||
-- @simplefield mat01 | |||
--- Matrix [0] [2] | |||
-- @simplefield mat02 | |||
--- Matrix [1] [0] | |||
-- @simplefield mat10 | |||
--- Matrix [1] [1] | |||
-- @simplefield mat11 | |||
--- Matrix [1] [2] | |||
-- @simplefield mat12 | |||
--- Identity. | |||
-- The non-transform. | |||
-- @predefined juce.AffineTransform.identity | |||
AffineTransform.identity = AffineTransform(1,0,0, 0,1,0) | |||
return AffineTransform |
@@ -0,0 +1,147 @@ | |||
--- Class to read audio files. | |||
-- Example usage: @{soundfile-test.lua}. | |||
-- | |||
-- Reads the formats that JUCE supports, namely: WAV, AIFF, Flac, Ogg-Vorbis, Windows Media codecs, | |||
-- CoreAudio codecs, MP3. | |||
-- | |||
-- Is a pointer to a [JUCE AudioFormatReader](http://www.juce.com/api/classAudioFormatReader.html), | |||
-- and wraps some [AudioFormatManager](http://www.juce.com/api/classAudioFormatManager.html) | |||
-- functionality. | |||
-- @classmod juce.AudioFormatReader | |||
local plugin = require"include/core/plugin" | |||
local LagrangeInterpolator= require"include/protojuce/lagrangeinterpolator" | |||
ffi.cdef [[ | |||
pAudioFormatReader AudioFormatReader_new(const char *filename); | |||
bool AudioFormatReader_read (pAudioFormatReader a, | |||
int *const * destSamples, | |||
int numDestChannels, | |||
int64_t startSampleInSource, | |||
int numSamplesToRead, | |||
bool fillLeftoverChannelsWithCopies); | |||
void AudioFormatReader_delete(pAudioFormatReader a); | |||
]] | |||
local AudioFormatReader = setmetatable ({}, { | |||
--- Load a sound file as an AudioFormatReader. | |||
-- The path can be absolute or relative to the protoplug directory. | |||
-- Returns `nil` if unsuccessful. The file will remain open until the | |||
-- AudioFormatReader is unset or otherwise garbage-collected. | |||
-- @param filename | |||
-- @within Constructors | |||
-- @constructor | |||
-- @function AudioFormatReader | |||
__call = function(self, filename) | |||
local afr = protolib.AudioFormatReader_new(filename) | |||
if afr.pointer == nil then return end | |||
return ffi.gc(afr, protolib.AudioFormatReader_delete) | |||
end; | |||
}) | |||
local AudioFormatReader_mt = { | |||
-- methods | |||
__index = { | |||
--- Read samples. | |||
-- Copies a number of samples from the file into the provided array. | |||
-- @param destSamples a cdata array of pointers to buffers for each channel (`int * const *`) | |||
-- @param numDestChannels the number of elements in `destSamples` | |||
-- @param startSampleInSource | |||
-- @param numSamplesToRead | |||
-- @tparam[opt=true] boolean fillLeftoverChannelsWithCopies used if `destSamples` has more channels than the source. | |||
-- @treturn boolean success | |||
-- @function read | |||
read = function (self, destSamples, numDestChannels, startSampleInSource, numSamplesToRead, fillLeftoverChannelsWithCopies) | |||
if fillLeftoverChannelsWithCopies==nil then | |||
fillLeftoverChannelsWithCopies = true | |||
end | |||
return protolib.AudioFormatReader_read(self, destSamples, numDestChannels, startSampleInSource, numSamplesToRead, fillLeftoverChannelsWithCopies) | |||
end; | |||
--- Read entire wave to float array. | |||
-- A simplified wrapper function for `read` | |||
-- @param[opt=2] nChannels number of channels to be returned | |||
-- @param[opt=true] resample whether to perform samplerate conversion to match the host's sample rate. | |||
-- If `true`, the length of the returned array may not be the wave's original `lengthInSamples`. | |||
-- It will be given by the second returned value. | |||
-- @return a two-dimensional cdata array of channels containing samples (`float [nChannels][nSamples]`) | |||
-- @return the number of samples in each channel of the returned array | |||
-- @function readToFloat | |||
readToFloat = function (self, nChannels, resample) | |||
nChannels = nChannels or 2 | |||
resample = resample or true | |||
local floty = ffi.new("float["..nChannels.."]["..tonumber(self.lengthInSamples).."]") | |||
local inty_arg = ffi.new("int*["..nChannels.."]") | |||
for ch=0,nChannels-1 do | |||
inty_arg[ch] = ffi.cast("int*", floty)+self.lengthInSamples*ch | |||
end | |||
local gotWave = self:read(inty_arg, nChannels, 0, tonumber(self.lengthInSamples)) | |||
if not gotWave then error "can't read wave" end | |||
if not self.usesFloatingPointData then | |||
for i=0,tonumber(self.lengthInSamples)-1 do | |||
for ch=0,nChannels-1 do | |||
floty[ch][i] = inty_arg[ch][i]/0x80000000 | |||
end | |||
end | |||
end | |||
if resample then | |||
local plugSampleRate = plugin.getSampleRate() | |||
if self.sampleRate ~= plugSampleRate then | |||
local len2 = math.floor((plugSampleRate*tonumber(self.lengthInSamples))/self.sampleRate) | |||
local flot2 = ffi.new("float["..nChannels.."]["..len2.."]") | |||
local li = LagrangeInterpolator() | |||
for ch=0,nChannels-1 do | |||
li:process(self.sampleRate/plugSampleRate, floty[ch], flot2[ch], len2) | |||
end | |||
return flot2, len2 | |||
end | |||
end | |||
return floty, self.lengthInSamples | |||
end; | |||
--- Read entire wave to double array. | |||
-- This wraps `readToFloat` and returns an array containing `double`-precision numbers. | |||
-- This takes twice as much space, but it may be faster to use, as this is the native Lua type. | |||
-- @param[opt=2] nChannels number of channels to be returned | |||
-- @param[opt=true] resample whether to perform samplerate conversion to match the host's sample rate. | |||
-- If `true`, the length of the returned array may not be the wave's original `lengthInSamples`. | |||
-- It will be given by the second returned value. | |||
-- @return a two-dimensional cdata array of channels containing samples (`double [nChannels][nSamples]`) | |||
-- @return the number of samples in each channel of the returned array | |||
-- @function readToDouble | |||
readToDouble = function (self, nChannels, resample) | |||
nChannels = nChannels or 2 | |||
resample = resample or true | |||
local floty, len = self:readToFloat(nChannels) | |||
local douby = ffi.new("double["..nChannels.."]["..tonumber(len).."]") | |||
for i=0,tonumber(len)-1 do | |||
for ch=0,nChannels-1 do | |||
douby[ch][i] = floty[ch][i] | |||
end | |||
end | |||
return douby, len | |||
end; | |||
} | |||
} | |||
ffi.metatype("pAudioFormatReader", AudioFormatReader_mt); | |||
--- Sample rate | |||
-- @simplefield sampleRate | |||
--- Bits per sample | |||
-- @simplefield bitsPerSample | |||
--- Length in samples | |||
-- @simplefield lengthInSamples | |||
--- Number of channels | |||
-- @simplefield numChannels | |||
--- Uses floating point data (boolean) | |||
-- @simplefield usesFloatingPointData | |||
return AudioFormatReader |
@@ -0,0 +1,247 @@ | |||
// protojuce/cdefs/graphics.h | |||
// c definitions as exported by protoplug | |||
// included by protojuce.lua | |||
pGraphics Graphics_new(pImage imageToDrawOnto); | |||
void Graphics_delete(pGraphics g); | |||
void Graphics_setColour(pGraphics self, Colour newColour); | |||
void Graphics_setOpacity(pGraphics self, float newOpacity); | |||
void Graphics_setGradientFill(pGraphics self, const pColourGradient gradient); | |||
void Graphics_setTiledImageFill(pGraphics self, const pImage imageToUse, | |||
int anchorX, int anchorY, | |||
float opacity); | |||
void Graphics_setFillType(pGraphics self, const pFillType newFill); | |||
void Graphics_setFont(pGraphics self, const pFont newFont); | |||
void Graphics_setFont2(pGraphics self, float newFontHeight); | |||
pFont Graphics_getCurrentFont(pGraphics self); | |||
void Graphics_drawSingleLineText(pGraphics self, const char * text, | |||
int startX, int baselineY, | |||
int justification); | |||
void Graphics_drawMultiLineText(pGraphics self, const char * text, | |||
int startX, int baselineY, | |||
int maximumLineWidth); | |||
void Graphics_drawText(pGraphics self, const char * text, | |||
int x, int y, int width, int height, | |||
int justificationType, | |||
bool useEllipsesIfTooBig); | |||
void Graphics_drawText2(pGraphics self, const char * text, | |||
Rectangle_int area, | |||
int justificationType, | |||
bool useEllipsesIfTooBig); | |||
void Graphics_drawFittedText(pGraphics self, const char * text, | |||
int x, int y, int width, int height, | |||
int justificationFlags, | |||
int maximumNumberOfLines, | |||
float minimumHorizontalScale /* = 0.7f */); | |||
void Graphics_drawFittedText2(pGraphics self, const char * text, | |||
Rectangle_int area, | |||
int justificationFlags, | |||
int maximumNumberOfLines, | |||
float minimumHorizontalScale/* = 0.7f */); | |||
void Graphics_fillAll(pGraphics self); | |||
void Graphics_fillAll2(pGraphics self, Colour colourToUse); | |||
void Graphics_fillRect(pGraphics self, Rectangle_int rectangle); | |||
void Graphics_fillRect2(pGraphics self, Rectangle_float rectangle); | |||
void Graphics_fillRect3(pGraphics self, int x, int y, int width, int height); | |||
void Graphics_fillRect4(pGraphics self, float x, float y, float width, float height); | |||
void Graphics_fillRoundedRectangle(pGraphics self, float x, float y, float width, float height, | |||
float cornerSize); | |||
void Graphics_fillRoundedRectangle2(pGraphics self, Rectangle_float rectangle, | |||
float cornerSize); | |||
void Graphics_fillCheckerBoard(pGraphics self, Rectangle_int area, | |||
int checkWidth, int checkHeight, | |||
Colour colour1, Colour colour2); | |||
void Graphics_drawRect(pGraphics self, int x, int y, int width, int height, int lineThickness /* = 1 */); | |||
void Graphics_drawRect2(pGraphics self, float x, float y, float width, float height, float lineThickness/* = 1.0f */); | |||
void Graphics_drawRect3(pGraphics self, Rectangle_int rectangle, int lineThickness /* = 1 */); | |||
void Graphics_drawRect4(pGraphics self, Rectangle_float rectangle, float lineThickness /* = 1.0f */); | |||
void Graphics_drawRoundedRectangle(pGraphics self, float x, float y, float width, float height, | |||
float cornerSize, float lineThickness); | |||
void Graphics_drawRoundedRectangle2(pGraphics self, Rectangle_float rectangle, | |||
float cornerSize, float lineThickness); | |||
void Graphics_setPixel(pGraphics self, int x, int y); | |||
void Graphics_fillEllipse(pGraphics self, float x, float y, float width, float height); | |||
void Graphics_fillEllipse2(pGraphics self, Rectangle_float area); | |||
void Graphics_drawEllipse(pGraphics self, float x, float y, float width, float height, | |||
float lineThickness); | |||
void Graphics_drawLine(pGraphics self, float startX, float startY, float endX, float endY); | |||
void Graphics_drawLine2(pGraphics self, float startX, float startY, float endX, float endY, float lineThickness); | |||
void Graphics_drawLine3(pGraphics self, Line_float line); | |||
void Graphics_drawLine4(pGraphics self, Line_float line, float lineThickness); | |||
void Graphics_drawDashedLine(pGraphics self, Line_float line, | |||
const float* dashLengths, int numDashLengths, | |||
float lineThickness /* = 1.0f */, | |||
int dashIndexToStartFrom /* = 0 */); | |||
void Graphics_drawVerticalLine(pGraphics self, int x, float top, float bottom); | |||
void Graphics_drawHorizontalLine(pGraphics self, int y, float left, float right); | |||
void Graphics_fillPath(pGraphics self, pPath path, | |||
AffineTransform transform); | |||
void Graphics_strokePath(pGraphics self, pPath path, | |||
PathStrokeType strokeType, | |||
AffineTransform transform); | |||
void Graphics_drawArrow(pGraphics self, Line_float line, | |||
float lineThickness, | |||
float arrowheadWidth, | |||
float arrowheadLength); | |||
void Graphics_setImageResamplingQuality(pGraphics self, const int newQuality); | |||
void Graphics_drawImageAt(pGraphics self, pImage imageToDraw, int topLeftX, int topLeftY, | |||
bool fillAlphaChannelWithCurrentBrush /* = false */); | |||
void Graphics_drawImage(pGraphics self, pImage imageToDraw, | |||
int destX, int destY, int destWidth, int destHeight, | |||
int sourceX, int sourceY, int sourceWidth, int sourceHeight, | |||
bool fillAlphaChannelWithCurrentBrush /* = false */); | |||
void Graphics_drawImageTransformed(pGraphics self, pImage imageToDraw, | |||
AffineTransform transform, | |||
bool fillAlphaChannelWithCurrentBrush /* = false */); | |||
void Graphics_drawImageWithin(pGraphics self, pImage imageToDraw, | |||
int destX, int destY, int destWidth, int destHeight, | |||
int placementWithinTarget, | |||
bool fillAlphaChannelWithCurrentBrush /* = false */); | |||
Rectangle_int Graphics_getClipBounds(pGraphics self); | |||
bool Graphics_clipRegionIntersects(pGraphics self, Rectangle_int area); | |||
bool Graphics_reduceClipRegion(pGraphics self, int x, int y, int width, int height); | |||
bool Graphics_reduceClipRegion2(pGraphics self, Rectangle_int area); | |||
bool Graphics_reduceClipRegion4(pGraphics self, pPath path, AffineTransform transform); | |||
bool Graphics_reduceClipRegion5(pGraphics self, pImage image, AffineTransform transform); | |||
void Graphics_excludeClipRegion(pGraphics self, Rectangle_int rectangleToExclude); | |||
bool Graphics_isClipEmpty(pGraphics self); | |||
void Graphics_saveState(pGraphics self); | |||
void Graphics_restoreState(pGraphics self); | |||
void Graphics_beginTransparencyLayer(pGraphics self, float layerOpacity); | |||
void Graphics_endTransparencyLayer(pGraphics self); | |||
void Graphics_setOrigin(pGraphics self, Point_int newOrigin); | |||
void Graphics_setOrigin2(pGraphics self, int newOriginX, int newOriginY); | |||
void Graphics_addTransform(pGraphics self, AffineTransform transform); | |||
void Graphics_resetToDefaultState(pGraphics self); | |||
bool Graphics_isVectorDevice(pGraphics self); |
@@ -0,0 +1,163 @@ | |||
pPath Path_new(); | |||
void Path_delete(pPath p); | |||
Rectangle_float Path_getBounds(pPath self); | |||
Rectangle_float Path_getBoundsTransformed (pPath self, AffineTransform transform); | |||
bool Path_contains (pPath self, float x, float y, | |||
float tolerance); | |||
bool Path_contains2 (pPath self, Point_float point, | |||
float tolerance); | |||
bool Path_intersectsLine (pPath self, Line_float line, | |||
float tolerance); | |||
Line_float Path_getClippedLine (pPath self, Line_float line, bool keepSectionOutsidePath); | |||
float Path_getLength (pPath self, AffineTransform transform); | |||
Point_float Path_getPointAlongPath (pPath self, float distanceFromStart, | |||
AffineTransform transform); | |||
float Path_getNearestPoint (pPath self, Point_float targetPoint, | |||
Point_float &pointOnPath, | |||
AffineTransform transform); | |||
void Path_clear(pPath self); | |||
void Path_startNewSubPath (pPath self, float startX, float startY); | |||
void Path_startNewSubPath2 (pPath self, Point_float start); | |||
void Path_closeSubPath(pPath self); | |||
void Path_lineTo (pPath self, float endX, float endY); | |||
void Path_lineTo2 (pPath self, Point_float end); | |||
void Path_quadraticTo (pPath self, float controlPointX, | |||
float controlPointY, | |||
float endPointX, | |||
float endPointY); | |||
void Path_quadraticTo2 (pPath self, Point_float controlPoint, | |||
Point_float endPoint); | |||
void Path_cubicTo (pPath self, float controlPoint1X, | |||
float controlPoint1Y, | |||
float controlPoint2X, | |||
float controlPoint2Y, | |||
float endPointX, | |||
float endPointY); | |||
void Path_cubicTo2 (pPath self, Point_float controlPoint1, | |||
Point_float controlPoint2, | |||
Point_float endPoint); | |||
Point_float Path_getCurrentPosition(pPath self); | |||
void Path_addRectangle (pPath self, float x, float y, float width, float height); | |||
void Path_addRectangle2 (pPath self, Rectangle_float rectangle); | |||
void Path_addRoundedRectangle2 (pPath self, float x, float y, float width, float height, | |||
float cornerSize); | |||
void Path_addRoundedRectangle3 (pPath self, float x, float y, float width, float height, | |||
float cornerSizeX, | |||
float cornerSizeY); | |||
void Path_addRoundedRectangle4 (pPath self, float x, float y, float width, float height, | |||
float cornerSizeX, float cornerSizeY, | |||
bool curveTopLeft, bool curveTopRight, | |||
bool curveBottomLeft, bool curveBottomRight); | |||
void Path_addRoundedRectangle5 (pPath self, Rectangle_float rectangle, float cornerSizeX, float cornerSizeY); | |||
void Path_addRoundedRectangle6 (pPath self, Rectangle_float rectangle, float cornerSize); | |||
void Path_addTriangle (pPath self, float x1, float y1, | |||
float x2, float y2, | |||
float x3, float y3); | |||
void Path_addQuadrilateral (pPath self, float x1, float y1, | |||
float x2, float y2, | |||
float x3, float y3, | |||
float x4, float y4); | |||
void Path_addEllipse (pPath self, float x, float y, float width, float height); | |||
void Path_addArc (pPath self, float x, float y, float width, float height, | |||
float fromRadians, | |||
float toRadians, | |||
bool startAsNewSubPath); | |||
void Path_addCentredArc (pPath self, float centreX, float centreY, | |||
float radiusX, float radiusY, | |||
float rotationOfEllipse, | |||
float fromRadians, | |||
float toRadians, | |||
bool startAsNewSubPath); | |||
void Path_addPieSegment (pPath self, float x, float y, | |||
float width, float height, | |||
float fromRadians, | |||
float toRadians, | |||
float innerCircleProportionalSize); | |||
void Path_addLineSegment (pPath self, Line_float line, float lineThickness); | |||
void Path_addArrow (pPath self, Line_float line, | |||
float lineThickness, | |||
float arrowheadWidth, | |||
float arrowheadLength); | |||
void Path_addPolygon (pPath self, Point_float centre, | |||
int numberOfSides, | |||
float radius, | |||
float startAngle); | |||
void Path_addStar (pPath self, Point_float centre, | |||
int numberOfPoints, | |||
float innerRadius, | |||
float outerRadius, | |||
float startAngle); | |||
void Path_addBubble (pPath self, Rectangle_float bodyArea, | |||
Rectangle_float maximumArea, | |||
Point_float arrowTipPosition, | |||
const float cornerSize, | |||
const float arrowBaseWidth); | |||
void Path_addPath (pPath self, pPath pathToAppend); | |||
void Path_addPath2 (pPath self, pPath pathToAppend, | |||
AffineTransform transformToApply); | |||
void Path_applyTransform (pPath self, AffineTransform transform); | |||
void Path_scaleToFit (pPath self, float x, float y, float width, float height, | |||
bool preserveProportions); | |||
AffineTransform Path_getTransformToScaleToFit (pPath self, float x, float y, float width, float height, | |||
bool preserveProportions, | |||
int justificationType); | |||
AffineTransform Path_getTransformToScaleToFit2 (pPath self, Rectangle_float area, | |||
bool preserveProportions, | |||
int justificationType); | |||
pPath Path_createPathWithRoundedCorners (pPath self, float cornerRadius); | |||
void Path_setUsingNonZeroWinding (pPath self, bool isNonZeroWinding); | |||
bool Path_isUsingNonZeroWinding(pPath self); | |||
void Path_toString(pPath self, char* dest, int bufSize); | |||
void Path_restoreFromString (pPath self, const char *src); |
@@ -0,0 +1,133 @@ | |||
// protojuce/cdefs/typedefs.h | |||
// c structures as exported by protoplug | |||
// included by protojuce.lua | |||
// pointer-structs : | |||
// this is equivalent passing the pointers directly | |||
typedef struct pGraphics | |||
{ void *pointer; } pGraphics; | |||
typedef struct pFillType | |||
{ void *pointer; } pFillType; | |||
typedef struct pColourGradient | |||
{ void *pointer; } pColourGradient; | |||
typedef struct pImage | |||
{ void *pointer; } pImage; | |||
typedef struct pFont | |||
{ void *pointer; } pFont; | |||
typedef struct pPath | |||
{ void *pointer; } pPath; | |||
typedef struct pComponent | |||
{ void *pointer; } pComponent; | |||
//typedef struct pMidiBuffer | |||
//{ void *pointer; } pMidiBuffer; | |||
//typedef struct pMidiBuffer_Iterator | |||
//{ void *pointer; } pMidiBuffer_Iterator; | |||
// accessible structs that get converted to JUCE objects | |||
typedef struct pAudioFormatReader | |||
{ | |||
const void *pointer; | |||
const double sampleRate; | |||
const unsigned int bitsPerSample; | |||
const int64_t lengthInSamples; | |||
const unsigned int numChannels; | |||
const bool usesFloatingPointData; | |||
} pAudioFormatReader; | |||
typedef struct LagrangeInterpolator | |||
{ | |||
float lastInputSamples[5]; | |||
double subSamplePos; | |||
} LagrangeInterpolator; | |||
typedef struct Colour | |||
{ | |||
union | |||
{ | |||
struct { uint8_t b, g, r, a; }; | |||
uint32_t argb; | |||
}; | |||
} Colour; | |||
typedef struct Point_int | |||
{ | |||
int x, y; | |||
} Point_int; | |||
typedef struct Point_float | |||
{ | |||
float x, y; | |||
} Point_float; | |||
typedef struct Line_int | |||
{ | |||
int startx, starty; | |||
int endx, endy; | |||
} Line_int; | |||
typedef struct Line_float | |||
{ | |||
float startx, starty; | |||
float endx, endy; | |||
} Line_float; | |||
typedef struct Rectangle_int | |||
{ | |||
int x, y, w, h; | |||
} Rectangle_int; | |||
typedef struct Rectangle_float | |||
{ | |||
float x, y, w, h; | |||
} Rectangle_float; | |||
typedef struct KeyPress | |||
{ | |||
int keyCode; | |||
int mods; | |||
wchar_t textCharacter; | |||
} KeyPress; | |||
typedef struct AffineTransform | |||
{ | |||
float mat00, mat01, mat02; | |||
float mat10, mat11, mat12; | |||
} AffineTransform; | |||
typedef struct PathStrokeType | |||
{ | |||
float thickness; | |||
int jointStyle; | |||
int endStyle; | |||
} PathStrokeType; | |||
typedef struct MouseEvent | |||
{ | |||
int x, y; | |||
int mods; | |||
pComponent eventComponent; | |||
pComponent originalComponent; | |||
int64_t eventTime; | |||
int64_t mouseDownTime; | |||
Point_int mouseDownPos; | |||
uint8_t numberOfClicks, wasMovedSinceMouseDown; | |||
} MouseEvent; | |||
typedef struct MouseWheelDetails | |||
{ | |||
float deltaX; | |||
float deltaY; | |||
bool isReversed; | |||
bool isSmooth; | |||
} MouseWheelDetails; |
@@ -0,0 +1,70 @@ | |||
--- A simple colour class. | |||
-- Is converted to a [JUCE Colour](http://www.juce.com/api/classColour.html) | |||
-- @classmod juce.Colour | |||
--- Constuctor with classical arguments. | |||
-- @param r red | |||
-- @param g green | |||
-- @param b blue | |||
-- @param[opt] a alpha | |||
-- @within Constructors | |||
-- @constructor | |||
-- @function Colour | |||
--- Constuctor with named arguments. | |||
-- Every field is optional. | |||
-- @tparam table args | |||
-- @param args.r red | |||
-- @param args.g green | |||
-- @param args.b blue, | |||
-- @param args.a alpha | |||
-- @within Constructors | |||
-- @constructor | |||
-- @function Colour | |||
local Colour = setmetatable({}, { | |||
__call = function (self, ...) | |||
local c = {} | |||
c.r, c.g, c.b, c.a = ... | |||
if type(c.r)=="table" then c = c.r end | |||
c.a = c.a or 0xff | |||
return ffi.new("Colour",c) | |||
end | |||
}) | |||
local Colour_mt = { | |||
-- operator '==' | |||
__eq = function(self, rhs) | |||
return self.argb == rhs.argb | |||
end; | |||
} | |||
ffi.metatype("Colour", Colour_mt); | |||
Colour.black = Colour() | |||
Colour.white = Colour(255,255,255) | |||
Colour.red = Colour(255,0,0) | |||
Colour.green = Colour(0,255,0) | |||
Colour.blue = Colour(0,0,255) | |||
--- Red (0-255) | |||
-- @simplefield r | |||
--- Green (0-255) | |||
-- @simplefield g | |||
--- Blue (0-255) | |||
-- @simplefield b | |||
--- Alpha (0-255) | |||
-- @simplefield a | |||
--- @predefined black | |||
--- @predefined white | |||
--- @predefined red | |||
--- @predefined green | |||
--- @predefined blue | |||
return Colour |
@@ -0,0 +1,101 @@ | |||
--- Colour Gradient. | |||
-- Is a pointer to a [JUCE ColourGradient](http://www.juce.com/api/classColourGradient.html) | |||
-- @classmod juce.ColourGradient | |||
ffi.cdef [[ | |||
pColourGradient ColourGradient_new (Colour c1, float x1, float y1, Colour c2, float x2, float y2, bool isRadial); | |||
void ColourGradient_delete (pColourGradient c); | |||
int ColourGradient_addColour (pColourGradient self, double proportionAlongGradient, | |||
Colour colour); | |||
void ColourGradient_removeColour (pColourGradient self, int index); | |||
void ColourGradient_multiplyOpacity (pColourGradient self, float multiplier); | |||
int ColourGradient_getNumColours(pColourGradient self); | |||
Colour ColourGradient_getColour (pColourGradient self, int index); | |||
void ColourGradient_setColour (pColourGradient self, int index, Colour newColour); | |||
Colour ColourGradient_getColourAtPosition (pColourGradient self, double position); | |||
]] | |||
--- Constuctor. | |||
-- @tparam juce.Colour colour1 colour at the beginning of the gradient | |||
-- @param x1 coordinates of colour1 | |||
-- @param y1 coordinates of colour1 | |||
-- @tparam juce.Colour colour2 colour at the end of the gradient | |||
-- @param x2 coordinates of colour2 | |||
-- @param y2 coordinates of colour2 | |||
-- @tparam boolean isRadial whether the gradient should be linear or radial | |||
-- @within Constructors | |||
-- @constructor | |||
-- @function Colour | |||
local function ColourGradient(colour1, x1, y1, colour2, x2, y2, isRadial) | |||
return ffi.gc( | |||
protolib.ColourGradient_new(colour1, x1, y1, colour2, x2, y2, isRadial), | |||
protolib.ColourGradient_delete | |||
) | |||
end | |||
local ColourGradient_mt = { | |||
-- methods | |||
__index = { | |||
--- Add colour. | |||
-- Any number of colours can be added between the start and end of the gradient. | |||
-- @param proportionAlongGradient | |||
-- @tparam juce.Colour colour | |||
-- @return the new colour's index | |||
-- @function addColour | |||
addColour = function (self, proportionAlongGradient, colour) | |||
return protolib.ColourGradient_addColour (self, proportionAlongGradient, colour) | |||
end; | |||
--- Remove colour. | |||
-- @param index colour index between 0 and getNumColours() - 1 | |||
-- @function removeColour | |||
removeColour = function (self, index) | |||
protolib.ColourGradient_removeColour (self, index) | |||
end; | |||
--- Multiply opacity. | |||
-- @param multiplier factor to multiply the alpha values by | |||
-- @function multiplyOpacity | |||
multiplyOpacity = function (self, multiplier) | |||
protolib.ColourGradient_multiplyOpacity (self, multiplier) | |||
end; | |||
--- Get number colour. | |||
-- @return the number of colours | |||
-- @function getNumColours | |||
getNumColours = function (self) | |||
return protolib.ColourGradient_getNumColours(self) | |||
end; | |||
--- Get colour. | |||
-- @param index colour index between 0 and getNumColours() - 1 | |||
-- @treturn juce.Colour the coulour at the specified index | |||
-- @function getColour | |||
getColour = function (self, index) | |||
return protolib.ColourGradient_getColour (self, index) | |||
end; | |||
--- Get colour. | |||
-- @param index colour index between 0 and getNumColours() - 1 | |||
-- @tparam juce.Colour newColour | |||
-- @function setColour | |||
setColour = function (self, index, newColour) | |||
protolib.ColourGradient_setColour (self, index, newColour) | |||
end; | |||
--- Get interpolated colour | |||
-- @param position the position between 0 and 1 | |||
-- @treturn juce.Colour the interpolated colour at the specified position | |||
-- @function getColourAtPosition | |||
getColourAtPosition = function (self, position) | |||
return protolib.ColourGradient_getColourAtPosition (self, position) | |||
end; | |||
}; | |||
} | |||
ffi.metatype("pColourGradient", ColourGradient_mt) | |||
return ColourGradient |
@@ -0,0 +1,73 @@ | |||
--- JUCE Component. | |||
-- Is a pointer to a [JUCE Component](http://www.juce.com/api/classComponent.html) | |||
-- | |||
-- As of now, components can't be created by protoplug scripts. This is mainly | |||
-- for accessing the custom GUI component using @{gui.getComponent}. | |||
-- @classmod juce.Component | |||
ffi.cdef [[ | |||
void Component_repaint(pComponent self); | |||
void Component_repaint2(pComponent self, int x, int y, int width, int height); | |||
void Component_repaint3(pComponent self, Rectangle_int area); | |||
pImage Component_createComponentSnapshot (pComponent self, | |||
Rectangle_int areaToGrab, | |||
bool clipImageToComponentBounds, | |||
float scaleFactor); | |||
]] | |||
local Component_mt = { | |||
-- methods | |||
__index = { | |||
--- Request total repaint. | |||
-- Tell the operating system that the component is "dirty" and needs to be redrawn. | |||
-- The component's paint method will be called asynchronously (@{gui.paint}) | |||
-- @function repaint | |||
--- Request partial repaint. | |||
-- Tell the operating system that a portion of the component is "dirty" and needs to be redrawn. | |||
-- The component's paint method will be called asynchronously (@{gui.paint}). The dirty region will be accessible | |||
-- with Graphics.getClipBounds(). | |||
-- @tparam juce.Rectangle_int area the region needing the be redrawn | |||
-- @function repaint | |||
--- Request partial repaint. | |||
-- Tell the operating system that a portion of the component is "dirty" and needs to be redrawn. | |||
-- The component's paint method will be called asynchronously (@{gui.paint}). The dirty region will be accessible | |||
-- with Graphics.getClipBounds(). | |||
-- @param x the region needing the be redrawn | |||
-- @param y the region needing the be redrawn | |||
-- @param width the region needing the be redrawn | |||
-- @param height the region needing the be redrawn | |||
-- @function repaint | |||
repaint = function (self, ...) | |||
if select("#", ...) == 4 then | |||
protolib.Component_repaint2(self, ...) | |||
elseif select("#", ...) == 1 then | |||
protolib.Component_repaint3(self, ...) | |||
else | |||
protolib.Component_repaint(self) | |||
end | |||
end; | |||
--- Create component snapshot. | |||
-- Paint the component into a virtual buffer and return it as an image. | |||
-- @tparam juce.Rectangle_int areaToGrab the region to the be drawn | |||
-- @param[opt=true] clipImageToComponentBounds | |||
-- @param[opt=1] scaleFactor | |||
-- @treturn juce.Image | |||
-- @function createComponentSnapshot | |||
createComponentSnapshot = function (self, areaToGrab, clipImageToComponentBounds, scaleFactor) | |||
clipImageToComponentBounds = clipImageToComponentBounds or true | |||
scaleFactor = scaleFactor or 1 | |||
local i = protolib.Component_createComponentSnapshot(self, areaToGrab, clipImageToComponentBounds, scaleFactor) | |||
i = ffi.gc(i, protolib.Image_delete) | |||
return i | |||
end | |||
} | |||
} | |||
ffi.metatype("pComponent", Component_mt) | |||
return {} |
@@ -0,0 +1,74 @@ | |||
--- Fill Type. | |||
-- Is a pointer to a [JUCE FillType](http://www.juce.com/api/classFillType.html). | |||
-- Can be used by @{juce.Graphics} for fill operations. | |||
-- @classmod juce.FillType | |||
local Colour = require"include/protojuce/colour" | |||
ffi.cdef [[ | |||
pFillType FillType_new(Colour c); | |||
pFillType FillType_new2(pColourGradient c); | |||
void FillType_delete(pFillType f); | |||
void FillType_setOpacity (pFillType f, float newOpacity); | |||
]] | |||
--- Constuct from a @{juce.Colour}. | |||
-- @tparam juce.Colour Colour | |||
-- @within Constructors | |||
-- @constructor | |||
-- @function FillType | |||
--- Constuct from a @{juce.ColourGradient}. | |||
-- @tparam juce.ColourGradient Gradient | |||
-- @within Constructors | |||
-- @constructor | |||
-- @function FillType | |||
local FillType = setmetatable({}, { | |||
__call = function (self, a) | |||
if ffi.istype("Colour", a) then | |||
return ffi.gc( | |||
protolib.FillType_new(a), | |||
protolib.FillType_delete | |||
) | |||
else -- gradient | |||
return ffi.gc( | |||
protolib.FillType_new2(a), | |||
protolib.FillType_delete | |||
) | |||
end | |||
end | |||
}) | |||
local FillType_mt = { | |||
-- methods | |||
__index = { | |||
--- Set Overall Opacity. | |||
-- @param newOpacity | |||
-- @function setOpacity | |||
setOpacity = function (self, newOpacity) | |||
protolib.FillType_setOpacity(self, newOpacity) | |||
end; | |||
} | |||
} | |||
ffi.metatype("pFillType", FillType_mt) | |||
FillType.black = FillType(Colour.black) | |||
FillType.white = FillType(Colour.white) | |||
FillType.red = FillType(Colour.red) | |||
FillType.green = FillType(Colour.green) | |||
FillType.blue = FillType(Colour.blue) | |||
--- @predefined black | |||
--- @predefined white | |||
--- @predefined red | |||
--- @predefined green | |||
--- @predefined blue | |||
return FillType |
@@ -0,0 +1,43 @@ | |||
--- Font. | |||
-- Is a pointer to a [JUCE Font](http://www.juce.com/api/classFont.html). | |||
-- Can be used by @{juce.Graphics} for text operations. | |||
-- @classmod juce.Font | |||
ffi.cdef [[ | |||
pFont Font_new(const char *typefaceName, float fontHeight, int styleFlags, bool hinted); | |||
void Font_delete(pFont f); | |||
]] | |||
--- Constuctor. | |||
-- Caveat : on OSX and Linux, hinting only works for protoplug's | |||
-- built-in hinted fonts (`DejaVu Sans Mono` and `Source Code Pro`). On | |||
-- Windows it's available for every font. Cross-platform hinting is on the be | |||
-- todo list. | |||
-- @tparam string typefaceName | |||
-- @tparam number fontHeight | |||
-- @param[opt=0] styleFlags any combination of @{styles} | |||
-- @tparam[opt=false] bool hinted | |||
-- @within Constructors | |||
-- @constructor | |||
-- @function Font | |||
local Font = setmetatable({}, { | |||
__call = function (self, typefaceName, fontHeight, styleFlags, hinted) | |||
styleFlags = styleFlags or 0 | |||
hinted = hinted or false; | |||
return ffi.gc( | |||
protolib.Font_new(typefaceName, fontHeight, styleFlags, hinted), | |||
protolib.Font_delete | |||
) | |||
end | |||
}) | |||
--- Font styles. | |||
-- @table juce.Font.styles | |||
Font.styles = { | |||
plain = 0, -- `0` | |||
bold = 1, -- `1` | |||
italic = 2, -- `2` | |||
underlined = 4 -- `4` | |||
} | |||
return Font |
@@ -0,0 +1,140 @@ | |||
Some notes on creating the c++ export header, the c ffi import header, and the lua wrapper from JUCE library code. It's a mix of manual labor and notepad++ regular expression replacements, which was probably faster than doing everything manually or making a full parser and code generator. And it starts with the GNU C preprocessor : | |||
========== JUCE header to c++ export header ========= | |||
cpp -P juce_path.h | |||
manually remove unwanted code, paste PROTO_API in front of desired functions. | |||
Add "self" : | |||
PROTO_API (.*?)\((.*?)\{(.*?)\} | |||
-> | |||
PROTO_API \1\(pPath self, \2\{\3\} | |||
pPath self, ) | |||
(normal mode)-> | |||
pPath self) | |||
Prefix and create exported function bodies : | |||
PROTO_API (.*?) (.*?)\(pPath self(.*?)\)\r\n\{\r\n\r\n\} | |||
-> | |||
PROTO_API \1 Path_\2\(\3\)\r\n\{\r\n\treturn self.p->\2\(\3\)\r\n\} | |||
(, | |||
(normal mode)-> | |||
( | |||
Remove "return" from void function bodies : | |||
PROTO_API void (.*?)return | |||
-> | |||
PROTO_API void \1 | |||
Add "self" in definition arguments : | |||
PROTO_API (.*?)\( | |||
(disable . matches newline)-> | |||
PROTO_API (.*?)\(pPath self, | |||
, ) | |||
) | |||
add the ; which i forgot : | |||
)\r\n} | |||
);\r\n} | |||
Start removing types from function call arguments : | |||
\{([^\}]*?)const (.*?)\} | |||
(repeat until none left)-> | |||
\{\1\2\} | |||
Remove default parameter values from call arguments : | |||
\{([^\}]*?) = (.*?)([,\)])(.*?)\} | |||
-> | |||
\{\1\3\4\} | |||
More removing types and replacing them with conversions (repeat until done) : | |||
\{([^\}]*?)AffineTransform& (.*?)([,)])(.*?)\} | |||
(repeat until none left)-> | |||
\{\1\2\.toJuceAff\(\)\3\4\} | |||
\{([^\}]*?)Point<float> (.*?)([,)])(.*?)\} | |||
\{\1\2\.toJucePoint\(\)\3\4\} | |||
Remove basic types from function call argument lists : | |||
\{([^\}]*?)float (.*?)\} | |||
\{\1\2\} | |||
Replace classes by structs in definition argument lists (and return type) : | |||
PROTO_API ([^\)]*?)const AffineTransform& (.*?)\) | |||
PROTO_API \1exAffineTransform \2\) | |||
PROTO_API ([^\)]*?)const Point<float> (.*?)\) | |||
PROTO_API \1exPoint_float \2\) | |||
========== c++ export header to c ffi import header ========= | |||
Remove ex, eg. exPoint_int -> Point_int : | |||
' ex' | |||
' ' | |||
Remove bodies (mwaha) : | |||
PROTO_API (.*?)\)(.*?)\}\r\n | |||
\1\);\r\n | |||
Remove default values : | |||
= (.*?)([),]) | |||
\2 | |||
========== c ffi import header to lua wrapper ========= | |||
Remove all parameter types : last param : | |||
,([^\),]*?) ([^ ]*?)\) | |||
, \2\) | |||
Remove all paramter types : middle params in a line : | |||
, ([^\), ]*?) ([^ ]*?), | |||
, \2\, | |||
Remove all paramter types : middle params after newline : | |||
\r\n([ ]+)(.*?) (.*?), | |||
\r\n\1\3, | |||
Wrap it ! | |||
\r\n\r\n([^\r\n]*?) Path_(.*?)\((.*?)\); | |||
\2 = function \(\3\)\r\n\treturn\1 protolib\.Path_\2\(\3\)\r\nend;\r\n\r\n | |||
'returnvoid ' | |||
'' | |||
return(.*?) | |||
return | |||
ldoc madness (gradually remove parameters) : | |||
\r\n\t\t(.*?) = function (\(self, | |||
[ \r\n\t]*?([^\) \r\n\t].*?), | |||
[ \r\n\t]*?([^\) \r\n\t].*?), | |||
[ \r\n\t]*?([^\) \r\n\t].*?), | |||
[ \r\n\t]*?([^\) \r\n\t].*?), | |||
[ \r\n\t]*?([^\) \r\n\t].*?), | |||
[ \r\n\t]*?([^\) \r\n\t].*?), | |||
[ \r\n\t]*?([^\) \r\n\t].*?), | |||
[ \r\n\t]*?([^\) \r\n\t].*?), | |||
[ \r\n\t]*?([^\) \r\n\t].*?)\)) | |||
\r\n\t\t--- \1\. | |||
\r\n\t\t-- @param \3 | |||
\r\n\t\t-- @param \4 | |||
\r\n\t\t-- @param \5 | |||
\r\n\t\t-- @param \6 | |||
\r\n\t\t-- @param \7 | |||
\r\n\t\t-- @param \8 | |||
\r\n\t\t-- @param \9 | |||
\r\n\t\t-- @param ${10} | |||
\r\n\t\t-- @param ${11} | |||
\r\n\t\t-- @function \1 | |||
\r\n\t\t\1 = function \2 |
@@ -0,0 +1,777 @@ | |||
--- Graphics drawing target. | |||
-- Is a pointer to a [JUCE Graphics](http://www.juce.com/api/classGraphics.html) object. | |||
-- Received in @{gui.paint} as an argument. | |||
-- @classmod juce.Graphics | |||
local script = require "include/core/script" | |||
local util = require"include/luautil" | |||
util.requireCdef(script.protoplugDir.."/include/protojuce/cdef/graphics.h") | |||
local Justification = require"include/protojuce/justification" | |||
local RectanglePlacement = require"include/protojuce/rectangleplacement" | |||
local AffineTransform = require"include/protojuce/affinetransform" | |||
local Path = require"include/protojuce/path" | |||
local Graphics = setmetatable({}, { | |||
--- Constuct from a @{juce.Image}. | |||
-- Use this constructor to draw directly onto an @{juce.Image} in memory. | |||
-- | |||
-- A typical use is to can create a @{juce.Image} object and use it as a | |||
-- backbuffer for pre-rendering graphics. | |||
-- @tparam juce.Image imageToDrawOnto | |||
-- @within Constructors | |||
-- @constructor | |||
-- @function Graphics | |||
__call = function (self, imageToDrawOnto) | |||
return ffi.gc( | |||
protolib.Graphics_new(imageToDrawOnto), | |||
protolib.Graphics_delete) | |||
end | |||
}) | |||
local Graphics_mt = { | |||
-- methods | |||
__index = { | |||
--- Set working colour. | |||
-- Set the colour to be used for subsequent calls such as @{drawRect} and @{drawText}. | |||
-- @tparam juce.Colour newColour | |||
-- @function setColour | |||
setColour = function (self, newColour) | |||
protolib.Graphics_setColour(self, newColour) | |||
end; | |||
--- Set working opacity. | |||
-- Set the opacity to be used for subsequent calls. | |||
-- @param newOpacity | |||
-- @function setOpacity | |||
setOpacity = function (self, newOpacity) | |||
protolib.Graphics_setOpacity(self, newOpacity) | |||
end; | |||
--- Set working Gradient. | |||
-- Use a gradient as fill for subsequent calls such as @{fillRect}. | |||
-- @tparam juce.ColourGradient gradient | |||
-- @function setGradientFill | |||
setGradientFill = function (self, gradient) | |||
protolib.Graphics_setGradientFill(self, gradient) | |||
end; | |||
--- Set Tiled Image Fill. | |||
-- Use a tiled image as fill for subsequent calls such as @{fillRect}. | |||
-- @tparam juce.Image imageToUse | |||
-- @param anchorX | |||
-- @param anchorY | |||
-- @param opacity | |||
-- @function setTiledImageFill | |||
setTiledImageFill = function (self, imageToUse, | |||
anchorX, anchorY, | |||
opacity) | |||
protolib.Graphics_setTiledImageFill(self, imageToUse, | |||
anchorX, anchorY, | |||
opacity) | |||
end; | |||
--- Set Fill. | |||
-- @tparam juce.FillType newFill | |||
-- @function setFillType | |||
setFillType = function (self, newFill) | |||
protolib.Graphics_setFillType(self, newFill) | |||
end; | |||
--- Set Font. | |||
-- @tparam juce.Font newFont | |||
-- @function setFont | |||
--- Set Font. | |||
-- @tparam number newFontHeight | |||
-- @function setFont | |||
setFont = function (self, newFont) | |||
if type(newFont) == "number" then -- height | |||
protolib.Graphics_setFont2(self, newFont) | |||
else | |||
protolib.Graphics_setFont(self, newFont) | |||
end | |||
end; | |||
--- Get Current Font. | |||
-- treturn juce.Font the current font | |||
-- @function getCurrentFont | |||
getCurrentFont = function (self) | |||
local f = protolib.Graphics_getCurrentFont(self) | |||
f = ffi.gc(f, protolib.Font_delete) | |||
return f | |||
end; | |||
--- Draw single line of text. | |||
-- @tparam string text | |||
-- @param startX | |||
-- @param baselineY | |||
-- @tparam[opt=Justification.left] juce.Justification justification | |||
-- @function drawSingleLineText | |||
drawSingleLineText = function (self, text, | |||
startX, baselineY, | |||
justification) | |||
justification = justification or Justification.left | |||
protolib.Graphics_drawSingleLineText(self, text, | |||
startX, baselineY, | |||
justification) | |||
end; | |||
--- Draw multiline text. | |||
-- @tparam string text | |||
-- @param startX | |||
-- @param baselineY | |||
-- @param maximumLineWidth | |||
-- @function drawMultiLineText | |||
drawMultiLineText = function (self, text, | |||
startX, baselineY, | |||
maximumLineWidth) | |||
protolib.Graphics_drawMultiLineText(self, text, | |||
startX, baselineY, | |||
maximumLineWidth) | |||
end; | |||
--- Draw text. | |||
-- @param x | |||
-- @param y | |||
-- @param width | |||
-- @param height | |||
-- @tparam[opt=Justification.left] juce.Justification justification | |||
-- @param[opt=false] useEllipsesIfTooBig | |||
-- @function drawText | |||
--- Draw text. | |||
-- @tparam juce.Rectangle_int area | |||
-- @tparam[opt=Justification.left] juce.Justification justification | |||
-- @param[opt=false] useEllipsesIfTooBig | |||
-- @function drawText | |||
drawText = function (self, text, ...) | |||
if select('#',...) >= 4 then | |||
local x, y, width, height, justificationType, useEllipsesIfTooBig = ... | |||
justificationType = justificationType or Justification.left | |||
useEllipsesIfTooBig = useEllipsesIfTooBig or false | |||
protolib.Graphics_drawText(self, text, | |||
x, y, width, height, | |||
justificationType, | |||
useEllipsesIfTooBig) | |||
else -- Rectangle_int | |||
local area, justificationType, useEllipsesIfTooBig = ... | |||
justificationType = justificationType or Justification.left | |||
useEllipsesIfTooBig = useEllipsesIfTooBig or false | |||
protolib.Graphics_drawText2(self, text, | |||
area, | |||
justificationType, | |||
useEllipsesIfTooBig) | |||
end | |||
end; | |||
--- Draw fitted text. | |||
-- Awkwardly squishes the font (up to minimumHorizontalScale) if necessary. | |||
-- @param x | |||
-- @param y | |||
-- @param width | |||
-- @param height | |||
-- @tparam juce.Justification justification | |||
-- @param maximumNumberOfLines | |||
-- @param[opt=0.7] minimumHorizontalScale | |||
-- @function drawFittedText | |||
--- Draw fitted text. | |||
-- Awkwardly squishes the font (up to minimumHorizontalScale) if necessary. | |||
-- @tparam juce.Rectangle_int area | |||
-- @tparam juce.Justification justification | |||
-- @param maximumNumberOfLines | |||
-- @param[opt=0.7] minimumHorizontalScale | |||
-- @function drawFittedText | |||
drawFittedText = function (self, text, ...) | |||
if select('#',...) >= 6 then | |||
local x, y, width, height, justificationFlags, maximumNumberOfLines, minimumHorizontalScale = ... | |||
minimumHorizontalScale = minimumHorizontalScale or 0.7 | |||
protolib.Graphics_drawFittedText(self, text, | |||
x, y, width, height, | |||
justificationFlags, | |||
maximumNumberOfLines, | |||
minimumHorizontalScale) | |||
else | |||
local area, justificationFlags, maximumNumberOfLines, minimumHorizontalScale = ... | |||
minimumHorizontalScale = minimumHorizontalScale or 0.7 | |||
protolib.Graphics_drawFittedText2(self, text, | |||
area, | |||
justificationFlags, | |||
maximumNumberOfLines, | |||
minimumHorizontalScale) | |||
end | |||
end; | |||
--- Fill the entire graphics target. | |||
-- @tparam[opt] juce.Colour colourToUse | |||
-- @function fillAll | |||
fillAll = function (self, colourToUse) | |||
if colourToUse then | |||
protolib.Graphics_fillAll2(self, colourToUse) | |||
else | |||
protolib.Graphics_fillAll(self) | |||
end | |||
end; | |||
--- Fill rectangle with current fill type. | |||
-- @param x | |||
-- @param y | |||
-- @param width | |||
-- @param height | |||
-- @function fillRect | |||
--- Fill rectangle with current fill type. | |||
-- @tparam juce.Rectangle_int area | |||
-- @function fillRect | |||
fillRect = function (self, ...) | |||
if select('#',...) == 4 then | |||
local x, y, width, height = ... | |||
protolib.Graphics_fillRect3(self, x, y, width, height) | |||
else | |||
local rectangle = ... | |||
if ffi.istype("Rectangle_int", rectangle) then | |||
protolib.Graphics_fillRect(self, rectangle) | |||
else | |||
protolib.Graphics_fillRect2(self, rectangle) | |||
end | |||
end | |||
end; | |||
fillRect_int = function (self, x, y, width, height) | |||
protolib.Graphics_fillRect3(self, x, y, width, height) | |||
end; | |||
--- Fill rectangle (sub-pixel accuracy). | |||
-- @param x | |||
-- @param y | |||
-- @param width | |||
-- @param height | |||
-- @function fillRect_float | |||
fillRect_float = function (self, x, y, width, height) | |||
protolib.Graphics_fillRect4(self, x, y, width, height) | |||
end; | |||
--- Fill rounded rectangle. | |||
-- @param x | |||
-- @param y | |||
-- @param width | |||
-- @param height | |||
-- @param cornerSize | |||
-- @function fillRoundedRectangle | |||
--- Fill rounded rectangle. | |||
-- @tparam juce.Rectangle_int area | |||
-- @param cornerSize | |||
-- @function fillRoundedRectangle | |||
fillRoundedRectangle = function (self, ...) | |||
if select('#',...) == 5 then | |||
local x, y, width, height, cornerSize = ... | |||
protolib.Graphics_fillRoundedRectangle(self, x, y, width, height, | |||
cornerSize) | |||
else | |||
local rectangle, cornerSize = ... | |||
protolib.Graphics_fillRoundedRectangle2(self, rectangle, | |||
cornerSize) | |||
end | |||
end; | |||
--- Fill *chequerboard*. | |||
-- (and i thought juce used British spelling) | |||
-- @tparam juce.Rectangle_int area | |||
-- @param checkWidth | |||
-- @param checkHeight | |||
-- @tparam juce.Colour colour1 | |||
-- @tparam juce.Colour colour2 | |||
-- @function fillCheckerBoard | |||
fillCheckerBoard = function (self, area, | |||
checkWidth, checkHeight, | |||
colour1, colour2) | |||
protolib.Graphics_fillCheckerBoard(self, area, | |||
checkWidth, checkHeight, | |||
colour1, colour2) | |||
end; | |||
--- Draw rectangle. | |||
-- @param x | |||
-- @param y | |||
-- @param width | |||
-- @param height | |||
-- @param[opt=1] lineThickness | |||
-- @function drawRect | |||
--- Draw rectangle. | |||
-- @tparam juce.Rectangle_int area | |||
-- @param[opt=1] lineThickness | |||
-- @function drawRect | |||
drawRect = function (self, ...) | |||
if select('#',...) >= 4 then | |||
local x, y, width, height, lineThickness = ... | |||
lineThickness = lineThickness or 1 | |||
protolib.Graphics_drawRect(self, x, y, width, height, lineThickness) | |||
else | |||
local rectangle, lineThickness = ... | |||
lineThickness = lineThickness or 1 | |||
protolib.Graphics_drawRect3(self, rectangle, lineThickness) | |||
end | |||
end; | |||
--- Draw rect (sub-pixel accuracy). | |||
-- @param x | |||
-- @param y | |||
-- @param width | |||
-- @param height | |||
-- @param[opt=1] lineThickness | |||
-- @function drawRect_float | |||
--- Draw rect (sub-pixel accuracy). | |||
-- @tparam juce.Rectangle_int area | |||
-- @param[opt=1] lineThickness | |||
-- @function drawRect_float | |||
drawRect_float = function (self, ...) | |||
if select('#',...) >= 4 then | |||
local x, y, width, height, lineThickness = ... | |||
lineThickness = lineThickness or 1 | |||
protolib.Graphics_drawRect2(self, x, y, width, height, lineThickness) | |||
else | |||
local rectangle, lineThickness = ... | |||
lineThickness = lineThickness or 1 | |||
protolib.Graphics_drawRect4(self, rectangle, lineThickness) | |||
end | |||
end; | |||
--- Draw rounded rectangle. | |||
-- @param x | |||
-- @param y | |||
-- @param width | |||
-- @param height | |||
-- @param cornerSize | |||
-- @param[opt=1] lineThickness | |||
-- @function drawRoundedRectangle | |||
--- Draw rounded rectangle. | |||
-- @tparam juce.Rectangle_int area | |||
-- @param cornerSize | |||
-- @param[opt=1] lineThickness | |||
-- @function drawRoundedRectangle | |||
drawRoundedRectangle = function (self, ...) | |||
if select('#',...) >= 5 then | |||
local x, y, width, height, cornerSize, lineThickness = ... | |||
lineThickness = lineThickness or 1 | |||
protolib.Graphics_drawRoundedRectangle(self, x, y, width, height, cornerSize, lineThickness) | |||
else | |||
local rectangle, cornerSize, lineThickness = ... | |||
lineThickness = lineThickness or 1 | |||
protolib.Graphics_drawRoundedRectangle2(self, rectangle, cornerSize, lineThickness) | |||
end | |||
end; | |||
--- Set pixel with current colour. | |||
-- @param x | |||
-- @param y | |||
-- @function setPixel | |||
setPixel = function (self, x, y) | |||
protolib.Graphics_setPixel(self, x, y) | |||
end; | |||
--- Fill ellipse with current fill. | |||
-- @param x | |||
-- @param y | |||
-- @param width | |||
-- @param height | |||
-- @function fillEllipse | |||
fillEllipse = function (self, ...) | |||
if select('#',...) == 4 then | |||
local x, y, width, height = ... | |||
protolib.Graphics_fillEllipse(self, x, y, width, height) | |||
else | |||
local area = ... | |||
protolib.Graphics_fillEllipse2(self, area) | |||
end | |||
end; | |||
--- Draw ellipse with current colour. | |||
-- @param x | |||
-- @param y | |||
-- @param width | |||
-- @param height | |||
-- @param[opt=1] lineThickness | |||
-- @function drawEllipse | |||
drawEllipse = function (self, x, y, width, height, | |||
lineThickness) | |||
lineThickness = lineThickness or 1 | |||
protolib.Graphics_drawEllipse(self, x, y, width, height, | |||
lineThickness) | |||
end; | |||
--- Draw line. | |||
-- @param startX | |||
-- @param startY | |||
-- @param endX | |||
-- @param endY | |||
-- @param[opt=1] lineThickness | |||
-- @function drawLine | |||
--- Draw line. | |||
-- @tparam juce.Line line | |||
-- @param[opt=1] lineThickness | |||
-- @function drawLine | |||
drawLine = function (self, ...) | |||
if select('#',...) == 4 then | |||
local startX, startY, endX, endY = ... | |||
protolib.Graphics_drawLine(self, startX, startY, endX, endY) | |||
elseif select('#',...) == 5 then | |||
local startX, startY, endX, endY, lineThickness = ... | |||
protolib.Graphics_drawLine2(self, startX, startY, endX, endY, lineThickness) | |||
elseif select('#',...) == 1 then | |||
local line = ... | |||
protolib.Graphics_drawLine3(self, line) | |||
else | |||
local line, lineThickness = ... | |||
protolib.Graphics_drawLine4(self, line, lineThickness) | |||
end | |||
end; | |||
--- Draw dashed line. | |||
-- @tparam juce.Line line | |||
-- @param dashLengths (const float* ctype) | |||
-- @param numDashLengths | |||
-- @param[opt=1] lineThickness | |||
-- @param[opt=0] dashIndexToStartFrom | |||
-- @function drawDashedLine | |||
drawDashedLine = function (self, line, | |||
dashLengths, numDashLengths, | |||
lineThickness, | |||
dashIndexToStartFrom) | |||
lineThickness = lineThickness or 1 | |||
dashIndexToStartFrom = dashIndexToStartFrom or 0 | |||
protolib.Graphics_drawDashedLine(self, line, | |||
dashLengths, numDashLengths, | |||
lineThickness, | |||
dashIndexToStartFrom) | |||
end; | |||
--- Draw vertical line. | |||
-- @param x | |||
-- @param top | |||
-- @param bottom | |||
-- @function drawVerticalLine | |||
drawVerticalLine = function (self, x, top, bottom) | |||
protolib.Graphics_drawVerticalLine(self, x, top, bottom) | |||
end; | |||
--- Draw horizontal line. | |||
-- @param y | |||
-- @param left | |||
-- @param right | |||
-- @function drawHorizontalLine | |||
drawHorizontalLine = function (self, y, left, right) | |||
protolib.Graphics_drawHorizontalLine(self, y, left, right) | |||
end; | |||
--- Fill path. | |||
-- @tparam juce.Path path | |||
-- @tparam[opt=juce.AffineTransform.identity] juce.AffineTransform transform | |||
-- @function fillPath | |||
fillPath = function (self, path, | |||
transform) | |||
transform = transform or AffineTransform.identity | |||
protolib.Graphics_fillPath(self, path, | |||
transform) | |||
end; | |||
--- Stroke path. | |||
-- All named arguments are optional | |||
-- @tparam juce.Path path | |||
-- @param[opt] args | |||
-- @param args.thickness | |||
-- @tparam juce.Path.JointStyle args.jointStyle *default* : juce.Path.JointStyle.mitered | |||
-- @tparam juce.Path.EndCapStyle args.endCapStyle *default* : juce.Path.EndCapStyle.butt | |||
-- @tparam juce.AffineTransform args.transform *default* : juce.AffineTransform.identity | |||
-- @function strokePath | |||
strokePath = function (self, path, args) | |||
args = args or {} | |||
args.thickness = args.thickness or 1 | |||
args.jointStyle = args.jointStyle or Path.JointStyle.mitered | |||
args.endCapStyle = args.endCapStyle or Path.EndCapStyle.butt | |||
args.transform = args.transform or AffineTransform.identity | |||
local strokeType = ffi.new("PathStrokeType", args.thickness, args.jointStyle, args.endCapStyle) | |||
protolib.Graphics_strokePath(self, path, | |||
strokeType, | |||
args.transform) | |||
end; | |||
--- Draw arrow. | |||
-- @tparam juce.Line line | |||
-- @param lineThickness | |||
-- @param arrowheadWidth | |||
-- @param arrowheadLength | |||
-- @function drawArrow | |||
drawArrow = function (self, line, | |||
lineThickness, | |||
arrowheadWidth, | |||
arrowheadLength) | |||
protolib.Graphics_drawArrow(self, line, | |||
lineThickness, | |||
arrowheadWidth, | |||
arrowheadLength) | |||
end; | |||
--- Set image resampling quality. | |||
-- @tparam juce.Graphics.ResamplingQuality newQuality | |||
-- @function setImageResamplingQuality | |||
setImageResamplingQuality = function (self, newQuality) | |||
protolib.Graphics_setImageResamplingQuality(self, newQuality) | |||
end; | |||
--- Draw unscaled image at location. | |||
-- @tparam juce.Image imageToDraw | |||
-- @param topLeftX | |||
-- @param topLeftY | |||
-- @param[opt=false] fillAlphaChannelWithCurrentBrush | |||
-- @function drawImageAt | |||
drawImageAt = function (self, imageToDraw, topLeftX, topLeftY, | |||
fillAlphaChannelWithCurrentBrush) | |||
fillAlphaChannelWithCurrentBrush = fillAlphaChannelWithCurrentBrush or false | |||
protolib.Graphics_drawImageAt(self, imageToDraw, topLeftX, topLeftY, | |||
fillAlphaChannelWithCurrentBrush) | |||
end; | |||
--- Draw a portion of an image, stretched into a target rectangle. | |||
-- @tparam juce.Image imageToDraw | |||
-- @param destX | |||
-- @param destY | |||
-- @param destWidth | |||
-- @param destHeight | |||
-- @param sourceX | |||
-- @param sourceY | |||
-- @param sourceWidth | |||
-- @param sourceHeight | |||
-- @param[opt=false] fillAlphaChannelWithCurrentBrush | |||
-- @function drawImage | |||
drawImage = function (self, imageToDraw, | |||
destX, destY, destWidth, destHeight, | |||
sourceX, sourceY, sourceWidth, sourceHeight, | |||
fillAlphaChannelWithCurrentBrush) | |||
fillAlphaChannelWithCurrentBrush = fillAlphaChannelWithCurrentBrush or false | |||
protolib.Graphics_drawImage(self, imageToDraw, | |||
destX, destY, destWidth, destHeight, | |||
sourceX, sourceY, sourceWidth, sourceHeight, | |||
fillAlphaChannelWithCurrentBrush) | |||
end; | |||
--- Draw transformed image. | |||
-- @tparam juce.Image imageToDraw | |||
-- @tparam juce.AffineTransform transform | |||
-- @param[opt=false] fillAlphaChannelWithCurrentBrush | |||
-- @function drawImageTransformed | |||
drawImageTransformed = function (self, imageToDraw, | |||
transform, | |||
fillAlphaChannelWithCurrentBrush) | |||
fillAlphaChannelWithCurrentBrush = fillAlphaChannelWithCurrentBrush or false | |||
protolib.Graphics_drawImageTransformed(self, imageToDraw, | |||
transform, | |||
fillAlphaChannelWithCurrentBrush) | |||
end; | |||
--- Draw image within. | |||
-- @tparam juce.Image imageToDraw | |||
-- @param destX | |||
-- @param destY | |||
-- @param destWidth | |||
-- @param destHeight | |||
-- @param[opt=juce.RectanglePlacement.centred] placementWithinTarget | |||
-- @param[opt=false] fillAlphaChannelWithCurrentBrush | |||
-- @function drawImageWithin | |||
drawImageWithin = function (self, imageToDraw, | |||
destX, destY, destWidth, destHeight, | |||
placementWithinTarget, | |||
fillAlphaChannelWithCurrentBrush) | |||
fillAlphaChannelWithCurrentBrush = fillAlphaChannelWithCurrentBrush or false | |||
placementWithinTarget = placementWithinTarget or RectanglePlacement.centred | |||
protolib.Graphics_drawImageWithin(self, imageToDraw, | |||
destX, destY, destWidth, destHeight, | |||
placementWithinTarget, | |||
fillAlphaChannelWithCurrentBrush) | |||
end; | |||
--- Get clip bounds. | |||
-- Get the portion of the graphics target that needs to be redrawn. | |||
-- @treturn juce.Rectangle_int Clipping area | |||
-- @function getClipBounds | |||
getClipBounds = function (self) | |||
return protolib.Graphics_getClipBounds(self) | |||
end; | |||
--- Clip region intersects. | |||
-- Check if a rectangle intersects with the redrawing region | |||
-- @treturn juce.Rectangle_int Clipping area | |||
-- @treturn boolean intersection check | |||
-- @function clipRegionIntersects | |||
clipRegionIntersects = function (self, area) | |||
return protolib.Graphics_clipRegionIntersects(self, area) | |||
end; | |||
reduceClipRegion = function (self, ...) | |||
local control = select(1, ...) | |||
if type(control)=="number" then | |||
local x, y, width, height = ... | |||
return protolib.Graphics_reduceClipRegion(self, x, y, width, height) | |||
elseif ffi.istype("Rectangle_int", control) then | |||
local area = ... | |||
return protolib.Graphics_reduceClipRegion2(self, area) | |||
elseif ffi.istype("pPath", control) then | |||
local path, transform = ... | |||
transform = transform or AffineTransform.identity | |||
return protolib.Graphics_reduceClipRegion4(self, path, transform) | |||
else -- pImage | |||
local image, transform = ... | |||
return protolib.Graphics_reduceClipRegion5(self, image, transform) | |||
end | |||
end; | |||
excludeClipRegion = function (self, rectangleToExclude) | |||
protolib.Graphics_excludeClipRegion(self, rectangleToExclude) | |||
end; | |||
--- Is clipping region empty. | |||
-- @treturn boolean whether the redrawing area is empty | |||
-- @function isClipEmpty | |||
isClipEmpty = function (self) | |||
return protolib.Graphics_isClipEmpty(self) | |||
end; | |||
--- Save state. | |||
-- Saves the current state of the graphics target on a stack. | |||
-- This does not save the actual graphic's contents but its current | |||
-- colour, transform, origin, etc. | |||
-- @function saveState | |||
saveState = function (self) | |||
protolib.Graphics_saveState(self) | |||
end; | |||
--- Restore state. | |||
-- Restores a state of the graphics target from the stack. | |||
-- Useful to cancel any previous uses | |||
-- of @{addTransform}, @{setColour}, etc. | |||
-- @function restoreState | |||
restoreState = function (self) | |||
protolib.Graphics_restoreState(self) | |||
end; | |||
--- Begin transparency layer. | |||
-- Saves the current state and begins drawing on a temporary layer, | |||
-- to be applied with the specified final transparency. | |||
-- @function beginTransparencyLayer | |||
beginTransparencyLayer = function (self, layerOpacity) | |||
protolib.Graphics_beginTransparencyLayer(self, layerOpacity) | |||
end; | |||
--- End transparency layer. | |||
-- Applies the transparency layer that was started with @{beginTransparencyLayer}. | |||
-- @function endTransparencyLayer | |||
endTransparencyLayer = function (self) | |||
protolib.Graphics_endTransparencyLayer(self) | |||
end; | |||
--no | |||
-- Set origin. tparam juce.Point newOrigin function setOrigin | |||
--- Set origin. | |||
-- @param newOriginX | |||
-- @param newOriginY | |||
-- @function setOrigin | |||
setOrigin = function (self, ...) | |||
if select("#", ...) == 1 then | |||
protolib.Graphics_setOrigin(self, ...) | |||
else | |||
protolib.Graphics_setOrigin2(self, ...) | |||
end | |||
end; | |||
--- Add a transformation matrix. | |||
-- The matrix will be chained onto the current one, and affect all | |||
-- subsequent graphics operations. Use @{saveState} and @{restoreState} | |||
-- to apply a temporary transform. | |||
-- @tparam juce.AffineTransform transform | |||
-- @function addTransform | |||
addTransform = function (self, transform) | |||
protolib.Graphics_addTransform(self, transform) | |||
end; | |||
--- Reset to default state. | |||
-- @function resetToDefaultState | |||
resetToDefaultState = function (self) | |||
protolib.Graphics_resetToDefaultState(self) | |||
end; | |||
--- Is vector device. | |||
-- @treturn boolean whether the target is a vector device. | |||
-- @function isVectorDevice | |||
isVectorDevice = function (self) | |||
return protolib.Graphics_isVectorDevice(self) | |||
end; | |||
} | |||
} | |||
--- Resampling qualities. | |||
-- @table juce.Graphics.ResamplingQuality | |||
Graphics.ResamplingQuality = | |||
{ | |||
low = 0; | |||
medium = 1; | |||
high = 2 | |||
}; | |||
ffi.metatype("pGraphics", Graphics_mt); | |||
return Graphics |
@@ -0,0 +1,74 @@ | |||
--- Image. | |||
-- Images can be loaded from a file, or created as temporary graphics targets. | |||
-- | |||
-- Is a pointer to a [JUCE Image](http://www.juce.com/api/classImage.html), | |||
-- and wraps some [JUCE ImageFileFormat](http://www.juce.com/api/classImageFileFormat.html) | |||
-- functionality. | |||
-- @classmod juce.Image | |||
ffi.cdef [[ | |||
pImage Image_new(); | |||
pImage Image_new2(int pixelFormat, int imageWidth, int imageHeight, bool clearImage); | |||
void Image_delete(pImage i); | |||
bool Image_isValid(pImage i); | |||
pImage ImageFileFormat_loadFrom2(const char *filename); | |||
]] | |||
local Image = setmetatable ({}, { | |||
--- Load an image from a file. | |||
-- The path can be absolute or relative to the protoplug directory. | |||
-- To check if the file was loaded successfully, use @{isValid}. | |||
-- @param filename | |||
-- @within Constructors | |||
-- @constructor | |||
-- @function Image | |||
--- Create a temporary in-memory image. | |||
-- @tparam juce.Image.PixelFormat pixelFormat | |||
-- @param imageWidth | |||
-- @param imageHeight | |||
-- @tparam boolean clearImage fill the image with black | |||
-- @within Constructors | |||
-- @constructor | |||
-- @function Image | |||
__call = function(self, ...) | |||
if select("#", ...)==4 then | |||
return ffi.gc( | |||
protolib.Image_new2(...), | |||
protolib.Image_delete | |||
) | |||
else | |||
return ffi.gc( | |||
protolib.ImageFileFormat_loadFrom2(...), | |||
protolib.Image_delete | |||
) | |||
end | |||
end; | |||
}) | |||
local Image_mt = { | |||
-- methods | |||
__index = { | |||
--- Check Image validity. | |||
-- @treturn boolean whether the image is valid and can be used. | |||
-- @function isValid | |||
isValid = function (self) | |||
return protolib.Image_isValid(self) | |||
end; | |||
} | |||
} | |||
ffi.metatype("pImage", Image_mt); | |||
--- Pixel formats. | |||
-- @table juce.Image.PixelFormat | |||
Image.PixelFormat = { | |||
UnknownFormat = 0; -- 0 | |||
RGB = 1; -- 1 | |||
ARGB = 2; -- 2 | |||
SingleChannel = 3 -- 3 | |||
} | |||
return Image |
@@ -0,0 +1,26 @@ | |||
--- Justification. | |||
-- Is converted to a [JUCE Justification](http://www.juce.com/api/Justification.html) | |||
-- @classmod juce.Justification | |||
--- Justification Constants. | |||
-- @table juce.Justification | |||
local r = { | |||
left = 1; | |||
right = 2; | |||
horizontallyCentred = 4; | |||
top = 8; | |||
bottom = 16; | |||
verticallyCentred = 32; | |||
horizontallyJustified = 64; | |||
centred = 36; | |||
centredLeft = 33; | |||
centredRight = 34; | |||
centredTop = 12; | |||
centredBottom = 20; | |||
topLeft = 9; | |||
topRight = 10; | |||
bottomLeft = 17; | |||
bottomRight = 18 | |||
} | |||
return r |
@@ -0,0 +1,41 @@ | |||
--- Lagrange Interpolator. | |||
-- Is converted to a [JUCE LagrangeInterpolator](http://www.juce.com/api/classLagrangeInterpolator.html) | |||
-- @classmod juce.LagrangeInterpolator | |||
ffi.cdef [[ | |||
LagrangeInterpolator LagrangeInterpolator_create(); | |||
int LagrangeInterpolator_process(LagrangeInterpolator ex, | |||
double speedRatio, | |||
const float* inputSamples, | |||
float* outputSamples, | |||
int numOutputSamplesToProduce); | |||
]] | |||
--- Constuctor. | |||
-- @within Constructors | |||
-- @constructor | |||
-- @function LagrangeInterpolator | |||
local LagrangeInterpolator = setmetatable({}, { | |||
__call = function (self) | |||
return protolib.LagrangeInterpolator_create() | |||
end | |||
}) | |||
local LagrangeInterpolator_mt = { | |||
-- methods | |||
__index = { | |||
--- Interpolate. | |||
-- @param speedRatio number of input samples per output sample (input/output) | |||
-- @param inputSamples pointer to a cdata `float` array | |||
-- @param outputSamples pointer to a cdata `float` array | |||
-- @param numOutputSamplesToProduce | |||
-- @treturn number number of input samples that were processed | |||
-- @function process | |||
process = function (self, speedRatio, inputSamples, outputSamples, numOutputSamplesToProduce) | |||
return protolib.LagrangeInterpolator_process(self, speedRatio, inputSamples, outputSamples, numOutputSamplesToProduce) | |||
end; | |||
} | |||
} | |||
ffi.metatype("LagrangeInterpolator", LagrangeInterpolator_mt); | |||
return LagrangeInterpolator |
@@ -0,0 +1,50 @@ | |||
--- Line. | |||
-- Is converted to a [JUCE Line](http://www.juce.com/api/classLine.html) | |||
-- @classmod juce.Line | |||
--- Constuctor | |||
-- @param x1 | |||
-- @param y1 | |||
-- @param x2 | |||
-- @param y2 | |||
-- @within Constructors | |||
-- @constructor | |||
-- @function Line | |||
--- Constuctor | |||
-- @param args | |||
-- @param args.x1 | |||
-- @param args.y1 | |||
-- @param args.x2 | |||
-- @param args.y2 | |||
-- @within Constructors | |||
-- @constructor | |||
-- @function Line | |||
local Line = ffi.typeof("Line_float") | |||
local Line_mt = { | |||
-- operator '==' | |||
__eq = function(self, rhs) | |||
return self.x1 == rhs.x1 and | |||
self.y1 == rhs.y1 and | |||
self.x2 == rhs.x2 and | |||
self.y2 == rhs.y2 | |||
end; | |||
} | |||
ffi.metatype(Line, Line_mt) | |||
--- Point 1 X position | |||
-- @simplefield x1 | |||
--- Point 1 Y position | |||
-- @simplefield y1 | |||
--- Point 2 X position | |||
-- @simplefield x2 | |||
--- Point 2 Y position | |||
-- @simplefield y2 | |||
return Line |
@@ -0,0 +1,586 @@ | |||
--- Path. | |||
-- Is a pointer to a [JUCE Path](http://www.juce.com/api/classPath.html). | |||
-- @classmod juce.Path | |||
local script = require "include/core/script" | |||
local Point = require"include/protojuce/point" | |||
local AffineTransform = require"include/protojuce/affinetransform" | |||
local util = require"include/luautil" | |||
util.requireCdef(script.protoplugDir.."/include/protojuce/cdef/path.h") | |||
--- Constuctor | |||
-- @within Constructors | |||
-- @constructor | |||
-- @function Path | |||
local Path_mt = { | |||
-- methods | |||
__index = { | |||
--- Get bounds. | |||
-- @treturn Rectangle_float rectangle containing the path | |||
-- @function getBounds | |||
getBounds = function (self) | |||
return protolib.Path_getBounds(self) | |||
end; | |||
--- Get bounds transformed. | |||
-- @tparam juce.AffineTransform transform | |||
-- @treturn Rectangle_float rectangle containing the transformed path | |||
-- @function getBoundsTransformed | |||
getBoundsTransformed = function (self, transform) | |||
return protolib.Path_getBoundsTransformed (self, transform) | |||
end; | |||
--- Contains. | |||
-- @param pointX | |||
-- @param pointY | |||
-- @param[opt=1] tolerance | |||
-- @treturn boolean whether the path contains the point | |||
-- @see closeSubPath | |||
-- @function contains | |||
--- Contains. | |||
-- @tparam juce.Point point | |||
-- @param[opt=1] tolerance | |||
-- @treturn boolean whether the path contains the point | |||
-- @see closeSubPath | |||
-- @function contains | |||
contains = function (self, ...) | |||
local control = ... | |||
tolerance = tolerance or 1 | |||
if type(control)=="number" then | |||
return protolib.Path_contains (self, ...) | |||
else | |||
return protolib.Path_contains2 (self, ...) | |||
end | |||
end; | |||
--- Intersects line. | |||
-- @tparam juce.Line line | |||
-- @param[opt=1] tolerance | |||
-- @treturn boolean whether the path intersects the line | |||
-- @function intersectsLine | |||
intersectsLine = function (self, line, tolerance) | |||
tolerance = tolerance or 1 | |||
return protolib.Path_intersectsLine (self, line, tolerance) | |||
end; | |||
--- Get clipped line. | |||
-- @tparam juce.Line line | |||
-- @tparam boolean keepSectionOutsidePath | |||
-- @treturn juce.Line_float the line clipped by the path | |||
-- @function getClippedLine | |||
getClippedLine = function (self, line, keepSectionOutsidePath) | |||
return protolib.Path_getClippedLine (self, line, keepSectionOutsidePath) | |||
end; | |||
--- Get length. | |||
-- @tparam[opt=juce.AffineTransform.identity] juce.AffineTransform transform | |||
-- @return length of the path | |||
-- @function getLength | |||
getLength = function (self, transform) | |||
transform = transform or AffineTransform.identity | |||
return protolib.Path_getLength (self, transform) | |||
end; | |||
--- Get point along path. | |||
-- @param distanceFromStart | |||
-- @tparam[opt=juce.AffineTransform.identity] juce.AffineTransform transform | |||
-- @treturn Point_float the point on the path | |||
-- @function getPointAlongPath | |||
getPointAlongPath = function (self, distanceFromStart, transform) | |||
transform = transform or AffineTransform.identity | |||
return protolib.Path_getPointAlongPath (self, distanceFromStart, transform) | |||
end; | |||
--- Get nearest point. | |||
-- Get the nearest on-path point to an arbitrary point, and | |||
-- the distance between the points | |||
-- @tparam juce.Point targetPoint | |||
-- @tparam[opt=juce.AffineTransform.identity] juce.AffineTransform transform | |||
-- @return distance | |||
-- @treturn juce.Point pointOnPath | |||
-- @function getNearestPoint | |||
getNearestPoint = function (self, targetPoint, | |||
transform) | |||
transform = transform or AffineTransform.identity | |||
local pointOnPath = Point() | |||
local distance = protolib.Path_getNearestPoint (self, targetPoint, | |||
pointOnPath, | |||
transform) | |||
return distance, pointOnPath | |||
end; | |||
--- Clear. | |||
-- @function clear | |||
clear = function (self) | |||
protolib.Path_clear(self) | |||
end; | |||
--- Start new sub path. | |||
-- @param startX | |||
-- @param startY | |||
-- @function startNewSubPath | |||
--- Start new sub path. | |||
-- @tparam juce.Point start | |||
-- @function startNewSubPath | |||
startNewSubPath = function (self, ...) | |||
local control = ... | |||
if type(control)=="number" then | |||
protolib.Path_startNewSubPath (self, ...) | |||
else | |||
protolib.Path_startNewSubPath2 (self, ...) | |||
end | |||
end; | |||
--- Close sub path. | |||
-- @function closeSubPath | |||
closeSubPath = function (self) | |||
protolib.Path_closeSubPath(self) | |||
end; | |||
--- Line to. | |||
-- @param endX | |||
-- @param endY | |||
-- @function lineTo | |||
--- Line to. | |||
-- @tparam juce.Point endpoint | |||
-- @function lineTo | |||
lineTo = function (self, ...) | |||
local control = ... | |||
if type(control)=="number" then | |||
protolib.Path_lineTo (self, ...) | |||
else | |||
protolib.Path_lineTo2 (self, ...) | |||
end | |||
end; | |||
--- Quadratic to. | |||
-- @param controlPointX | |||
-- @param controlPointY | |||
-- @param endPointX | |||
-- @param endPointY | |||
-- @function quadraticTo | |||
--- Quadratic to2. | |||
-- @tparam juce.Point controlPoint | |||
-- @tparam juce.Point endPoint | |||
-- @function quadraticTo2 | |||
quadraticTo = function (self, ...) | |||
local control = ... | |||
if type(control)=="number" then | |||
protolib.Path_quadraticTo (self, ...) | |||
else | |||
protolib.Path_quadraticTo2 (self, ...) | |||
end | |||
end; | |||
--- Cubic to. | |||
-- @param controlPoint1X | |||
-- @param controlPoint1Y | |||
-- @param controlPoint2X | |||
-- @param controlPoint2Y | |||
-- @param endPointX | |||
-- @param endPointY | |||
-- @function cubicTo | |||
--- Cubic to. | |||
-- @tparam juce.Point controlPoint1 | |||
-- @tparam juce.Point controlPoint2 | |||
-- @tparam juce.Point endPoint | |||
-- @function cubicTo | |||
cubicTo = function (self, ...) | |||
local control = ... | |||
if type(control)=="number" then | |||
protolib.Path_cubicTo (self, ...) | |||
else | |||
protolib.Path_cubicTo2 (self, ...) | |||
end | |||
end; | |||
--- Get current position. | |||
-- @treturn juce.Point the current path construction position | |||
-- @function getCurrentPosition | |||
getCurrentPosition = function (self) | |||
return protolib.Path_getCurrentPosition(self) | |||
end; | |||
--- Add rectangle. | |||
-- @param x | |||
-- @param y | |||
-- @param width | |||
-- @param height | |||
-- @function addRectangle | |||
--- Add rectangle. | |||
-- @tparam juce.Rectangle_float rectangle | |||
-- @function addRectangle | |||
addRectangle = function (self, ...) | |||
local control = ... | |||
if type(control)=="number" then | |||
protolib.Path_addRectangle (self, ...) | |||
else | |||
protolib.Path_addRectangle2 (self, ...) | |||
end | |||
end; | |||
--- Add rounded rectangle. | |||
-- @param x | |||
-- @param y | |||
-- @param width | |||
-- @param height | |||
-- @param cornerSize | |||
-- @function addRoundedRectangle | |||
--- Add rounded rectangle. | |||
-- @param x | |||
-- @param y | |||
-- @param width | |||
-- @param height | |||
-- @param cornerSizeX | |||
-- @param cornerSizeY | |||
-- @function addRoundedRectangle | |||
--- Add rounded rectangle. | |||
-- @param x | |||
-- @param y | |||
-- @param width | |||
-- @param height | |||
-- @param cornerSizeX | |||
-- @param cornerSizeY | |||
-- @tparam boolean curveTopLeft | |||
-- @tparam boolean curveTopRight | |||
-- @tparam boolean curveBottomLeft | |||
-- @tparam boolean curveBottomRight | |||
-- @function addRoundedRectangle | |||
--- Add rounded rectangle. | |||
-- @tparam juce.Rectangle_float rectangle | |||
-- @param cornerSizeX | |||
-- @param cornerSizeY | |||
-- @function addRoundedRectangle | |||
--- Add rounded rectangle. | |||
-- @tparam juce.Rectangle_float rectangle | |||
-- @param cornerSize | |||
-- @function addRoundedRectangle | |||
addRoundedRectangle = function (self, ...) | |||
if select('#',...) == 5 then | |||
protolib.Path_addRoundedRectangle2 (self, ...) | |||
elseif select('#',...) == 6 then | |||
protolib.Path_addRoundedRectangle3 (self, ...) | |||
elseif select('#',...) == 10 then | |||
protolib.Path_addRoundedRectangle4 (self, ...) | |||
elseif select('#',...) == 3 then | |||
protolib.Path_addRoundedRectangle5 (self, ...) | |||
elseif select('#',...) == 2 then | |||
protolib.Path_addRoundedRectangle6 (self, ...) | |||
end | |||
end; | |||
--- Add triangle. | |||
-- @param x1 | |||
-- @param y1 | |||
-- @param x2 | |||
-- @param y2 | |||
-- @param x3 | |||
-- @param y3 | |||
-- @function addTriangle | |||
addTriangle = function (self, x1, y1, | |||
x2, y2, | |||
x3, y3) | |||
protolib.Path_addTriangle (self, x1, y1, | |||
x2, y2, | |||
x3, y3) | |||
end; | |||
--- Add quadrilateral. | |||
-- @param x1 | |||
-- @param y1 | |||
-- @param x2 | |||
-- @param y2 | |||
-- @param x3 | |||
-- @param y3 | |||
-- @param x4 | |||
-- @param y4 | |||
-- @function addQuadrilateral | |||
addQuadrilateral = function (self, x1, y1, | |||
x2, y2, | |||
x3, y3, | |||
x4, y4) | |||
protolib.Path_addQuadrilateral (self, x1, y1, | |||
x2, y2, | |||
x3, y3, | |||
x4, y4) | |||
end; | |||
--- Add ellipse. | |||
-- @param x | |||
-- @param y | |||
-- @param width | |||
-- @param height | |||
-- @function addEllipse | |||
addEllipse = function (self, x, y, width, height) | |||
protolib.Path_addEllipse (self, x, y, width, height) | |||
end; | |||
--- Add arc. | |||
-- @param x | |||
-- @param y | |||
-- @param width | |||
-- @param height | |||
-- @param fromRadians the start angle, clockwise from the top | |||
-- @param toRadians the end angle | |||
-- @param[opt=false] startAsNewSubPath | |||
-- @function addArc | |||
addArc = function (self, x, y, width, height, | |||
fromRadians, | |||
toRadians, startAsNewSubPath) | |||
startAsNewSubPath = startAsNewSubPath or false | |||
protolib.Path_addArc (self, x, y, width, height, | |||
fromRadians, | |||
toRadians, startAsNewSubPath) | |||
end; | |||
--- Add centred arc. | |||
-- @param centreX | |||
-- @param centreY | |||
-- @param radiusX | |||
-- @param radiusY | |||
-- @param rotationOfEllipse the ellipse inclination | |||
-- @param fromRadians the start angle, clockwise from the top | |||
-- @param toRadians the end angle | |||
-- @param[opt=false] startAsNewSubPath | |||
-- @function addCentredArc | |||
addCentredArc = function (self, centreX, centreY, | |||
radiusX, radiusY, | |||
rotationOfEllipse, | |||
fromRadians, | |||
toRadians, startAsNewSubPath) | |||
startAsNewSubPath = startAsNewSubPath or false | |||
protolib.Path_addCentredArc (self, centreX, centreY, | |||
radiusX, radiusY, | |||
rotationOfEllipse, | |||
fromRadians, | |||
toRadians, startAsNewSubPath) | |||
end; | |||
--- Add pie segment. | |||
-- @param x | |||
-- @param y | |||
-- @param width | |||
-- @param height | |||
-- @param fromRadians the start angle, clockwise from the top | |||
-- @param toRadians the end angle | |||
-- @param[opt=0] innerCircleProportionalSize band proportion size, if specified | |||
-- @function addPieSegment | |||
addPieSegment = function (self, x, y, | |||
width, height, | |||
fromRadians, | |||
toRadians, innerCircleProportionalSize) | |||
innerCircleProportionalSize = innerCircleProportionalSize or 0 | |||
protolib.Path_addPieSegment (self, x, y, | |||
width, height, | |||
fromRadians, | |||
toRadians, innerCircleProportionalSize) | |||
end; | |||
--- Add line segment. | |||
-- @tparam juce.Line line | |||
-- @param lineThickness | |||
-- @function addLineSegment | |||
addLineSegment = function (self, line, lineThickness) | |||
protolib.Path_addLineSegment (self, line, lineThickness) | |||
end; | |||
--- Add arrow. | |||
-- @tparam juce.Line line | |||
-- @param lineThickness | |||
-- @param arrowheadWidth | |||
-- @param arrowheadLength | |||
-- @function addArrow | |||
addArrow = function (self, line, | |||
lineThickness, | |||
arrowheadWidth, arrowheadLength) | |||
protolib.Path_addArrow (self, line, | |||
lineThickness, | |||
arrowheadWidth, arrowheadLength) | |||
end; | |||
--- Add polygon. | |||
-- @tparam juce.Point centre | |||
-- @param numberOfSides | |||
-- @param radius | |||
-- @param[opt=0] startAngle | |||
-- @function addPolygon | |||
addPolygon = function (self, centre, | |||
numberOfSides, | |||
radius, startAngle) | |||
startAngle = startAngle or 0 | |||
protolib.Path_addPolygon (self, centre, | |||
numberOfSides, | |||
radius, startAngle) | |||
end; | |||
--- Add star. | |||
-- @tparam juce.Point centre | |||
-- @param numberOfPoints | |||
-- @param innerRadius | |||
-- @param outerRadius | |||
-- @param[opt=0] startAngle | |||
-- @function addStar | |||
addStar = function (self, centre, | |||
numberOfPoints, | |||
innerRadius, | |||
outerRadius, startAngle) | |||
startAngle = startAngle or 0 | |||
protolib.Path_addStar (self, centre, | |||
numberOfPoints, | |||
innerRadius, | |||
outerRadius, startAngle) | |||
end; | |||
--- Add bubble. | |||
-- @param bodyArea | |||
-- @param maximumArea | |||
-- @param arrowTipPosition | |||
-- @param cornerSize | |||
-- @param arrowBaseWidth | |||
-- @function addBubble | |||
addBubble = function (self, bodyArea, | |||
maximumArea, | |||
arrowTipPosition, | |||
cornerSize, arrowBaseWidth) | |||
protolib.Path_addBubble (self, bodyArea, | |||
maximumArea, | |||
arrowTipPosition, | |||
cornerSize, arrowBaseWidth) | |||
end; | |||
--- Add path. | |||
-- @param pathToAppend | |||
-- @tparam[opt=juce.AffineTransform.identity] juce.AffineTransform transform | |||
-- @function addPath | |||
addPath = function (self, pathToAppend, transformToApply) | |||
if transformToApply then | |||
protolib.Path_addPath2 (self, pathToAppend, transformToApply) | |||
else | |||
protolib.Path_addPath (self, pathToAppend) | |||
end | |||
end; | |||
--- Apply transform. | |||
-- @tparam juce.AffineTransform transform | |||
-- @function applyTransform | |||
applyTransform = function (self, transform) | |||
protolib.Path_applyTransform (self, transform) | |||
end; | |||
--- Scale to fit. | |||
-- @param x | |||
-- @param y | |||
-- @param width | |||
-- @param height | |||
-- @param preserveProportions | |||
-- @function scaleToFit | |||
scaleToFit = function (self, x, y, width, height, preserveProportions) | |||
protolib.Path_scaleToFit (self, x, y, width, height, preserveProportions) | |||
end; | |||
--- Get transform to scale to fit. | |||
-- @param x | |||
-- @param y | |||
-- @param width | |||
-- @param height | |||
-- @tparam boolean preserveProportions | |||
-- @tparam[opt=Justification.centred] juce.Justification justification | |||
-- @treturn juce.AffineTransform the required transform | |||
-- @function getTransformToScaleToFit | |||
--- Get transform to scale to fit. | |||
-- @tparam juce.Rectangle_float area | |||
-- @tparam boolean preserveProportions | |||
-- @tparam[opt=Justification.centred] juce.Justification justification | |||
-- @treturn juce.AffineTransform the required transform | |||
-- @function getTransformToScaleToFit | |||
getTransformToScaleToFit = function (self, ...) | |||
local control = ... | |||
if type(control)=="number" then | |||
return protolib.Path_getTransformToScaleToFit (self, ...) | |||
else | |||
return protolib.Path_getTransformToScaleToFit2 (self, ...) | |||
end | |||
end; | |||
--- Create path with rounded corners. | |||
-- @param cornerRadius | |||
-- @treturn juce.Path the rounded path | |||
-- @function createPathWithRoundedCorners | |||
createPathWithRoundedCorners = function (self, cornerRadius) | |||
return protolib.Path_createPathWithRoundedCorners (self, cornerRadius) | |||
end; | |||
--- Set using non zero winding. | |||
-- @tparam boolean isNonZeroWinding | |||
-- @function setUsingNonZeroWinding | |||
setUsingNonZeroWinding = function (self, isNonZeroWinding) | |||
protolib.Path_setUsingNonZeroWinding (self, isNonZeroWinding) | |||
end; | |||
--- Is using non zero winding. | |||
-- @treturn boolean whether the path is using non-zero winding | |||
-- @function isUsingNonZeroWinding | |||
isUsingNonZeroWinding = function (self) | |||
return protolib.Path_isUsingNonZeroWinding(self) | |||
end; | |||
toString = function (self, dest, bufSize) | |||
protolib.Path_toString(self, dest, bufSize) | |||
end; | |||
restoreFromString = function (self, src) | |||
protolib.Path_restoreFromString (self, src) | |||
end; | |||
} | |||
} | |||
ffi.metatype("pPath", Path_mt) | |||
local Line = ffi.typeof("Line_float") | |||
local Path = { | |||
--- Joint styles. | |||
-- for use with @{juce.Graphics.strokePath} | |||
-- @table juce.Path.JointStyle | |||
JointStyle = | |||
{ | |||
mitered = 0; | |||
curved = 1; | |||
beveled = 2 | |||
}; | |||
--- End cap styles. | |||
-- for use with @{juce.Graphics.strokePath} | |||
-- @table juce.Path.EndCapStyle | |||
EndCapStyle = | |||
{ | |||
butt = 0; | |||
square = 1; | |||
rounded = 2 | |||
} | |||
}; | |||
Path = setmetatable(Path,{ | |||
-- constructor | |||
__call = function () | |||
return ffi.gc( | |||
protolib.Path_new(), | |||
protolib.Path_delete | |||
) | |||
end; | |||
}) | |||
return Path |
@@ -0,0 +1,37 @@ | |||
--- Point. | |||
-- Is converted to a [JUCE Point](http://www.juce.com/api/classPoint.html) | |||
-- @classmod juce.Point | |||
--- Constuctor | |||
-- @param x | |||
-- @param y | |||
-- @within Constructors | |||
-- @constructor | |||
-- @function Point | |||
--- Constuctor | |||
-- @param args | |||
-- @param args.x | |||
-- @param args.y | |||
-- @within Constructors | |||
-- @constructor | |||
-- @function Point | |||
local Point = ffi.typeof("Point_float") | |||
local Point_mt = { | |||
-- operator '==' | |||
__eq = function(self, rhs) | |||
return self.x == rhs.x and | |||
self.y == rhs.y | |||
end; | |||
} | |||
ffi.metatype(Point, Point_mt) | |||
--- Point X position | |||
-- @simplefield x | |||
--- Point Y position | |||
-- @simplefield y | |||
return Point |
@@ -0,0 +1,89 @@ | |||
--- A floating-point (sub-pixel) rectangle. | |||
-- Is converted to a [JUCE Rectangle](http://www.juce.com/api/classRectangle.html) | |||
-- @classmod juce.Rectangle_float | |||
--- Constuctor with classical arguments. | |||
-- @param x left position | |||
-- @param y top position | |||
-- @param w width | |||
-- @param h height | |||
-- @within Constructors | |||
-- @constructor | |||
-- @function Rectangle_float | |||
--- Constuctor with named arguments. | |||
-- Every field is optional. | |||
-- @tparam table args | |||
-- @param args.x left position | |||
-- @param args.y top position | |||
-- @param args.w width | |||
-- @param args.h height | |||
-- @within Constructors | |||
-- @constructor | |||
-- @function Rectangle_float | |||
local Rectangle_float = ffi.typeof("Rectangle_float") | |||
local Rectangle_int = {} -- circular dependency technique | |||
local Rectangle_float_mt = { | |||
-- operator '==' | |||
__eq = function(self, rhs) | |||
return self.x == rhs.x and | |||
self.y == rhs.y and | |||
self.w == rhs.w and | |||
self.h == rhs.h | |||
end; | |||
-- methods | |||
__index = { | |||
--- To int. | |||
-- Convert to a pixel-aligned rectangle | |||
-- @treturn juce.Rectangle_int | |||
-- @function toInt | |||
toInt = function (self) | |||
Rectangle_int = Rectangle_float or require"include/protojuce/rectangle_int" | |||
return Rectangle_int { | |||
self.x, self.y, self.w, self.h | |||
} | |||
end; | |||
--- Contains. | |||
-- @tparam juce.Point point | |||
-- @treturn boolean whether the rectangle contains the point | |||
-- @function contains | |||
contains = function (self, p) | |||
return p.x>=self.x and p.x<=(self.x+self.w) and | |||
p.y>=self.y and p.y<=(self.y+self.h) | |||
end; | |||
--- Get right. | |||
-- @return the rectangle's right position on the X axis | |||
-- @function getR | |||
getR = function (self) | |||
return self.x + self.w | |||
end; | |||
--- Get bottom. | |||
-- @return the rectangle's bottom position on the Y axis | |||
-- @function getB | |||
getB = function (self) | |||
return self.y + self.h | |||
end; | |||
}; | |||
} | |||
ffi.metatype(Rectangle_float, Rectangle_float_mt) | |||
--- Left position | |||
-- @simplefield x | |||
--- Top position | |||
-- @simplefield y | |||
--- Width | |||
-- @simplefield w | |||
--- Height | |||
-- @simplefield h | |||
return Rectangle_float |
@@ -0,0 +1,89 @@ | |||
--- An integer (pixel-aligned) rectangle. | |||
-- Is converted to a [JUCE Rectangle](http://www.juce.com/api/classRectangle.html) | |||
-- @classmod juce.Rectangle_int | |||
--- Constuctor with classical arguments. | |||
-- @param x left position | |||
-- @param y top position | |||
-- @param w width | |||
-- @param h height | |||
-- @within Constructors | |||
-- @constructor | |||
-- @function Rectangle_int | |||
--- Constuctor with named arguments. | |||
-- Every field is optional. | |||
-- @tparam table args | |||
-- @param args.x left position | |||
-- @param args.y top position | |||
-- @param args.w width | |||
-- @param args.h height | |||
-- @within Constructors | |||
-- @constructor | |||
-- @function Rectangle_int | |||
local Rectangle_int = ffi.typeof("Rectangle_int") | |||
local Rectangle_float = {} -- circular dependency technique | |||
local Rectangle_int_mt = { | |||
-- operator '==' | |||
__eq = function(self, rhs) | |||
return self.x == rhs.x and | |||
self.y == rhs.y and | |||
self.w == rhs.w and | |||
self.h == rhs.h | |||
end; | |||
-- methods | |||
__index = { | |||
--- To float. | |||
-- Convert to a sub-pixel rectangle | |||
-- @treturn juce.Rectangle_float | |||
-- @function toFloat | |||
toFloat = function (self) | |||
Rectangle_float = Rectangle_float or require"include/protojuce/rectangle_float" | |||
return Rectangle_float { | |||
self.x, self.y, self.w, self.h | |||
} | |||
end; | |||
--- Contains. | |||
-- @tparam juce.Point point | |||
-- @treturn boolean whether the rectangle contains the point | |||
-- @function contains | |||
contains = function (self, p) | |||
return p.x>=self.x and p.x<=(self.x+self.w) and | |||
p.y>=self.y and p.y<=(self.y+self.h) | |||
end; | |||
--- Get right. | |||
-- @return the rectangle's right position on the X axis | |||
-- @function getR | |||
getR = function (self) | |||
return self.x + self.w | |||
end; | |||
--- Get bottom. | |||
-- @return the rectangle's bottom position on the Y axis | |||
-- @function getB | |||
getB = function (self) | |||
return self.y + self.h | |||
end; | |||
}; | |||
} | |||
ffi.metatype(Rectangle_int, Rectangle_int_mt) | |||
--- Left position | |||
-- @simplefield x | |||
--- Top position | |||
-- @simplefield y | |||
--- Width | |||
-- @simplefield w | |||
--- Height | |||
-- @simplefield h | |||
return Rectangle_int |
@@ -0,0 +1,22 @@ | |||
--- Rectangle Placement. | |||
-- Is converted to a [JUCE RectanglePlacement](http://www.juce.com/api/RectanglePlacement.html) | |||
-- @classmod juce.RectanglePlacement | |||
--- Rectangle Placement Constants. | |||
-- @table juce.RectanglePlacement | |||
local r = { | |||
xLeft = 1; | |||
xRight = 2; | |||
xMid = 4; | |||
yTop = 8; | |||
yBottom = 16; | |||
yMid = 32; | |||
stretchToFit = 64; | |||
fillDestination = 128; | |||
onlyReduceInSize = 256; | |||
onlyIncreaseInSize = 512; | |||
doNotResize = 768; | |||
centred = 4 + 32 | |||
} | |||
return r |
@@ -0,0 +1,19 @@ | |||
-- protoplug.lua | |||
-- basic globals for every protoplug script | |||
-- luaJIT | |||
ffi = require "ffi" | |||
bit = require "bit" | |||
-- load protoplug as a dynamic library using ffi | |||
protolib = ffi.load(protoplug_path) | |||
juce = require "include/protojuce" | |||
midi = require "include/core/midi" | |||
script = require "include/core/script" | |||
plugin = require "include/core/plugin" | |||
gui = require "include/core/gui" | |||
polyGen = require "include/core/polygen" | |||
stereoFx = require "include/core/stereofx" | |||
@@ -0,0 +1,38 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<!-- | |||
prefs.default.xml | |||
Protoplug doesn't actually use this file. If you want to customize | |||
keyboard shorctus, make a copy of this file, call it "prefs.xml", | |||
and modify that file instead. Future releases of protoplug will | |||
only overwrite "prefs.default.xml" and you'll keep your custom settings. | |||
--> | |||
<KEYMAPPINGS basedOnDefaults="0"> | |||
<MAPPING commandId="10" description="Compile Now" key="ctrl + return"/> | |||
<MAPPING commandId="30" description="Show Code"/> | |||
<MAPPING commandId="31" description="Show Parameters"/> | |||
<MAPPING commandId="32" description="Show Custom GUI"/> | |||
<MAPPING commandId="40" description="Show Next" key="ctrl + tab"/> | |||
<MAPPING commandId="41" description="Show Previous" key="ctrl + shift + tab"/> | |||
<MAPPING commandId="50" description="Open"/> | |||
<MAPPING commandId="51" description="Save As"/> | |||
<MAPPING commandId="60" description="Pop Out"/> | |||
<MAPPING commandId="61" description="Always On Top"/> | |||
<MAPPING commandId="70" description="Help"/> | |||
<MAPPING commandId="25" description="Find Selected" key="ctrl + F3"/> | |||
<MAPPING commandId="26" description="Find Next" key="F3"/> | |||
<MAPPING commandId="27" description="Find Previous" key="shift + F3"/> | |||
</KEYMAPPINGS> | |||
<!-- | |||
if you're using this as a reference, perhaps i should mention : | |||
change font size : ctrl + mouse wheel | |||
and the JUCE editor shortcuts : | |||
cut : ctrl + x | |||
copy : ctrl + c | |||
paste : ctrl + v | |||
undo : ctrl + z | |||
redo : ctrl + y | |||
(not customisable as of this release) | |||
--> |
@@ -0,0 +1,22 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<theme> | |||
<color target="Default" hex="FFeeeeee"/> | |||
<color target="Background" hex="FF000000"/> | |||
<color target="Highlight" hex="FF101050"/> | |||
<color target="Margintext" hex="ff488f8f"/> | |||
<color target="Marginback" hex="ff181818"/> | |||
<color target="Caret" hex="FFFFFFFF"/> | |||
<color target="Comment" hex="ff00FF00"/> | |||
<color target="Integer" hex="ffFF00FF"/> | |||
<color target="Float" hex="ffFF00FF"/> | |||
<color target="Keyword" hex="ff40a0FF"/> | |||
<color target="String" hex="ffFF9D00"/> | |||
<color target="Operator" hex="ff989898"/> | |||
<color target="Punctuation" hex="ff989898"/> | |||
<color target="Bracket" hex="ff989898"/> | |||
<color target="Error" hex="ff989898"/> | |||
<font priority="1" typeface="Lucida Console" size="15" hinted="true"/> | |||
</theme> |
@@ -0,0 +1,21 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<theme> | |||
<color target="Default" hex="FF000000"/> | |||
<color target="Background" hex="FFffffff"/> | |||
<color target="Highlight" hex="FFeeeeff"/> | |||
<color target="Margintext" hex="FF888880"/> | |||
<color target="Marginback" hex="ffcccccc"/> | |||
<color target="Caret" hex="FF000000"/> | |||
<color target="Comment" hex="ff3c3c3c"/> | |||
<color target="Integer" hex="ff880000"/> | |||
<color target="Float" hex="ff885500"/> | |||
<color target="Keyword" hex="ff0000cc"/> | |||
<color target="String" hex="ff990099"/> | |||
<color target="Operator" hex="ff225500"/> | |||
<color target="Punctuation" hex="ff225500"/> | |||
<color target="Bracket" hex="ff000055"/> | |||
<color target="Error" hex="ff225500"/> | |||
</theme> |
@@ -0,0 +1,22 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<theme> | |||
<color target="Default" hex="FFF8F8F8"/> | |||
<color target="Background" hex="FF0C1021"/> | |||
<color target="Highlight" hex="FF253B76"/> | |||
<color target="Margintext" hex="FF888880"/> | |||
<color target="Marginback" hex="FF2E3436"/> | |||
<color target="Caret" hex="FFFFFFFF"/> | |||
<color target="Comment" hex="FFAEAEAE"/> | |||
<color target="Integer" hex="FFD8FA3C"/> | |||
<color target="Float" hex="FFD8FA3C"/> | |||
<color target="Keyword" hex="FFFBDE2D"/> | |||
<color target="String" hex="FF61CE3C"/> | |||
<color target="Operator" hex="FFFBDE2D"/> | |||
<color target="Bracket" hex="FFFBDE2D"/> | |||
<color target="Punctuation" hex="FFFBDE2D"/> | |||
<color target="Error" hex="FFFFCC00"/> | |||
<font priority="1" typeface="DejaVu Sans Mono" size="15" hinted="true"/> | |||
</theme> |
@@ -0,0 +1,22 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<theme> | |||
<color target="Default" hex="FF000000"/> | |||
<color target="Background" hex="FFffffff"/> | |||
<color target="Highlight" hex="FFC0C0C0"/> | |||
<color target="Margintext" hex="ff888880"/> | |||
<color target="Marginback" hex="ffeeeeee"/> | |||
<color target="Caret" hex="FF000000"/> | |||
<color target="Comment" hex="ff008000"/> | |||
<color target="Integer" hex="ffFF8000"/> | |||
<color target="Float" hex="ffFF8000"/> | |||
<color target="Keyword" hex="ff0000FF"/> | |||
<color target="String" hex="ff808080"/> | |||
<color target="Operator" hex="ff000080"/> | |||
<color target="Punctuation" hex="ff000080"/> | |||
<color target="Bracket" hex="ff000080"/> | |||
<color target="Error" hex="ffaa5500"/> | |||
<font priority="1" typeface="Source Code Pro" size="15" hinted="true"/> | |||
</theme> |
@@ -0,0 +1,22 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<theme> | |||
<color target="Default" hex="FF000000"/> | |||
<color target="Background" hex="FFFFB0FF"/> | |||
<color target="Highlight" hex="FFFFD5FF"/> | |||
<color target="Margintext" hex="ffFFFFFF"/> | |||
<color target="Marginback" hex="ffFF80FF"/> | |||
<color target="Caret" hex="FFFFFFFF"/> | |||
<color target="Comment" hex="ff008000"/> | |||
<color target="Integer" hex="ffFF0000"/> | |||
<color target="Float" hex="ffFF0000"/> | |||
<color target="Keyword" hex="ff0000FF"/> | |||
<color target="String" hex="ff808080"/> | |||
<color target="Operator" hex="ff000080"/> | |||
<color target="Punctuation" hex="ff000080"/> | |||
<color target="Bracket" hex="ff000080"/> | |||
<color target="Error" hex="ffaa5500"/> | |||
<font priority="1" typeface="Source Code Pro" size="16" hinted="true"/> | |||
</theme> |
@@ -0,0 +1,22 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<theme> | |||
<color target="Default" hex="FFFFFFFF"/> | |||
<color target="Background" hex="FF222C28"/> | |||
<color target="Highlight" hex="FF919994"/> | |||
<color target="Margintext" hex="ff999999"/> | |||
<color target="Marginback" hex="ff2E3436"/> | |||
<color target="Caret" hex="FFFFFFFF"/> | |||
<color target="Comment" hex="ff666C68"/> | |||
<color target="Integer" hex="ffE98800"/> | |||
<color target="Float" hex="ffE98800"/> | |||
<color target="Keyword" hex="ffC23B00"/> | |||
<color target="String" hex="ffFFFFFF"/> | |||
<color target="Operator" hex="ffA8B3AB"/> | |||
<color target="Punctuation" hex="ffA8B3AB"/> | |||
<color target="Bracket" hex="ffA8B3AB"/> | |||
<color target="Error" hex="ffaa5500"/> | |||
<font priority="1" typeface="DejaVu Sans Mono" size="15" hinted="true"/> | |||
</theme> |
@@ -0,0 +1,71 @@ | |||
/* ==================================== JUCER_BINARY_RESOURCE ==================================== | |||
This is an auto-generated file: Any edits you make may be overwritten! | |||
*/ | |||
namespace BinaryData | |||
{ | |||
//================== lua-16.png ================== | |||
static const unsigned char temp_binary_data_0[] = | |||
{ 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,16,0,0,0,16,8,6,0,0,0,31,243,255,97,0,0,1,24,73,68,65,84,56,141,149,147,61,78,3,49,16,133,223,216,102,181,252,72,81,138,40,74,131,4,71,200,17,16,53,125,202,228,14,72,217,2,25,87,4,137,75,80,114,11,10, | |||
106,238,145,52,9,18,18,171,104,226,161,8,113,204,254,37,251,26,91,99,127,207,51,242,12,161,165,140,113,83,102,255,180,221,171,140,218,26,0,86,254,25,54,189,176,143,169,140,217,206,170,236,104,127,169,12,198,82,138,62,147,68,61,51,203,117,92,130,58,4, | |||
143,199,87,16,121,196,102,99,135,163,209,229,27,0,36,201,201,93,167,147,14,153,237,140,170,234,138,181,88,220,163,215,59,7,0,204,231,223,24,12,94,126,68,220,89,200,204,24,55,173,131,1,4,24,0,250,253,11,136,224,52,102,84,83,221,0,48,153,188,150,246,49, | |||
67,77,233,239,212,237,166,16,1,86,171,60,138,58,2,42,190,177,74,203,101,94,123,166,142,49,40,138,136,56,24,24,163,178,182,6,90,211,67,48,219,46,86,210,212,32,207,185,142,41,200,133,6,252,107,36,149,173,215,252,117,12,90,204,88,3,128,247,239,31,90,223, | |||
192,123,185,61,4,23,103,162,52,141,81,91,203,238,188,105,152,126,1,241,29,109,224,248,198,121,57,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; | |||
const char* lua16_png = (const char*) temp_binary_data_0; | |||
//================== lua-32.png ================== | |||
static const unsigned char temp_binary_data_1[] = | |||
{ 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,32,0,0,0,32,8,6,0,0,0,115,122,122,244,0,0,5,54,73,68,65,84,88,133,189,150,107,108,83,101,24,199,255,239,123,78,47,235,122,177,237,202,50,24,142,49,32,97,42,48,8,226,5,89,100,16,65,72,70,204,8,32,137, | |||
132,24,3,146,8,209,152,176,193,88,41,12,8,160,120,201,34,16,140,176,15,106,36,40,34,36,154,96,2,36,98,48,192,46,162,136,72,22,182,193,230,24,237,232,189,61,59,231,60,126,88,90,183,222,104,65,124,62,157,247,185,253,254,231,205,123,99,248,31,204,110,223, | |||
109,242,251,163,47,9,2,115,136,34,107,245,251,235,47,196,98,236,81,195,117,186,237,243,36,73,254,130,8,142,56,148,241,31,172,86,117,153,199,227,242,241,71,9,183,217,26,199,72,146,252,205,112,56,0,16,169,11,124,62,254,9,0,60,82,1,129,128,178,138,8,166, | |||
84,49,69,81,151,143,30,189,211,46,102,219,172,184,248,125,219,157,59,225,89,170,42,79,34,130,13,32,98,140,185,181,90,225,47,135,195,120,161,179,243,237,123,201,16,140,75,215,143,8,66,48,40,148,100,20,176,116,233,81,225,228,201,107,75,37,73,89,123,251, | |||
182,111,54,17,132,132,54,144,101,25,93,93,30,89,20,157,103,52,26,225,64,56,172,124,11,184,84,0,96,12,29,233,122,51,166,202,38,147,120,51,237,34,212,235,93,207,75,18,29,80,85,122,50,147,200,68,227,156,181,232,116,108,109,56,236,188,88,80,208,88,228,118, | |||
15,254,65,4,75,98,158,32,176,35,138,178,117,117,202,53,160,213,186,106,163,81,245,92,174,112,0,80,85,154,30,137,168,231,181,90,215,250,187,119,235,123,13,6,113,9,231,236,239,225,57,162,200,191,179,217,10,222,2,82,108,67,65,216,186,87,81,232,221,92,160, | |||
99,198,152,177,106,213,84,148,150,90,209,209,49,128,230,230,54,244,244,248,145,151,39,238,8,135,183,212,23,21,29,52,184,221,253,85,68,170,221,96,208,180,123,189,117,173,177,218,17,2,180,218,109,27,36,73,249,48,23,120,85,85,41,142,31,95,14,147,73,23,247, | |||
249,124,81,84,87,127,137,179,103,111,66,167,19,222,136,70,27,62,77,87,31,23,96,48,108,155,26,14,43,23,137,160,201,22,110,52,106,209,209,177,1,14,71,126,82,172,175,47,128,178,178,143,16,10,13,134,141,70,161,194,239,111,248,51,85,143,248,26,136,68,212, | |||
143,115,129,3,192,252,249,101,41,225,0,80,88,104,68,85,213,120,16,33,47,16,80,62,72,215,131,15,253,201,142,74,85,165,57,185,192,1,160,160,192,144,49,110,183,15,197,137,176,208,98,217,53,35,173,128,72,68,126,61,87,56,0,180,182,246,102,140,183,181,253, | |||
187,248,3,1,41,37,131,59,157,78,174,170,234,203,15,34,224,210,165,30,156,58,117,61,101,236,196,137,107,9,2,105,81,74,1,251,246,9,101,170,10,123,204,161,209,8,88,184,112,34,4,33,187,107,98,197,138,99,104,110,110,131,44,171,0,0,89,86,113,248,112,43,86, | |||
174,252,122,68,158,162,208,227,5,5,251,138,18,235,153,193,176,125,65,40,36,127,31,115,88,173,121,240,120,54,194,100,218,137,64,64,202,74,196,80,157,30,99,199,90,208,213,229,197,189,123,145,148,57,122,189,248,66,36,178,229,167,225,62,49,18,33,115,214, | |||
148,12,54,48,16,193,192,64,106,112,204,6,7,213,164,155,145,139,34,228,108,33,155,55,207,65,77,77,121,124,92,91,59,27,203,150,13,157,214,115,231,150,226,202,149,117,240,120,54,162,187,251,29,172,94,93,145,170,69,18,139,107,181,66,127,182,2,26,27,231,198, | |||
183,22,0,236,218,53,47,190,21,155,154,22,193,233,60,3,155,109,55,106,106,190,194,158,61,243,147,234,117,186,100,150,104,54,179,171,193,32,136,232,225,158,103,21,21,251,161,40,132,113,227,30,195,196,137,118,232,245,35,111,122,198,152,108,177,56,174,135, | |||
66,35,235,120,79,207,38,55,99,248,237,97,224,0,208,212,84,9,183,123,35,218,219,223,196,228,201,142,164,56,99,116,177,183,119,77,40,209,47,2,128,40,242,99,146,164,62,149,13,136,165,152,167,9,19,108,168,174,158,129,162,162,247,16,10,13,194,106,213,99,253, | |||
250,89,35,65,34,63,38,165,216,84,34,0,152,205,194,33,183,91,174,35,226,250,88,192,229,122,17,146,164,196,19,143,30,29,154,36,34,160,162,162,8,45,45,107,208,223,31,4,0,248,253,18,116,58,17,149,149,37,112,187,195,56,125,250,53,136,34,71,73,137,5,157,157, | |||
94,112,206,2,163,70,25,143,220,186,149,225,207,52,154,173,187,1,39,233,245,219,233,208,161,115,148,104,229,229,77,100,52,238,136,143,235,234,126,36,34,162,105,211,246,19,224,164,197,139,63,39,175,55,66,94,111,132,102,206,60,72,87,175,246,147,215,27,33, | |||
192,73,90,173,171,33,237,140,198,62,10,11,247,230,247,247,7,91,84,149,38,101,208,153,179,113,206,126,29,63,222,250,244,141,27,27,162,25,5,0,64,126,254,182,39,194,97,229,188,170,38,191,225,30,196,24,99,119,77,38,237,179,62,223,166,27,105,5,14,31,4,131, | |||
13,191,235,116,154,5,156,51,207,127,0,191,35,138,124,94,38,120,146,0,0,8,135,235,47,228,231,243,103,56,71,107,170,130,108,140,115,252,98,54,235,102,13,14,54,180,223,47,87,72,229,148,164,51,158,233,211,95,253,204,237,14,13,16,161,130,8,169,159,61,201, | |||
224,94,65,224,181,138,82,190,46,26,93,59,144,77,205,125,79,191,146,18,167,190,175,79,120,69,150,105,9,145,250,156,162,96,116,172,142,49,16,231,172,155,49,252,44,138,252,120,113,177,229,68,186,197,246,192,2,18,109,202,148,189,249,221,221,17,27,99,26,42, | |||
45,181,122,46,95,78,62,221,114,177,127,0,23,64,50,140,198,53,156,205,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; | |||
const char* lua32_png = (const char*) temp_binary_data_1; | |||
const char* getNamedResource (const char*, int&) throw(); | |||
const char* getNamedResource (const char* resourceNameUTF8, int& numBytes) throw() | |||
{ | |||
unsigned int hash = 0; | |||
if (resourceNameUTF8 != 0) | |||
while (*resourceNameUTF8 != 0) | |||
hash = 31 * hash + (unsigned int) *resourceNameUTF8++; | |||
switch (hash) | |||
{ | |||
case 0x68c81707: numBytes = 337; return lua16_png; | |||
case 0x6bf96a41: numBytes = 1391; return lua32_png; | |||
default: break; | |||
} | |||
numBytes = 0; | |||
return 0; | |||
} | |||
const char* namedResourceList[] = | |||
{ | |||
"lua16_png", | |||
"lua32_png" | |||
}; | |||
} |
@@ -0,0 +1,29 @@ | |||
/* ========================================================================================= | |||
This is an auto-generated file: Any edits you make may be overwritten! | |||
*/ | |||
#ifndef BINARYDATA_H_17170897_INCLUDED | |||
#define BINARYDATA_H_17170897_INCLUDED | |||
namespace BinaryData | |||
{ | |||
extern const char* lua16_png; | |||
const int lua16_pngSize = 337; | |||
extern const char* lua32_png; | |||
const int lua32_pngSize = 1391; | |||
// Points to the start of a list of resource names. | |||
extern const char* namedResourceList[]; | |||
// Number of elements in the namedResourceList array. | |||
const int namedResourceListSize = 2; | |||
// If you provide the name of one of the binary resource variables above, this function will | |||
// return the corresponding data and its size (or a null pointer if the name isn't found). | |||
const char* getNamedResource (const char* resourceNameUTF8, int& dataSizeInBytes) throw(); | |||
} | |||
#endif |