<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4128905459119116790</id><updated>2012-02-16T08:41:01.382+01:00</updated><category term='home'/><category term='matlab'/><category term='pd documentation'/><category term='links'/><category term='esat'/><category term='update'/><title type='text'>intelligent digital effects</title><subtitle type='html'>this blog keeps track of the progress in the research on intelligent digital audio effects. It shows the trail the team has taken to investigate it.
intelligent digital audio effects are audio effects that listen to the music to adjust their effectparameters.
With this vision this website soon became a deposit of all kinds of effects and extraction patches in PureData (a graphical programming environment for audio). On this site the most recent documentation and patches are presented.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>73</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-5135780913879065068</id><published>2007-05-22T13:43:00.000+02:00</published><updated>2007-05-22T13:48:29.798+02:00</updated><title type='text'>project sound examples</title><content type='html'>For now this project will rest a few months (exams). We made a few sound examples to let you hear some effects, and a few concrete things one can do with an intelligent effect patch as explained in the final written project report.&lt;br /&gt;In the folder &lt;a href="http://ronny.ulyssis.be/PureData/Sounds/Effects"&gt;effects &lt;/a&gt;one finds several examples of DAFx.&lt;br /&gt;In the folder &lt;a href="http://ronny.ulyssis.be/PureData/Sounds/iDAFx"&gt;iDAFx &lt;/a&gt;one finds the five basic tracks used to mix a song and then a showcase called song.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-5135780913879065068?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/5135780913879065068/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=5135780913879065068' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/5135780913879065068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/5135780913879065068'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/05/project-sound-examples.html' title='project sound examples'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-4923327765645817368</id><published>2007-05-16T00:02:00.000+02:00</published><updated>2007-05-16T00:49:28.532+02:00</updated><title type='text'>tap</title><content type='html'>&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;img style="width: 44px; height: 35px;" src="http://docs.google.com/File?id=df7z8b86_273fzhmm2g4" /&gt;&lt;/div&gt;&lt;h1&gt;tap&lt;/h1&gt;&lt;span class="stdtext"&gt;This block outputs a bpm value when triggered by a bang that can come from a MIDI message (eg a drum pad). When it loses track because the trigger is not periodic enough, it restarts and for a moment (2 taps) holds the previous tempo.&lt;/span&gt;&lt;span style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;h3&gt;&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;version&lt;/h3&gt;&lt;span style="font-family:Courier New;"&gt;&lt;/span&gt;v1.0: built 14/05/2007 with Pd v0.40-2 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/tap%20v1.0.pd" title="[pd]"&gt;[pd]&lt;/a&gt;&lt;a href="http://ronny.ulyssis.be/PureData/Archive/tap%20v1.0.pdf" title="[pdf]"&gt;[pdf]&lt;/a&gt;&lt;br /&gt;       based on &lt;a title="http://www.parasitaere-kapazitaeten.net/Pd/pdpatches" href="http://www.parasitaere-kapazitaeten.net/Pd/pdpatches"&gt;http://www.parasitaere-kapazitaeten.net/Pd/pdpatches&lt;/a&gt;  &lt;h3&gt;   interface &lt;/h3&gt; Input 1: the inlet that receives triggers, anything counts: a bang, a value,...&lt;br /&gt;Input 2: a reset knob: resets the counting when tempo is lost. Also happens automatically.&lt;br /&gt;&lt;br /&gt;Output 1: the tempo in beats per minute (bpm)&lt;br /&gt;Output 2: a bang when tempo is lost. It's not necessary to connect this with the reset input. It's taken care of inside&lt;br /&gt;&lt;h3&gt;   implementation &lt;/h3&gt;&lt;img style="width: 493px; height: 339px;" src="http://docs.google.com/File?id=df7z8b86_274gj347scf" /&gt;&lt;br /&gt;To calculate the tempo, this algorithm uses three steps: it calculates the interval between the previous click and the current click, it calculates the mean inter-click interval time and it computes the bpm value of this. Then as an extra step the last value before losing the tempo and dropping to 0bpm is remembered by only updating the outlet if it's not 0 (0 can never be a tempo of a song, therefor it's allowed)&lt;br /&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;img style="width: 132px; height: 275px;" src="http://docs.google.com/File?id=df7z8b86_275gvsxhjf3" /&gt;&lt;/div&gt;The time between the current and previous tap, beat or click is calculated by a &lt;span style="font-family:Courier New;"&gt;timer &lt;/span&gt;object, which does just that. A simple counter is used to start this process only after two taps, each time the reset restarts the counter.&lt;br /&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;img style="width: 257px; height: 268px;" src="http://docs.google.com/File?id=df7z8b86_276gkfr5pdq" /&gt;&lt;br /&gt;Then the mean is calculated by adding the new value to the sum of the previous values (this last sum is made by multiplying the last mean value by the last counter index, so a small backward recalculation is done).  This is each time divided by the current counter value (indicating the number of terms of the sum).&lt;br /&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;img style="width: 298px; height: 432px;" src="http://docs.google.com/File?id=df7z8b86_277d2jxpkg3" /&gt;&lt;br /&gt;Another step decides if the tempo is between the right values, that it doesn't deviate too much. If it does, the whole thing is reset.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-4923327765645817368?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/4923327765645817368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=4923327765645817368' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/4923327765645817368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/4923327765645817368'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/05/tap-this-block-outputs-bpm-value-when.html' title='tap'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-211845031725292764</id><published>2007-05-15T22:49:00.000+02:00</published><updated>2007-05-16T00:49:39.681+02:00</updated><title type='text'>round</title><content type='html'>&lt;img style="width: 57px; height: 37px;" src="http://docs.google.com/File?id=df7z8b86_269mt8mzpds" /&gt;&lt;h1&gt;round&lt;/h1&gt;This block extends the integer calculations of Pure Data by allowing to use a rounding value of a float.&lt;br /&gt;&lt;span class="stdtext"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;h3&gt;version &lt;/h3&gt; &lt;span style="font-family:Courier New;"&gt;&lt;/span&gt;v1.0: built 10/05/2007 with Pd v0.40-2 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/round%20v1.0.pd" title="[pd]"&gt;[pd]&lt;/a&gt;&lt;a href="http://ronny.ulyssis.be/PureData/Archive/round%20v1.0.pdf" title="[pdf]"&gt;[pdf]&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;   interface &lt;/h3&gt; Input 1: a float control signal input&lt;br /&gt;&lt;br /&gt;Output 1: an integer control signal output signal&lt;br /&gt;&lt;h3&gt;   implementation &lt;/h3&gt;A floor operation is performed on the value. This floored value is subtracted from the original version, which gives a value between 0 and 1. If this value is greater than or equal to 0.5, then the &lt;span style="font-family:Courier New;"&gt;int &lt;/span&gt;block which holds the floored value + 1 is banged, otherwise the &lt;span style="font-family:Courier New;"&gt;int &lt;/span&gt;block with the floored value is banged. The last &lt;span style="font-family:Courier New;"&gt;int &lt;/span&gt;block is just to collect signals, it's not necessary for the correct functioning of this algorithm.&lt;br /&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;img style="width: 165px; height: 232px;" src="http://docs.google.com/File?id=df7z8b86_270hbgmmbgg" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-211845031725292764?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/211845031725292764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=211845031725292764' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/211845031725292764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/211845031725292764'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/05/round-this-block-extends-integer.html' title='round'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-2983476763861320430</id><published>2007-05-15T16:05:00.000+02:00</published><updated>2007-05-16T00:49:57.922+02:00</updated><title type='text'>dynamics</title><content type='html'>&lt;div style="padding: 1em 0pt; text-align: left;"&gt;   &lt;img src="http://docs.google.com/File?id=df7z8b86_257d3hstqg9" /&gt; &lt;/div&gt; &lt;h1&gt;   dynamics &lt;/h1&gt; &lt;span class="stdtext"&gt;This block &lt;/span&gt;is a versatile dynamics processing block that, depending on the parameters on its inlets is a &lt;span style="font-weight: bold;"&gt;limiter, compressor, expander or noise gate&lt;/span&gt;. It can compress, suppress and expand at the same time. Four regions can be chosen, each with their own behaviour. One has to use an argument when using multiple instances of this block in the same patch.&lt;a href="http://www.sweetwater.com/expert-center/glossary/t--RingModulator" title="[sw]"&gt;&lt;/a&gt; &lt;h3&gt;   version &lt;/h3&gt; &lt;span style="font-family:Courier New;"&gt;&lt;/span&gt;v1.0: built 14/05/2007 with Pd v0.40-2 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/dynamics%20v1.0.pd" title="[pd]"&gt;[pd]&lt;/a&gt;&lt;a href="http://ronny.ulyssis.be/PureData/Archive/dynamics%20v1.0.pdf" title="[pdf]"&gt;[pdf]&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;   interface &lt;/h3&gt; Input 1: the (mono) audio signal input&lt;br /&gt;Input 2, 3, 4: The different thresholds expressed in a dB scale ranging from 0dB to 100dB. (this means that a threshold of -20dB equals 80dB in this scaling)&lt;br /&gt;Input 5, 6, 7, 8: The different ratios R that indicate the behaviour of what happens if the signal level reaches that part.&lt;br /&gt;&lt;div align="left"&gt;   &lt;table bgcolor="#cccccc" border="0" bordercolor="#000000" cellpadding="3" cellspacing="0"&gt;     &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;         limiter&lt;br /&gt;      &lt;/td&gt;       &lt;td&gt;         R = infinity&lt;br /&gt;      &lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td&gt;         compressor            &lt;br /&gt;      &lt;/td&gt;       &lt;td&gt;         1 &amp;lt; R &amp;lt; infinity&lt;br /&gt;      &lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td&gt;         linear&lt;br /&gt;      &lt;/td&gt;       &lt;td&gt;         R = 1&lt;br /&gt;      &lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;&lt;td style="vertical-align: top;"&gt;expander&lt;br /&gt;&lt;/td&gt;&lt;td style="vertical-align: top;"&gt;0 &amp;lt; R &amp;lt; 1&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;       &lt;td&gt;         noise gate&lt;br /&gt;      &lt;/td&gt;       &lt;td&gt;         R = 0&lt;br /&gt;      &lt;/td&gt;     &lt;/tr&gt;     &lt;/tbody&gt;   &lt;/table&gt; &lt;/div&gt;&lt;br /&gt;Output1: the output audio signal&lt;br /&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_258g4jsb4hj" /&gt;&lt;br /&gt;Display:&lt;br /&gt;In the abstraction itself one can see the input signal level compared to the output signal level and compared to the unity level 100dB (or 0dB). Also g(k) is displayed against unity.&lt;br /&gt;&lt;/div&gt; &lt;h3&gt;   implementation &lt;/h3&gt;&lt;br /&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_260tw96n9jc" /&gt;&lt;/div&gt;We use a scheme based on DAFx (p37). The level of the signal is measured to obtain the instantaneous RMS in dB with the &lt;span style="font-family:Courier New;"&gt;env~&lt;/span&gt; block. We take an RMS over 2048 samples. Some &lt;span style="font-family:Courier New;"&gt;moses&lt;/span&gt; blocks route X(dB) the right way. Then the following calculation is done:&lt;br /&gt;&lt;blockquote&gt;g(k) = [th + ( X(dB)-th )/R] / X(dB)&lt;br /&gt;&lt;/blockquote&gt; The &lt;span style="font-family:Courier New;"&gt;float &lt;/span&gt;object f does nothing else but collecting the four routes.&lt;br /&gt;The delay on the original signal is meant to align the samples but is now set on 0, because we haven't made a method yet to discover how long the delay in the other leg is. There is a certain drift anyway, because the gain factor g(k) is often greater than 1 even when all ratios R are 1. &lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;span style="font-style: italic;"&gt;TODO&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_259fh45v5cq" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-2983476763861320430?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/2983476763861320430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=2983476763861320430' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/2983476763861320430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/2983476763861320430'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/05/dynamics-this-block-is-versatile.html' title='dynamics'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-2421073272221518593</id><published>2007-05-09T17:36:00.000+02:00</published><updated>2007-05-09T22:04:11.349+02:00</updated><title type='text'>pitchShifter~</title><content type='html'>&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_226hkzqh7cw" /&gt;&lt;/div&gt;&lt;h1&gt;pitchShifter~&lt;/h1&gt;This block shifts the pitch over some halftones, up or down according to the sign of the first inlet. There is a variable delay between the minimum delay,&lt;br /&gt;corresponding to the third inlet and the the minimum delay + the size of the window, corresponding to the second inlet.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;version&lt;/h3&gt;v1.0: built 8/05/2007 with Pd v0.40-2 &lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/octaver%7E%20v1.0.pd"&gt;[pd]&lt;/a&gt;&lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/octaver%7E%20v1.0.pdf"&gt;[pdf]&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;interface&lt;/h3&gt;Input1: incoming mono audio signal&lt;br /&gt;Input2: number of halftones up or down depending on sign of the input&lt;br /&gt;Input3: the size of the window in ms&lt;br /&gt;Input4: the minimum delay in ms&lt;br /&gt;&lt;br /&gt;Output 1: original signal shifted over a number of halftones specified by input2&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;implementation&lt;/h3&gt;The desired pitch shift in halftones(num) is converted into a transposition factor t= 2^(num/12)= e^(num*log(2)/12) = e^(0.05776*num).&lt;br /&gt;In the tape head rotation speed part f is calculated with f = [(t-1)*Fs]/s  (Fs= samplerate and s= size window). This f is used to calculate&lt;br /&gt;the saw tooth signals and corresponding envelopes.&lt;br /&gt;The minimum delay (input3) is added to both sawtooth signals to make the delay input for the &lt;span style="font-family:Courier New;"&gt;vd~&lt;/span&gt; blocks.&lt;br /&gt;The fact that two copies are made (one is shifted in phase with respect to the other one --&amp;gt; 0.5 correspondig to 180 degrees)&lt;br /&gt;is to avoid discontinuities due to sampling.&lt;br /&gt;Finally both &lt;span style="font-family:Courier New;"&gt;vd~&lt;/span&gt; block outputs are then multiplied by the corresponding envelopes and summed.&lt;br /&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_2276xcfxmfv" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-2421073272221518593?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/2421073272221518593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=2421073272221518593' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/2421073272221518593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/2421073272221518593'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/05/pitchshifter-this-block-shifts-pitch.html' title='pitchShifter~'/><author><name>tony</name><uri>http://www.blogger.com/profile/05311149308629939532</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-4306667089127578033</id><published>2007-05-09T15:55:00.000+02:00</published><updated>2007-05-09T22:18:53.268+02:00</updated><title type='text'>multitapdelay~ / reversedelay~</title><content type='html'>&lt;div style="padding: 1em 0pt; text-align: left;"&gt;   &lt;img src="http://docs.google.com/File?id=df7z8b86_244fpv24gcx" /&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_245fcc859fg" /&gt; &lt;/div&gt; &lt;h1&gt;   multitapdelay~ / reversedelay~ &lt;/h1&gt; These blocks are derivatives of the very general &lt;span style="font-family:Courier New;"&gt;stereomultitapdelay~&lt;/span&gt; block. They represent specific cases that are nice to use in practice. The &lt;span style="font-family:Courier New;"&gt;multitapdelay~&lt;/span&gt; has 10 delay taps that each are DLY (delay time) delayed and the next tap is always FBK (feedback level) attenuated. One can choose which taps are played back. The new settings herefore work only when the FBK is touched again. An argument must be specified when one wants to use multiple delays in one patch. The &lt;span style="font-family:Courier New;"&gt;reversedelay~&lt;/span&gt; does exactly the same but each tap will incremently play louder.&lt;br /&gt;For both effects one can choose to give a pingpong effect by adjusting the panning of all taps. The uneven taps evenly go left, the even taps evenly right for positive PAN values.&lt;br /&gt;&lt;h3&gt;   version &lt;/h3&gt; &lt;p&gt;v1.0 &lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/multitapdelay%7%20v1.0.pdf"&gt;[pdf]&lt;/a&gt;&lt;/p&gt;&lt;p&gt;pan~ v1.1 &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/pan%7%20v1.1.pd"&gt;[pd]&lt;/a&gt; &lt;/p&gt;&lt;p&gt;   v1.0: built 9/05/2007 with Pd v0.40-2 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/multitapdelay%7E%20v1.0.pd" title="[pd]"&gt;[multitapdelay~.pd]&lt;/a&gt; &lt;a href="http://ronny.ulyssis.be/PureData/Archive/traditionaldelay%7E%20v1.0.pdf" title="[pdf]"&gt;[reversedelay~.pd]&lt;/a&gt; &lt;/p&gt; &lt;p&gt;     &lt;/p&gt; &lt;h3&gt;   interface &lt;/h3&gt; Input 1: the signal you want to delay.&lt;br /&gt;Input 2: the delay time parameter DLY. It specifies how long it takes in milliseconds before you hear the following repetition. It ranges from 0msec tot 3000msec (3 seconds). This is the length of the delay line used in the implementation and is thus an absolute maximum.&lt;br /&gt;Input 3: the feedback parameter FBK. The first tap is attenuated (amplified) with this value divided by 100 (1000) for the &lt;span style="font-family:Courier New;"&gt;multitapdelay~&lt;/span&gt; (&lt;span style="font-family:Courier New;"&gt;reversedelay~&lt;/span&gt;). In other words, you can vary the level from 0 (no delay audible) to 0.999 (maximum amplitude of the delayed signals, keeps on repeating as if it never ends) with steps of hundreds/thousands. The system can't get instable because there are no feedback loops involved. But when the FBK value is 100 (internally 0.1) for the &lt;span style="font-family:Courier New;"&gt;reversedelay~&lt;/span&gt;, the last tap is at its maximum, being as loud as the original signal.&lt;br /&gt;Input 4: the panorama parameter PAN. The value ranges between -127 and 127. They are applied evenly to each tap, but the uneven ones with a reversed value.&lt;br /&gt;&lt;br /&gt;Output 1, 2, 3, 4, 5, 6, 7, 8, 9, 10: the delayed, wet taps&lt;br /&gt;Output 11, 12: the delayed, wet stereo signal.&lt;br /&gt;&lt;h3&gt;   implementation &lt;/h3&gt; &lt;img style="margin: 1em 1em 0pt 0pt; width: 338px; height: 704px; float: left;" src="http://docs.google.com/File?id=df7z8b86_246p5ssvqhb" /&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_247c98npbcj" /&gt;&lt;br /&gt;At the left the delay part is shown. Each tap will receive it's final DLY parameter here. The multiplication with 1 is a leftover from the general &lt;span style="font-family:Courier New;"&gt;stereomultitapdelay~&lt;/span&gt; implementation which also provided feedback loops here. At the bottom of this image the two main outlets are shown.&lt;br /&gt;Everything is labeled with dollar arguments to ensure unique working when using multiple instance of delays.&lt;br /&gt;In the image above the inlet is shown and also the section that calculates all the DLY and FBK parameters. For the &lt;span style="font-family:Courier New;"&gt;multitapdelay~&lt;/span&gt; here it is:&lt;br /&gt;&lt;blockquote&gt;DLY&lt;span style="font-size:78%;"&gt;i&lt;/span&gt; = SUM&lt;span style="font-size:78%;"&gt;i&lt;/span&gt;(DLY)&lt;br /&gt;FBK&lt;span style="font-size:78%;"&gt;i&lt;/span&gt; = 1(or 0)*(FBK/100)^i&lt;br /&gt;&lt;/blockquote&gt;That means the DLY parameter is linearly raised and the FBK parameter is exponentially attenuated.&lt;br /&gt;The next image shows this part for the &lt;span style="font-family:Courier New;"&gt;reversedelay~&lt;/span&gt; (it's the only section that differs for both effects). The feedback is now linearly raised.&lt;br /&gt;&lt;blockquote&gt;DLY&lt;span style="font-size:78%;"&gt;i&lt;/span&gt; = SUM&lt;span style="font-size:78%;"&gt;i&lt;/span&gt;(DLY)&lt;br /&gt;FBK&lt;span style="font-size:78%;"&gt;i&lt;/span&gt; = 1(or 0)*SUM&lt;span style="font-size:78%;"&gt;i&lt;/span&gt;(FBK/1000)&lt;/blockquote&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_250f8m6f6mx" /&gt;&lt;br /&gt;The next image shows the section that controls the on/off position of each tap and shows the position of each taps' parameters. The &lt;span style="font-family:Courier New;"&gt;loadbang &lt;/span&gt;block and&lt;span style="font-family:Courier New;"&gt; set 1&lt;/span&gt; message are there to initialize the patch to all taps on.&lt;br /&gt;&lt;/div&gt; &lt;img src="http://docs.google.com/File?id=df7z8b86_248cmd7n7m7" /&gt;&lt;br /&gt;The next section shows how the panning is controlled and shows also the rest of the taps.&lt;br /&gt;The uneven taps get a reversed value of the PAN parameter. Each tap is connected to an outlet before entering the panning logic. After the panning logic the both channels are routed to the main outlets. For information of the pan~ function one must look at the respective documentation.&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;span style="font-style: italic;"&gt;TO DO: put the outlets of each tap in a specific logical order&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt; &lt;img src="http://docs.google.com/File?id=df7z8b86_249gwshhnd4" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-4306667089127578033?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/4306667089127578033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=4306667089127578033' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/4306667089127578033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/4306667089127578033'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/05/multitapdelay-reversedelay-these-blocks.html' title='multitapdelay~ / reversedelay~'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-4376123773237654411</id><published>2007-05-09T10:44:00.000+02:00</published><updated>2007-05-09T12:58:01.966+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>ringmod~</title><content type='html'>&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_235f7z4mpgz" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;h1&gt;ringmod~&lt;/h1&gt;&lt;span class="stdtext"&gt;A type of audio mixer combining two audio signals, and outputting their sum and difference. The frequencies found in the original signals are not passed through to the output. For example, if two sine waves (single frequency waveforms containing no overtones) are inputted, one with a frequency of 1000 Hz, and the second at 400 Hz, the ring modulator will output two frequencies: 600 Hz and 1400 Hz. With more complex waveforms (which contain many more overtone frequencies) ring modulators produce a clangorous, "metallic" result often used for special effects, in synth programming, and so on. One popular use has been to process vocals, which produces sci-fi sounding "robotic" voices. &lt;/span&gt;&lt;a title="[sw]" href="http://www.sweetwater.com/expert-center/glossary/t--RingModulator"&gt;[sw]&lt;/a&gt; &lt;h3&gt;version &lt;/h3&gt;&lt;span style="font-family:Courier New;"&gt;&lt;/span&gt;v1.0: built 12/04/2007 with Pd v0.40-2 &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/ringmod%7E%20v1.0.pd"&gt;[pd]&lt;/a&gt;&lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/ringmod%7E%20v1.0.pdf"&gt;[pdf]&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;interface &lt;/h3&gt;Input 1: the (mono) audio signal input&lt;br /&gt;Input 2: the modulation frequency, it's got no real boundaries but typical values are presented in the image on top.&lt;br /&gt;Input 3: a reset inlet. When this is banged, the modulating wave is reset to it's beginning. Look at the documentation of the &lt;span style="font-family:Courier New;"&gt;waves &lt;/span&gt;block.&lt;br /&gt;&lt;br /&gt;Output1: the ring-modulated output audio signal&lt;br /&gt;&lt;br /&gt;Controls:&lt;br /&gt;MIDI commands for choosing different oscillators for modulation. View the documentation of the &lt;span style="font-family:Courier New;"&gt;waves &lt;/span&gt;block.&lt;br /&gt;&lt;h3&gt;implementation&lt;/h3&gt;Digital ring modulation is nothing more than a multiplication of a signal with another signal. The modulating signals' frequency is very low when one wants to hear the modulating envelope. For ring modulation it's faster. The multiplication is an arbitrary scaling of the modulation frequency input and can be left away. The outlet is high pass filtered to forbid the lowest frequencies (inaudible 5Hz and less) to slip through.&lt;br /&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_234fx4rmncm" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-4376123773237654411?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/4376123773237654411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=4376123773237654411' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/4376123773237654411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/4376123773237654411'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/05/ringmod-type-of-audio-mixer-combining.html' title='ringmod~'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-7991292548126147492</id><published>2007-05-08T20:08:00.000+02:00</published><updated>2007-05-17T20:18:39.500+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>octaver~</title><content type='html'>              &lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_223fgzxfqd6"&gt;&lt;/div&gt;&lt;h1&gt;octaver~&lt;/h1&gt;This block has two outputs, respectively the input signal one octave higher and the input signal one octave lower. The synthesised octave effect is obtained by doubling (octave-up) or halving (octave-down) the frequency of the original input signal. This is possible due to the simple two-to-one relationship between the frequencies of musical notes which are separated by an octave. &lt;br&gt;&lt;br&gt;&lt;h3&gt;version&lt;/h3&gt;v1.0: built 8/05/2007 with Pd v0.40-2 &lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/octaver%7E%20v1.0.pd"&gt;[pd]&lt;/a&gt;&lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/octaver%7E%20v1.0.pdf"&gt;[pdf]&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;h3&gt;interface&lt;/h3&gt;Input1: incoming mono audio signal&lt;br&gt;&lt;br&gt;Output 1: original signal one octave lower&lt;br&gt;Output 2: origininal signal one octave higher&lt;br&gt;&lt;br&gt;&lt;h3&gt;implementation&lt;/h3&gt;For the left output (octave higher) the purpose is to take out the odd harmonics. The result is a signal with only the even ones left, which sounds an octave higher. The spectral envelope of the input will remain roughly unchanged. In this way we avoid the &lt;span style="font-style: italic;"&gt;chipmunk effect &lt;/span&gt;resulting by using a speed change to obtain a pitch shift. To do so we use a variable comb filter without feedback (non recirculating) that combines two delayed copies of the incoming signal. One copy with a fixed delay (&lt;span style="font-family: Courier New;"&gt;delread~)&lt;span style="font-family: Verdana;"&gt; with a window size set to that one of the pitch following algorithm. The delay in ms is adjust to the output of &lt;span style="font-family: Courier New;"&gt;fiddle~&lt;span style="font-family: Verdana;"&gt;: 1000.2048/Fs with Fs= sample rate. (where &lt;span style="font-family: Courier New;"&gt;mtof&lt;/span&gt; is used to translate MIDI pitch to frequency) The variable delay is the same, plus 1/2 of the measured period of the input signal, 1000/(2f) ms where f is the frequency in cycles per second. These two delay times are added and smoothed with &lt;span style="font-family: Courier New;"&gt;line~ &lt;span style="font-family: Verdana;"&gt;and then used as input in the variable delay line &lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;vd~&lt;/span&gt;. &lt;span style="font-family: Verdana;"&gt;The resonant frequencies of the resulting comb filter are 2f,4f,6f,... because the difference between the two delays is 1/2f. The the response is zero for f,3f,5f.... Thus the odd harmonics have been filtered out. You can consider this operation in a different way. The incoming signal is output twice, a half cycle apart: odd harmonics are shifted 180 degrees and cancel eachother out. The even ones are in phase, so they don't.&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;For the right output (octave lower) we use ring modulation. The ring modulation itself happens in &lt;span style="font-family: Courier New;"&gt;osc~ &lt;span style="font-family: Verdana;"&gt;and with the multiplier block. Multiplying with 2 is done to get the original better balanced. Again we get the fundamental frequency from the &lt;span style="font-family: Courier New;"&gt;fiddle~&lt;span style="font-family: Verdana;"&gt; block (after conversion from MIDI pitch). This is then of course multiplied with 1/2 to get one octave lower.&lt;br&gt;The &lt;span style="font-family: Courier New;"&gt;moses &lt;span style="font-family: Verdana;"&gt;is used to stick the most recent good guess, because when fiddle fails it outputs 0. Because &lt;span style="font-family: Courier New;"&gt;fiddle~&lt;/span&gt;'s analyse is most closely aligned to the middle of the window(2048/2) a standard &lt;span style="font-family: Courier New;"&gt;pd delay&lt;/span&gt; block of fixed 1024 samples of the original signal, can be used for synchronization. You can change this to get a different effect. It is also possible to change the factor 1/, by example a large integer (15) and you'll also get a completely different effect (introduction of formants).&lt;br&gt;&lt;font size="1"&gt;&lt;span style="font-style: italic; color: rgb(255, 0, 0);"&gt;In this implementa&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="font-style: italic;"&gt;tion we use &lt;span style="font-family: Verdana;"&gt;&lt;span style="font-family: Courier New;"&gt;osc&lt;/span&gt;~&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="font-family: Verdana;"&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;&lt;font size="1"&gt;&lt;span style="font-style: italic;"&gt;to get the ring modulation. You have to notice that osc~ only uses the sine wave to modulate the original signal. &lt;br&gt;We could use our own &lt;span style="font-family: Courier New;"&gt;waves &lt;span style="font-family: Verdana;"&gt;block to get more possibilities.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;a target="_blank" href="http://docs.google.com/File?id=df7z8b86_2248b5tfkd8"&gt;&lt;img style="width: 408px; height: 558px;" src="http://docs.google.com/File?id=df7z8b86_2248b5tfkd8"&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-7991292548126147492?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/7991292548126147492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=7991292548126147492' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/7991292548126147492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/7991292548126147492'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/05/octaver-this-block-has-two-outputs.html' title='octaver~'/><author><name>tony</name><uri>http://www.blogger.com/profile/05311149308629939532</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-1616207272880461733</id><published>2007-05-08T19:38:00.000+02:00</published><updated>2007-05-09T10:09:05.208+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>traditionaldelay~</title><content type='html'>&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_229dk6b7w5v" /&gt;&lt;/div&gt;&lt;h1&gt;traditionaldelay~&lt;/h1&gt;This block delays an incoming signal (two first inlets to allow for mono and stereo signals) and outputs the wet, delayed signal(s) on one channel. The original signal is not throughput. It works like the traditional delays, this means with a feedback loop. Users can vary them by using the two other inputs. In the display one can see the current position.&lt;br /&gt;&lt;h3&gt;version&lt;/h3&gt; &lt;p&gt;v1.0: built 8/05/2007 with Pd v0.40-2 &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/traditionaldelay%7E%20v1.0.pd"&gt;[pd]&lt;/a&gt; &lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/traditionaldelay%7E%20v1.0.pdf"&gt;[pdf]&lt;/a&gt; &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;h3&gt;interface&lt;/h3&gt;Input 1, 2: the signal you want to delay. If only input 1 (or 2) is connected, only output 1 (or 2) will give a result.&lt;br /&gt;Input 2: the delay time parameter DLY.  It specifies how long it takes in milliseconds before you hear the following repetition. It ranges from 0msec tot 3000msec (3 seconds). This is not only the maximum value of the slider, but also the length of the delay line used in the implementation.&lt;br /&gt;Input 3: the feedback parameter FBK.  The signal is attenuated with this value divided by 1000. In other words, you can vary the level from 0 (no delay audible) to 0.999 (maximum amplitude of the delayed signals, keeps on repeating as if it never ends) with steps of thousands.&lt;br /&gt;&lt;br /&gt;Output 1, 2: the delayed, wet signal&lt;br /&gt;&lt;h3&gt;implementation&lt;/h3&gt;The delay itself is pretty simple: the incoming signal is read by a &lt;span style="font-family:Courier New;"&gt;delread~&lt;/span&gt; objects that write the signal into delay lines called &lt;span style="font-family:Courier New;"&gt;$1-delayLeft &lt;/span&gt;and&lt;span style="font-family:Courier New;"&gt; $1-delayRigh&lt;/span&gt;t and with length 3000ms. Although there's no visible loop, this is how the loop is formed: after a delay time DLY the associated &lt;span style="font-family:Courier New;"&gt;delread~&lt;/span&gt; object reads what's in the delay line, outputs it and sends it back into the &lt;span style="font-family:Courier New;"&gt;delwrite~&lt;/span&gt; object. Before outputting the delayed signals they are attenuated every time by a factor FBK ranging between 0 and 0.999 (with 1 clipping is to easy), in steps of thousands. That's why the control parameter lies between 0.001 and 999.&lt;br /&gt;The DLY parameter of each channel is offset by the addition with the two last inlets.&lt;br /&gt;Just before entering the outlet the signals are high pass filtered for very low frequencies to not reach the outlets.&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0); font-style: italic;font-size:78%;" &gt;TO DO: It's possible to also implement an HF DAMP function which simulates a retro analog delay effect. It's nothing more than adding a lowpass filter with fairly high cutoff frequency (or even adjustable) in the delayline, as can be seen in the reverb blocks of this project.&lt;/span&gt;&lt;br /&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_231f29rkmgd" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-1616207272880461733?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/1616207272880461733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=1616207272880461733' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1616207272880461733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1616207272880461733'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/05/traditionaldelay-this-block-delays.html' title='traditionaldelay~'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-2846265890120187470</id><published>2007-05-06T22:23:00.000+02:00</published><updated>2007-05-15T23:04:42.373+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>control curves</title><content type='html'>                            &lt;h1&gt;control curves&lt;/h1&gt;&lt;p&gt;v1.0 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/control%20curves%20v1.0.pdf" title="[pdf]"&gt;[pdf]&lt;/a&gt;&lt;/p&gt;&lt;p&gt;As a last step for making iDAFx, when the effects and the feature extractions are already existing, counts the control curve. The best work already made on it is from the hand of &lt;a title="Verfaille and Arfib" href="http://www.csis.ul.ie/dafx01/proceedings/papers/verfaille_a.pdf"&gt;Verfaille and Arfib&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The feature extraction stage ends with a curve of values that change. Before entering the parameter curve/values of the effect a few adaptations must be made:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;combine&lt;/span&gt;&lt;br&gt;One can choose (it's optional) to combine several features. These can be added as a linear combination, each with their specific weight. Also must the signal be normalized. A block is made for this: &lt;span style="font-family: Courier New;"&gt;combine&lt;/span&gt;.&lt;br&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;map&lt;/span&gt;&lt;br&gt;Several mapping strategies have to be provided, depending on the features and the effect parameter one wants to control. A lot of experimenting may be done with all possibilities. Different blocks are made for this, they all have one input and one output, both normalized: &lt;span style="font-family: Courier New;"&gt;mapLinear&lt;/span&gt;, &lt;span style="font-family: Courier New;"&gt;mapSine&lt;/span&gt;, &lt;span style="font-family: Courier New;"&gt;mapTrunc&lt;/span&gt;, &lt;span style="font-family: Courier New;"&gt;mapTime&lt;/span&gt;,...&lt;br&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;a target="_blank" href="http://docs.google.com/File?id=df7z8b86_202ffjn8fs7"&gt;&lt;img style="width: 397px; height: 297px;" src="http://docs.google.com/File?id=df7z8b86_202ffjn8fs7"&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;Also other mappings can be used. mapping is nothing more than applying a function. More window-like functions can be used too: hamming, hann, gauss,... and also non-symmetrical windows come in handy. View the documentation in the document mapWindow. Some other techniques are also presented is this documentation (eg &lt;span style="font-family: Courier New;"&gt;bpm2time&lt;/span&gt; )&lt;br&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;scale&lt;/span&gt;&lt;br&gt;In the last step the curve must be shifted and scaled to the appropriate range of the effect parameter: &lt;span style="font-family: Courier New;"&gt;scale&lt;/span&gt;.&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;Sometimes it's better to couple the feature and the parameter directly (for example: bpm feature, bpm effect parameter). Sometimes it's nice to control waves (from eg the &lt;span style="font-family: Courier New;"&gt;waves&lt;/span&gt; block) using features and let these waves control parameters of effects. View the document about &lt;span style="font-family: Courier New;"&gt;waves&lt;/span&gt;. One must always pay special attention to interfaces.&lt;br&gt;&lt;br&gt;Hereunder follows the documentation of the blocks used for the technique described in &lt;a title="the above mentioned paper" href="http://www.csis.ul.ie/dafx01/proceedings/papers/verfaille_a.pdf"&gt;the above mentioned paper&lt;/a&gt;.&lt;br&gt;&lt;hr style="width: 100%; height: 2px;"&gt;&lt;img style="height: 93px; width: 110px;" src="http://docs.google.com/File?id=df7z8b86_174g4v8h2gn"&gt;&lt;br&gt;&lt;h2&gt;&lt;a name="combine"&gt;&lt;/a&gt;combine&lt;/h2&gt;This block makes a linear combination of the inlets. The factors can be chosen from the display. The inlets must be normalized before entering the block. The output is normalized too.&lt;br&gt;&lt;h3&gt;version&lt;/h3&gt;v1.0: built 29/04/2007 with Pd v0.40-2 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/combine%20v1.0.pd" title="[pd]"&gt;[pd]&lt;/a&gt;&lt;br&gt;&lt;h3&gt;interface&lt;/h3&gt;Input 1, 2 and 3: control signals to combine. They have to be normalized before entering the block. One can also use only two inlets.&lt;br&gt;&lt;br&gt;Output 1: a normalized control signal that is the linear combination as chosen from the display.&lt;br&gt;&lt;br&gt;Controls:&lt;br&gt;&lt;span style="font-style: italic;"&gt;number box 1, 2 and 3&lt;/span&gt;: The factors a, b and c in the equation y = ax&lt;font size="1"&gt;1&lt;/font&gt; + bx&lt;font size="1"&gt;2&lt;/font&gt; + cx&lt;font size="1"&gt;3&lt;/font&gt;.&lt;br&gt;&lt;h3&gt;implementation&lt;/h3&gt;The equation used here is:&lt;br&gt;&lt;blockquote&gt;y = (ax&lt;font size="1"&gt;1&lt;/font&gt; + bx&lt;font size="1"&gt;2&lt;/font&gt; + cx&lt;font size="1"&gt;3&lt;font size="2"&gt;)/(a+b+c)&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;font size="1"&gt;&lt;font size="2"&gt;The bang blocks make sure that it doesn't matter which inlets are used or not used. Either way the sum will be updated, even though a cold inlet might be used (that normally would not update that sum). If the inlets are normalized (and this is assumed),  the division by the sum of all coefficients will normalize the output too.&lt;/font&gt;&lt;br&gt;&lt;/font&gt;&lt;img style="height: 285px; width: 360px;" src="http://docs.google.com/File?id=df7z8b86_185g3bt8sjp" align="bottom" border="0" hspace="0" vspace="0"&gt;&lt;font size="1"&gt; &lt;br&gt;&lt;/font&gt;&lt;hr style="width: 100%; height: 2px;"&gt;&lt;h2&gt;&lt;img style="height: 75px; width: 107px;" src="http://docs.google.com/File?id=df7z8b86_188dwwx9vgs" align="absmiddle" border="0" hspace="0" vspace="0"&gt;&lt;img style="height: 30px; width: 72px;" src="http://docs.google.com/File?id=df7z8b86_190cnmgrff7" align="absmiddle" border="0" hspace="0" vspace="0"&gt;&lt;/h2&gt;&lt;h2&gt;&lt;a name="scale"&gt;&lt;/a&gt;scale, scaleS&lt;br&gt;&lt;/h2&gt;This block scales a normalized input to a range that is specified in the controls on a display or at the inlets.&lt;br&gt;&lt;h3&gt;version&lt;/h3&gt;v1.0: built 29/04/2007 with Pd v0.40-2 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/scale%20v1.0.pd" title="[pd]"&gt;[scale.pd]&lt;/a&gt;&lt;a href="http://ronny.ulyssis.be/PureData/Archive/scaleS%20v1.0.pd" title="[pd]"&gt;[scaleS.pd]&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;h3&gt;interface&lt;/h3&gt;Input 1: Input control signal ranging between 0 and 1&lt;br&gt;Input 2&lt;span style="font-style: italic;"&gt;, number box m&lt;/span&gt;: lower boundary of the target range&lt;br&gt;Input 3&lt;span style="font-style: italic;"&gt;, number box M&lt;/span&gt;: upper boundary of the target range&lt;br&gt;&lt;br&gt;Output 1: a scaled version of the input signal&lt;br&gt;&lt;h3&gt;implementation&lt;/h3&gt;For both instances the following mathematical formula is performed:&lt;br&gt;&lt;blockquote&gt;y = (M-m)*x+m&lt;br&gt;&lt;/blockquote&gt;&lt;img style="height: 230px; width: 156px;" src="http://docs.google.com/File?id=df7z8b86_192wzrkwhfp" align="absmiddle"&gt;&lt;img style="height: 247px; width: 222px;" src="http://docs.google.com/File?id=df7z8b86_193d6v857ck" align="absmiddle"&gt;&lt;br&gt;&lt;hr style="width: 100%; height: 2px;"&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_194jt4zzxgp"&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_195s8xdg4dw"&gt;&lt;/div&gt;&lt;h2&gt;mapLinear/mapLin&lt;/h2&gt;This block performs a linear mapping between a normalized input and a normalized output. That constraint is not even necessary, the only real constraint is that the curve starts at zero. But for mapping purposes the signal is mostly normalized. Include an argument number!&lt;h3&gt;version&lt;/h3&gt;v1.0: built 29/04/2007 with Pd v0.40-2 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/mapLinear%20v1.0.pd" title="[pd]"&gt;[mapLinear]&lt;/a&gt;&lt;a href="http://ronny.ulyssis.be/PureData/Archive/mapLin%20v1.0.pd" title="[pd]"&gt;[mapLin]&lt;/a&gt;&lt;br&gt;&lt;h3&gt;interface&lt;/h3&gt;mapLinear:&lt;br&gt;Input 1: control signal&lt;br&gt;Input 2, 3, 4: knee of the curve: &lt;span style="font-style: italic;"&gt;x&lt;font size="1"&gt;1&lt;/font&gt;, x&lt;font size="1"&gt;2&lt;/font&gt;, x&lt;font size="1"&gt;3. &lt;/font&gt;&lt;/span&gt;&lt;font size="1"&gt;&lt;font size="2"&gt;These knees correspond with thresholds in dynamics processing&lt;/font&gt;&lt;/font&gt;&lt;br&gt;Input 5, 6, 7, 8: slopes of each line: &lt;span style="font-style: italic;"&gt;a&lt;font size="1"&gt;1&lt;/font&gt;, a&lt;font size="1"&gt;2&lt;/font&gt;, a&lt;font size="1"&gt;3&lt;/font&gt;, a&lt;font size="1"&gt;4&lt;/font&gt;&lt;/span&gt;&lt;font size="1"&gt;&lt;font size="2"&gt;. The slopes correspond eg with compression factors: 2:1 would give a slope of 1/2 or 0.5&lt;/font&gt;&lt;/font&gt;&lt;br&gt;Output 1: the normalized result of the linear curve&lt;br&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;a target="_blank" href="http://docs.google.com/File?id=df7z8b86_200gpgkzcff"&gt;&lt;img style="width: 350px; height: 484px;" src="http://docs.google.com/File?id=df7z8b86_200gpgkzcff"&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;br&gt;mapLin:&lt;br&gt;Input 1: control signal&lt;br&gt;Input 2: slope of the line &lt;span style="font-style: italic;"&gt;a&lt;/span&gt;&lt;br&gt;Input 3: y-intercept of the line &lt;span style="font-style: italic;"&gt;b&lt;br&gt;&lt;/span&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;a target="_blank" href="http://docs.google.com/File?id=df7z8b86_199647jwmvd"&gt;&lt;img style="width: 214px; height: 207px;" src="http://docs.google.com/File?id=df7z8b86_199647jwmvd"&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;h3&gt;implementation&lt;/h3&gt;This patch does nothing more than performing the formulas you find in the graphs in the section interface. To check where x is situated, &lt;span style="font-family: Courier New;"&gt;moses &lt;/span&gt;blocks are used.&lt;br&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;a target="_blank" href="http://docs.google.com/File?id=df7z8b86_196gs2673g8"&gt;&lt;img style="width: 577px; height: 665px;" src="http://docs.google.com/File?id=df7z8b86_196gs2673g8"&gt;&lt;/a&gt;&lt;a target="_blank" href="http://docs.google.com/File?id=df7z8b86_197gcg895dv"&gt;&lt;img style="width: 213px; height: 200px;" src="http://docs.google.com/File?id=df7z8b86_197gcg895dv"&gt;&lt;/a&gt;&lt;br&gt;&lt;hr style="width: 100%; height: 2px;"&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_201c7mgrnhr"&gt;&lt;br&gt;&lt;h2&gt;mapSine&lt;/h2&gt;This block maps the normalized input according to a sinusoidal curve (as one can see in the figure in the preamble).&lt;br&gt;&lt;h3&gt;version&lt;/h3&gt;v1.0: built 29/04/2007 with Pd v0.40-2 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/mapSine%20v1.0.pd" title="[pd]"&gt;[pd]&lt;/a&gt;&lt;br&gt;&lt;h3&gt;interface&lt;/h3&gt;Input 1: a normalized input control signal&lt;br&gt;Output 1: a mapped signal output according to the given curve. It ranges from 0 to 1.&lt;br&gt;&lt;h3&gt;implementation&lt;/h3&gt;The given formula is performed with Pure Data blocks. The &lt;span style="font-family: Courier New;"&gt;sin~&lt;/span&gt; block is a phase shifted version of the &lt;span style="font-family: Courier New;"&gt;cos~&lt;/span&gt; block. View the documentation of &lt;span style="font-family: Courier New;"&gt;sin~&lt;/span&gt; if needed. Because it outputs an audio signal, the &lt;span style="font-family: Courier New;"&gt;bang &lt;/span&gt;object bangs a &lt;span style="font-family: Courier New;"&gt;snapshot~&lt;/span&gt; object that samples and holds the value of that moment. Because the &lt;span style="font-family: Courier New;"&gt;bang &lt;/span&gt;block is connected with the output of the calculation, each change will result in a new sample at the output of the &lt;span style="font-family: Courier New;"&gt;snapshot~&lt;/span&gt; block.&lt;br&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;a target="_blank" href="http://docs.google.com/File?id=df7z8b86_203gkwc5mfm"&gt;&lt;img style="width: 264px; height: 298px;" src="http://docs.google.com/File?id=df7z8b86_203gkwc5mfm"&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;hr style="width: 100%; height: 2px;"&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;img style="width: 119px; height: 85px;" src="http://docs.google.com/File?id=df7z8b86_204hgqkvmg2"&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_206hkf5vzv5"&gt;&lt;/div&gt;&lt;h2&gt;mapTrunc/mapTruncS&lt;/h2&gt;This block maps a chosen part of the normalized input to the output (as one can see in the figure in the preamble). This mapping curve is a very basic limiter and noise gate. The threshold of the noise gate would be t&lt;font size="1"&gt;m&lt;/font&gt; and the threshold of the limiter would be t&lt;font size="1"&gt;M&lt;/font&gt;. Include an argument number!&lt;h3&gt;version&lt;/h3&gt;v1.0: built 29/04/2007 with Pd v0.40-2 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/mapTrunc%20v1.0.pd" title="[pd]"&gt;[mapTrunc]&lt;/a&gt;&lt;a href="http://ronny.ulyssis.be/PureData/Archive/mapTruncS%20v1.0.pd" title="[pd]"&gt;[mapTruncS]&lt;/a&gt;&lt;h3&gt;interface&lt;/h3&gt;Input 1: a normalized input control signal&lt;br&gt;Input 2, &lt;span style="font-style: italic;"&gt;number box t&lt;font size="1"&gt;m&lt;/font&gt;&lt;/span&gt;: lower boundary of truncation&lt;br&gt;Input 3, &lt;span style="font-style: italic;"&gt;number box t&lt;font size="1"&gt;M&lt;/font&gt;&lt;/span&gt;: upper boundary of truncation&lt;br&gt;Output 1: a mapped signal output according to the given curve. It ranges from 0 to 1.&lt;br&gt;&lt;h3&gt;implementation&lt;/h3&gt;In comparison with other implementations in this document, nothing new is done, only another formula. The formula performed here with Pure Data blocks is:&lt;br&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;y&lt;/span&gt; = [t&lt;font size="1"&gt;m&lt;/font&gt; (&lt;span style="font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="font-style: italic;"&gt;x&lt;/span&gt;&amp;lt;t&lt;font size="1"&gt;m&lt;/font&gt;) + t&lt;font size="1"&gt;M&lt;/font&gt; (&lt;span style="font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="font-style: italic;"&gt;x&lt;/span&gt;&amp;gt;t&lt;font size="1"&gt;M&lt;/font&gt;) + x (&lt;span style="font-weight: bold;"&gt;if&lt;/span&gt; t&lt;font size="1"&gt;m&lt;/font&gt;&amp;lt;&lt;span style="font-style: italic;"&gt;x&lt;/span&gt;&amp;lt;t&lt;font size="1"&gt;M&lt;/font&gt;)]/(t&lt;font size="1"&gt;M&lt;/font&gt;-t&lt;font size="1"&gt;m&lt;/font&gt;)&lt;br&gt;&lt;/blockquote&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;a target="_blank" href="http://docs.google.com/File?id=df7z8b86_209hntz2tch"&gt;&lt;img style="width: 320px; height: 385px;" src="http://docs.google.com/File?id=df7z8b86_209hntz2tch"&gt;&lt;/a&gt;&lt;a target="_blank" href="http://docs.google.com/File?id=df7z8b86_210t6vfsnhc"&gt;&lt;img style="width: 320px; height: 375.726px;" src="http://docs.google.com/File?id=df7z8b86_210t6vfsnhc"&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br&gt;&lt;hr style="width: 100%; height: 2px;"&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;img style="width: 117px; height: 110px;" src="http://docs.google.com/File?id=df7z8b86_213gr67vkcq"&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_214dzgxrphm"&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2&gt;mapTime/mapTimeS&lt;/h2&gt;This block time stretches the original control signal. The time-stretched parameter alpha divides the original range into two parts: the lowest will be contracted to s&lt;font size="1"&gt;m&lt;/font&gt;, the upper dilated to s&lt;font size="1"&gt;M&lt;/font&gt; (as one can see in the figure in the preamble). Include an argument number!&lt;br&gt; &lt;h3&gt;version&lt;/h3&gt; v1.0: built 29/04/2007 with Pd v0.40-2 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/mapTime%20v1.0.pd" title="[pd]"&gt;[mapTime.pd]&lt;/a&gt;&lt;a title="[mapTimeS.pd]" href="http://ronny.ulyssis.be/PureData/Archive/mapTimeS%20v1.0.pd"&gt;[mapTimeS.pd]&lt;/a&gt; &lt;a href="http://ronny.ulyssis.be/PureData/Archive/mapTime%20v1.0.pd" title="[pd]"&gt;&lt;/a&gt; &lt;h3&gt;interface&lt;/h3&gt; Input 1: a normalized input control signal&lt;br&gt; Input 2, &lt;span style="font-style: italic;"&gt;number box alpha&lt;font size="1"&gt;&lt;/font&gt;&lt;/span&gt;: time-stretched parameter that realizes the boundary between contraction and dilatation.&lt;br&gt; Input 3, &lt;span style="font-style: italic;"&gt;number box &lt;font size="1"&gt;&lt;/font&gt;&lt;/span&gt;s&lt;font size="1"&gt;m&lt;/font&gt;: contraction factor smaller than or equal to 1&lt;br&gt;Input 4, &lt;span style="font-style: italic;"&gt;number box &lt;/span&gt;s&lt;font size="1"&gt;M&lt;/font&gt;: dilatation factor greater than or equal to 1&lt;br&gt; Output 1: a mapped signal output according to the given curve. It ranges from 0 to 1.&lt;br&gt; &lt;h3&gt;implementation&lt;/h3&gt;As with the other blocks in this document a formula is calculated with PureData blocks. Care is taking to include dollar arguments to ensure multiple and correct use in the same patch. The formula calculated is:&lt;br&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;y&lt;/span&gt; = s&lt;font size="1"&gt;m&lt;/font&gt;^((alpha-&lt;span style="font-style: italic;"&gt;x&lt;/span&gt;)/alpha) (&lt;span style="font-weight: bold;"&gt;if &lt;/span&gt;&lt;span style="font-style: italic;"&gt;x&lt;/span&gt; &amp;lt; alpha) + s&lt;font size="1"&gt;M&lt;/font&gt;^(&lt;span style="font-style: italic;"&gt;x&lt;/span&gt;.alpha/(1-alpha)) (&lt;span style="font-weight: bold;"&gt;if &lt;/span&gt;&lt;span style="font-style: italic;"&gt;x&lt;/span&gt; &amp;gt; alpha))&lt;br&gt;&lt;/blockquote&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;a target="_blank" href="http://docs.google.com/File?id=df7z8b86_215hjswdbcq"&gt;&lt;img style="width: 320px; height: 522.857px;" src="http://docs.google.com/File?id=df7z8b86_215hjswdbcq"&gt;&lt;/a&gt;&lt;a target="_blank" href="http://docs.google.com/File?id=df7z8b86_216httqgztz"&gt;&lt;img style="width: 320px; height: 463.481px;" src="http://docs.google.com/File?id=df7z8b86_216httqgztz"&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;hr style="width: 100%; height: 2px;"&gt;&lt;h2&gt;&lt;img style="height: 37px; width: 90px;" src="http://docs.google.com/File?id=df7z8b86_181563c4kd7"&gt;&lt;/h2&gt;&lt;h2&gt;&lt;a name="bpmtotime"&gt;&lt;/a&gt;bpm2time&lt;/h2&gt;This block calculates the period between two beats or any division of it. It can be used to calculate a certain delay time parameter.&lt;br&gt;&lt;br&gt;&lt;h3&gt;version&lt;/h3&gt;v1.0: built 29/04/2007 with Pd v0.40-2 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/bpm2time%20v1.0.pd" title="[pd]"&gt;[pd]&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;h3&gt;interface&lt;/h3&gt;Input 1: a bpm value. Best somewhere between 40bpm and 250bpm, but it works for every value given.&lt;br&gt;Input 2: the division (DIV) parameter specifies how to divide the period between two beats. Here's a list with values that can be used on instruments like the Korg Microkorg and Roland SH32. The ones with an asterisk are whole divisions of a period. The others need several periods to synchronise again with the first count of a measure. A block is made for this purpose: &lt;span style="font-family: Courier New;"&gt;measure&lt;/span&gt;. It has buttons for every possibility.&lt;br&gt;&lt;blockquote&gt;1/1    DIV=1        *    &lt;br&gt;3/4    DIV=0.75    &lt;br&gt;2/3    DIV=0.66666&lt;br&gt;1/2    DIV=0.5        *&lt;br&gt;3/8    DIV=0.375&lt;br&gt;1/3    DIV=0.333333    *&lt;br&gt;1/4    DIV=0.25    *&lt;br&gt;3/16    DIV=0.1875&lt;br&gt;1/6    DIV=0.16666    *&lt;br&gt;1/8    DIV=0.125    *&lt;br&gt;3/32    DIV=0.09375&lt;br&gt;1/12    DIV=0.08333    *&lt;br&gt;1/16    DIV=0.0625    *&lt;br&gt;3/64    DIV=0.04687&lt;br&gt;1/24    DIV=0.04166    *&lt;br&gt;1/32    DIV=0.03125    *&lt;br&gt;&lt;/blockquote&gt;&lt;br&gt;Output 1: a time parameter in msec. 60bpm=1000msec&lt;br&gt;&lt;h3&gt;implementation&lt;/h3&gt;&lt;img style="width: 254px; height: 556px;" src="http://docs.google.com/File?id=df7z8b86_272cspb66fw"&gt;&lt;br&gt;This is the measure block implementation. All in the red box is part of the display (by a graph-on-parent). &lt;br&gt;&lt;img style="height: 220px; width: 134px;" src="http://docs.google.com/File?id=df7z8b86_182c9gbncd5" align="left" border="0" hspace="0" vspace="0"&gt;The mathematical formula for this calculation is:&lt;br&gt; &lt;blockquote&gt;DLY = DIV*60000/BPM &lt;br&gt;&lt;/blockquote&gt; This formula come from 60sec/minute and 1000msec/second.  The &lt;span style="font-family: Courier New;"&gt;bang &lt;/span&gt;block is provided to make sure that the output is also updated when only the DIV inlet is changed, although it is attached to the cold inlet of the multiplication block.&lt;br&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-2846265890120187470?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/2846265890120187470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=2846265890120187470' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/2846265890120187470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/2846265890120187470'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/05/control-curves-v1_06.html' title='control curves'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-5509973064997754575</id><published>2007-05-03T22:51:00.000+02:00</published><updated>2007-05-07T00:16:44.084+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>chorus</title><content type='html'>&lt;h1&gt;&lt;img style="height: 41px; width: 89px;" src="http://docs.google.com/File?id=df7z8b86_179ggfzfhd9" /&gt;&lt;/h1&gt;&lt;h1&gt;chorus~&lt;/h1&gt;This block simulates the very famous chorus effect. It adds several variants of the input signal to the input signal as if it was&lt;br /&gt;several people playing at the same time. The imperfections of such a choir are simulated with variable delays, variable phase and variable volumes.&lt;br /&gt;&lt;h3&gt;version&lt;/h3&gt;v1.0: built 28/04/2007 with Pd v0.40-2 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/chorus%7E%20v1.0.pd" title="[pd]"&gt;[pd]&lt;/a&gt;&lt;a href="http://ronny.ulyssis.be/PureData/Archive/chorus%7E%20v1.0.pdf" title="[pdf]"&gt;[pdf]&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;interface&lt;/h3&gt;Input 1: the mono input signal&lt;br /&gt;Input 2: the frequency of the variation of the delays of the four outputs (all the same). This is expressed in Hertz. Because we're talking about a control signal or modulation here, it gives the best results to use small frequencies like 1Hz.&lt;br /&gt;Input 3: The modulation level. This changes how great the variation is of the delays. 4 is a good value.&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(255, 0, 0);font-size:78%;" &gt;TO DO: add default values that load at start&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Output 1, 2, 3, 4: These are four variably delayed output signals with a phase difference of Pi/2. They can be added to each other with or without specific weights.&lt;br /&gt;&lt;h3&gt;implementation&lt;/h3&gt;The input audio signal is put in a delay line with a maximal length of 1000msec. This extract will be read by four identical variable delays whose delay time is controlled by the following logic: a &lt;span style="font-family:Courier New;"&gt;phasor~ &lt;/span&gt;objects' frequency is taken from the inlet. When the frequency is changed at the given inlet, the &lt;span style="font-family:Courier New;"&gt;line~&lt;/span&gt; object makes this a smooth change with a default ramp of 50msec before reaching the new value. This sawtooth signal is then used as an input for several &lt;span style="font-family:Courier New;"&gt;cos~&lt;/span&gt; blocks. It's nothing more than a run through all values between 0 and 1, repeating with the specified frequency. Each &lt;span style="font-family:Courier New;"&gt;cos~&lt;/span&gt; block receives a sawtooth with a different phase, a difference of Pi/2.  The delay times will thus be out of phase, giving different delay times. These cosine signals are shifted to positive values between 0 and 2 with the &lt;span style="font-family:Courier New;"&gt;[+~1]&lt;/span&gt; block. The a modulation value (also smoothed when changed) is multiplied with the cosine making it more or less expressive by changing it's amplitude. With this final cosine signal a variable delay is driven and output via the outlets.&lt;br /&gt;&lt;img style="height: 338px; width: 540px;" src="http://docs.google.com/File?id=df7z8b86_180dwv4m8dt" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-5509973064997754575?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/5509973064997754575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=5509973064997754575' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/5509973064997754575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/5509973064997754575'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/05/chorus-this-block-simulates-very-famous.html' title='chorus'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-6867664941955745808</id><published>2007-04-29T16:21:00.000+02:00</published><updated>2007-04-30T19:24:13.836+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>mapWindow</title><content type='html'>                &lt;h1&gt;   mapWindow &lt;/h1&gt; &lt;br&gt;v1.0 &lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/mapWindow%20v1.0.pdf"&gt;[pdf]&lt;/a&gt;&lt;br&gt;v1.1 &lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/mapWindow%20v1.1.pdf"&gt;[pdf]&lt;/a&gt;&lt;br&gt;In this document one can find everything about the mapping stage with windows, used for our iDAFx. Four possible windows are presented (but adding some others is  a piece of cake).  For each window a big one and a small one are possible. The big one is 1024-points large and the small one only 128, which agrees with the range of the MIDI message parameters. The effect is the same, but the latter is obviously less accurate.&lt;br&gt;&lt;img style="height: 420px; width: 560px;" src="http://docs.google.com/File?id=df7z8b86_167hmmpbpc5"&gt;&lt;br&gt;windows.m is the m-file that is used to make these windows. Every table is then saved in a textfile and this one is used inside Pure Data.&lt;br&gt;&lt;a title="[hammBig.txt]" href="http://ronny.ulyssis.be/PureData/Archive/hammBig.txt"&gt;[hammBig.txt]&lt;/a&gt; &lt;a title="[hammSmall]" href="http://ronny.ulyssis.be/PureData/Archive/hammSmall.txt"&gt;[hammSmall]&lt;/a&gt; &lt;a title="[blackmanBig.txt]" href="http://ronny.ulyssis.be/PureData/Archive/blackmanBig.txt"&gt;[blackmanBig.txt]&lt;/a&gt; &lt;a title="[blackmanSmall.txt]" href="http://ronny.ulyssis.be/PureData/Archive/blackmanSmall.txt"&gt;[blackmanSmall.txt]&lt;/a&gt; &lt;a title="[gaussBig.txt]" href="http://ronny.ulyssis.be/PureData/Archive/gaussBig.txt"&gt;[gaussBig.txt]&lt;/a&gt; &lt;a title="[gaussSmall.txt]" href="http://ronny.ulyssis.be/PureData/Archive/gaussSmall.txt"&gt;[gaussSmall.txt]&lt;/a&gt; &lt;a title="[hannBig.txt]" href="http://ronny.ulyssis.be/PureData/Archive/hannBig.txt"&gt;[hannBig.txt]&lt;/a&gt; &lt;a title="[hannSmall.txt]" href="http://ronny.ulyssis.be/PureData/Archive/hannSmall.txt"&gt;[hannSmall.txt]&lt;/a&gt; &lt;a title="[windows.m]" href="http://ronny.ulyssis.be/PureData/Archive/windows.m"&gt;[windows.m]&lt;/a&gt; &lt;br&gt;We supply two blocks for applying a window to a control signal: windowBig and windowSmall. The documentation is given hereunder:&lt;br&gt;&lt;br&gt;&lt;hr style="width: 100%; height: 2px;"&gt;&lt;img style="height: 81px; width: 180px;" src="http://docs.google.com/File?id=df7z8b86_169fdjshzrp"&gt;&lt;img style="height: 76px; width: 169px;" src="http://docs.google.com/File?id=df7z8b86_172d28nmmkm"&gt;&lt;h2&gt;windowBig/windowSmall&lt;/h2&gt;This block applies a 1024-points/128-points window to a control signal. One can choose between different windows. One has to define an argument to use multiple instances of this block in the same patch without influencing each other.&lt;br&gt;&lt;h3&gt;version&lt;/h3&gt;v1.0: built 29/04/2007 with Pd v0.40-2 &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/windowBig%20v1.0.pd"&gt;[pd]&lt;/a&gt;&lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/windowSmall%20v1.0.pd"&gt;/[pd]&lt;/a&gt;&lt;br&gt;v1.1: built 30/04/2007 with Pd v0.40-2 &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/windowBig%20v1.1.pd"&gt;[pd]&lt;/a&gt;&lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/windowSmall%20v1.1.pd"&gt;/[pd]&lt;/a&gt;&lt;h3&gt;interface&lt;/h3&gt;Input 1: a control signal ranging between 0 and 1024/128&lt;br&gt;&lt;br&gt;Output 1: a control signal ranging between 0 and 1&lt;br&gt;&lt;br&gt;Controls: a knob per window type&lt;br&gt;&lt;h3&gt;implementation&lt;/h3&gt;&lt;img style="height: 427px; width: 495px;" src="http://docs.google.com/File?id=df7z8b86_175csn9knf3"&gt;&lt;img style="height: 424px; width: 502px;" src="http://docs.google.com/File?id=df7z8b86_176fbv438dm"&gt;&lt;br&gt;The values for each window are read from a .txt file (that have to be found in the same folder as the patch). Upon clicking a button, a bang is sent to the appropriate read message, and the right curve is loaded in the graph. The &lt;span style="font-family: Courier New;"&gt;tabread&lt;/span&gt; block is then used to map the inlet to the outlet.&lt;br&gt;In v1.0 one could not use multiple instances of this block in one patch, because there was an unsolved problem with arguments. That is now solved with the help of Frank Barknecht. In two help-patches he explains all our oddities with dollarsigns. &lt;a title="[dollars-help.pd]" href="http://ronny.ulyssis.be/PureData/Archive/dollars.pd"&gt;[dollars-help.pd]&lt;/a&gt; &lt;a title="[dollars.pd]" href="http://ronny.ulyssis.be/PureData/Archive/dollars.pd"&gt;[dollars.pd]&lt;/a&gt; And his most beautiful solution was adopted, the one with the sends, which at the same time doesn't have the problem of difference between arguments in objects and arguments anyway.&lt;font size="1"&gt;&lt;span style="font-style: italic; color: rgb(255, 0, 0);"&gt;&lt;/span&gt;&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-6867664941955745808?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/6867664941955745808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=6867664941955745808' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/6867664941955745808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/6867664941955745808'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/04/mapwindow-pdf-in-this-document-one-can.html' title='mapWindow'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-2043151931206361803</id><published>2007-04-24T18:52:00.000+02:00</published><updated>2007-04-24T18:59:04.752+02:00</updated><title type='text'>weekly update</title><content type='html'>What's been keeping us busy:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;We're working on the beat detection block for pure data. There keep existing some problems in matlab but they might soon be solved after thoroughly skinning and optimizing the code.&lt;/li&gt;&lt;li&gt;As for me I implemented some extra blocks, mostly quite basic: the EARdetector (envelope, attack and rest), ring modulator (that also functions as tremolo), chorus and something more special. The documentation will follow.&lt;/li&gt;&lt;li&gt;Also we started writing our thesis by making a contents summary. This will happen in LaTeX, something new for us...&lt;/li&gt;&lt;li&gt;Also I've been and I still am trying to understand C for Pure Data externals.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-2043151931206361803?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/2043151931206361803/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=2043151931206361803' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/2043151931206361803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/2043151931206361803'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/04/weekly-update.html' title='weekly update'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-8048147579381299804</id><published>2007-04-21T17:41:00.000+02:00</published><updated>2007-05-16T22:23:49.149+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>mixer</title><content type='html'>                            &lt;h1&gt;mixer&lt;/h1&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;/span&gt;This is collection of a few patches we made to use in main patches for using our effects. It is more than a simple mixer, but it certainly hasn't got all the functionalities of a professional mixer. It has got all that might be useful for our effects project: gain control, mute control, external input or wave files, many channels that are all summed on a bus to the master,... A functionality like sends and returns is not implemented. The structure that is used (apart input and channel patches) implicitly has this function, because one can attach multiple signals to them.&lt;br&gt;This document documents on the patches.&lt;br&gt;v1.0 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/mixer%20v1.0.pdf" title="[pdf]"&gt;[pdf]&lt;/a&gt;&lt;br&gt;v1.1 &lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/mixer%20v1.1.pdf"&gt;[pdf]&lt;/a&gt; &lt;br&gt;    new block added; channel bug temporarily fixed&lt;br&gt;&lt;hr style="width: 100%; height: 2px;"&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;img style="width: 141px; height: 32px;" src="http://docs.google.com/File?id=df7z8b86_278gjj9mc5t"&gt;&lt;/div&gt;&lt;h2&gt;inputmulti~&lt;/h2&gt;This block implements a multichannel input. One can choose ten different wave files or five stereo files&lt;span style="font-family: Courier New;"&gt;&lt;/span&gt;. When using wave files one can loop them. One can internally adjust the input gain of the signal to the best non-clipping level. The gain, clip and instantaneous RMS level is displayed on the block. It's best to not use more than one instance of this block in the same patch.&lt;br&gt;&lt;h3&gt;version&lt;/h3&gt;v1.0: built 15/05/2007 with Pd v0.40-2 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/inputmulti%7E%20v1.0.pd" title="[pd]"&gt;[pd]&lt;/a&gt;&lt;h3&gt;interface&lt;/h3&gt;&lt;br&gt;To choose other sound files, one must open the input patch, specify the soundfile in the right folder in a message and click on that message.&lt;br&gt;&lt;br&gt;Output 1, 2, 3, 4, 5, 6, 7, 8, 9, 10: a levelled mono audio signal&lt;br&gt;&lt;br&gt;Internal controls:&lt;br&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;start:&lt;/span&gt; start the chosen wave file. &lt;span style="font-family: Courier New;"&gt;ctlin &lt;/span&gt;message 48.&lt;br&gt;&lt;span style="font-style: italic;"&gt;play:&lt;/span&gt; when the wave file is done it is immediately replayed. &lt;span style="font-family: Courier New;"&gt;ctlin &lt;/span&gt;message 49.&lt;br&gt;&lt;font style="color: rgb(255, 0, 0);" size="1"&gt;&lt;span style="font-style: italic;"&gt;TO DO: we might better call this a loop button or something.&lt;/span&gt;&lt;/font&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;font style="font-style: italic;" size="1"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;/span&gt;&lt;/font&gt;&lt;br&gt;&lt;h3&gt;implementation&lt;br&gt;&lt;/h3&gt;&lt;font style="color: rgb(255, 0, 0);" size="1"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/font&gt;The wave playback section: each &lt;span style="font-family: Courier New;"&gt;tabplay~&lt;/span&gt; block starts playing when it receives a bang. It then plays the wave file that is loaded in the array with its name, found in the graph at the bottom left. One can choose another one by specifying a new soundfile in a message block. When the &lt;span style="font-family: Courier New;"&gt;tabplay~&lt;/span&gt; block is finished playing a track, it bangs the right output. This bang is used to let the message 1 allow the multiplication (when it's zero or without banging the hot input of the multiplication, the bang that follows will not be reached). The play toggle has a value of 127 to be consistent with the MIDI message value. A select block selects this value and bangs the &lt;span style="font-family: Courier New;"&gt;tabplay~&lt;/span&gt; block to replay the track.&lt;br&gt;A simple section is provided to adjust single gain factors per channel. Just specify another factor in the right message and click on it.&lt;br&gt;&lt;br&gt;This implementation leaves away many features of the other input. But we found a bug there: if one wants to play different tracks he cannot. Due to the dollar problem with arrays it would change the array of each &lt;span style="font-family: Courier New;"&gt;input~&lt;/span&gt; block.&lt;br&gt;&lt;br&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;a target="_blank" href="http://docs.google.com/File?id=df7z8b86_279c3z836fk"&gt;&lt;img style="width: 640px; height: 396.984px;" src="http://docs.google.com/File?id=df7z8b86_279c3z836fk"&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;hr style="width: 100%; height: 2px;"&gt;&lt;img style="height: 193px; width: 209px;" src="http://docs.google.com/File?id=df7z8b86_152cnvd36hb"&gt;&lt;h2&gt;input~&lt;/h2&gt;This block implements a dual input. One can choose to use wave files or to go live with an external input (&lt;span style="font-family: Courier New;"&gt;adc~&lt;/span&gt;). Both are calculated real-time. When using wave files one can loop them. When using the adc~ one can choose which channel of the audio card is routed to left and right channel. One can adjust the input gain of the signal to the best non-clipping level. The gain, clip and instantaneous RMS level is displayed on the block. When using more than one &lt;span style="font-family: Courier New;"&gt;input~&lt;/span&gt; block in a patch be sure to include an argument after the block name.&lt;br&gt;&lt;br&gt;&lt;h3&gt;version&lt;/h3&gt;v1.0: built 20/04/2007 with Pd v0.40-2 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/input%7E%20v1.0.pd" title="[pd]"&gt;[pd]&lt;/a&gt;&lt;a href="http://ronny.ulyssis.be/PureData/Archive/input%7E%20v1.0.pdf" title="[pdf]"&gt;&lt;/a&gt;&lt;h3&gt;interface&lt;/h3&gt;&lt;br&gt;To choose other sound files, one must open the input patch and click on a specific message that contains the file&lt;br&gt;&lt;br&gt;Output 1: The mono audio signal or the left channel audio signal&lt;br&gt;Output 2: The right channel audio signal&lt;br&gt;&lt;br&gt;Controls:&lt;br&gt;&lt;span style="font-style: italic;"&gt;source for left, right:&lt;/span&gt; One can choose a channel from 1 to 8 from the soundcard that is available. When another routing is chosen, you must first enter 0 too. Otherwise you will be adding different channels from your soundcard to the same outputchannel of this block. If you are playing wavefiles it's best to put these sources to 0.&lt;br&gt;&lt;span style="font-style: italic;"&gt;start:&lt;/span&gt; start the chosen wave file. &lt;span style="font-family: Courier New;"&gt;ctlin &lt;/span&gt;message 48.&lt;br&gt;&lt;span style="font-style: italic;"&gt;play:&lt;/span&gt; when the wave file is done it is immediately replayed. &lt;span style="font-family: Courier New;"&gt;ctlin &lt;/span&gt;message 49.&lt;br&gt;&lt;font style="color: rgb(255, 0, 0);" size="1"&gt;&lt;span style="font-style: italic;"&gt;TO DO: we might better call this a loop button or something.&lt;/span&gt;&lt;/font&gt;&lt;br&gt;&lt;span style="font-style: italic;"&gt;reset:&lt;/span&gt; reset the gain to 0&lt;br&gt;&lt;span style="font-style: italic;"&gt;gain slider:&lt;/span&gt; adjust the gain. the number box next to it only shows the chosen gain value, it &lt;span style="font-weight: bold;"&gt;does not&lt;/span&gt; change it!&lt;br&gt;&lt;span style="font-style: italic;"&gt;clip:&lt;/span&gt; When the RMs of the signal exceeds 100dB (the zero attenuation level) this knob lights up in red.&lt;br&gt;&lt;span style="font-style: italic;"&gt;VU-meter:&lt;/span&gt; shows the level of the signal at any time. You can also use it to see if it's a stereo signal or not.&lt;br&gt;&lt;font style="font-style: italic;" size="1"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;TO DO: implement peak meter&lt;/span&gt;&lt;/font&gt;&lt;br&gt;&lt;h3&gt;implementation&lt;br&gt;&lt;/h3&gt;The gain system: when reset is pressed, a message is banged that will send a 0 to the gain slider. The gain slider is he first control in the gain system, the rest is linked from there. The number box thus only shows results and does not adapt them. The slider ranges from -100 to +20 dB. It is then shifted and recalculated to RMS values before being used as an attenuation factor at the output, equal for both channels. The clip bang lights up in red when the moses block detects a RMS value higher than 0dB on the left channel.&lt;br&gt;&lt;font style="color: rgb(255, 0, 0);" size="1"&gt;&lt;span style="font-style: italic;"&gt;TO DO: also check the right channel for clipping.&lt;/span&gt;&lt;/font&gt;&lt;br&gt;The wave playback section: the &lt;span style="font-family: Courier New;"&gt;tabplay~&lt;/span&gt; block starts playing when it receives a bang. It then plays the wave file that is loaded in the arrays named leftInput and rightInput, both contained in the graphs at the top right. One can choose another one by clicking on the specific message bottom left. When the &lt;span style="font-family: Courier New;"&gt;tabplay~&lt;/span&gt; block is finished playing a track, it bangs the right output. This bang is used to let the message 1 allow the multiplication (when it's zero or without banging the hot input of the multiplication, the bang that follows will not be reached). The play toggle has a value of 127 to be consistent with the MIDI message value. A select block selects this value and bangs the &lt;span style="font-family: Courier New;"&gt;tabplay~&lt;/span&gt; block to replay the track.&lt;br&gt;The VU meter section: The VU meters have to receive control messages in dB values ranging from -100 to +112. The output signals are therefore sampled with the &lt;span style="font-family: Courier New;"&gt;snapshot~ &lt;/span&gt;block and recalculated from RMS to dB. &lt;span style="font-style: italic;"&gt;In the future&lt;/span&gt; we might replace this wit &lt;span style="font-family: Courier New;"&gt;env~&lt;/span&gt; blocks or &lt;span style="font-family: Courier New;"&gt;EARdetection~&lt;/span&gt; blocks.&lt;br&gt;The adc source selection: The signal that is input in a specific input of your soundcard is multiplied by a 0 or a 1 depending on which number you input in the number box in the display. If you select two times another valid number for the same audio channel, they will be both output. So be careful to also select another number (0) to mute all the inputs.&lt;br&gt;&lt;br&gt;&lt;a target="_blank" href="http://docs.google.com/File?id=df7z8b86_153f65kmchn"&gt;&lt;img style="width: 640px; height: 403.25px;" src="http://docs.google.com/File?id=df7z8b86_153f65kmchn"&gt;&lt;/a&gt;&lt;br&gt;&lt;hr style="width: 100%; height: 2px;"&gt;&lt;br&gt;&lt;img style="height: 168px; width: 198px;" src="http://docs.google.com/File?id=df7z8b86_154ggq93bcm"&gt;&lt;br&gt;&lt;h2&gt;channelM2M~&lt;/h2&gt;This is one of the channel blocks. It's the bottom part of channels on a real mixer. It allows to make all kinds of routing in your patch. It's output is routed to a &lt;span style="font-family: Courier New;"&gt;master~&lt;/span&gt; block to make it audible. When multiple blocks of this kind are used, one must specify a unique argument. This is almost always the case. No outlet is visible, because the signal is put on the right (depending on the signal: left or right channel bus of...) master bus internally. Be sure to include a &lt;span style="font-family: Courier New;"&gt;master~&lt;/span&gt; block in your patch!&lt;br&gt;In this block one can mute this channel, reverse the signal and adjust the level. A VU-meter is also visible to follow what happens. This specific block is one that has no counterpart in a real mixer, because you cannot put it in a stereo image. But it is useful though as an inline amplification block.&lt;br&gt;&lt;h3&gt;version&lt;/h3&gt;v1.0: built 20/04/2007 with Pd v0.40-2 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/channelM2M%7E%20v1.0.pd" title="[pd]"&gt;[pd]&lt;/a&gt;&lt;br&gt;&lt;h3&gt;interface&lt;/h3&gt;Input 1: The mono audio signal&lt;br&gt;Input 2: A control input for the dB level. It ranges from 0 to 127, the former meaning silence, the latter the loudest.&lt;br&gt;&lt;br&gt;Controls:&lt;span style="font-style: italic;"&gt;&lt;br&gt;solo:&lt;/span&gt; doesn't work yet&lt;br&gt;&lt;span style="font-style: italic;"&gt;mute:&lt;/span&gt; when enabled, the signal is not throughput to the masterbus. When released again, the last value is taken again.&lt;br&gt;&lt;span style="font-style: italic;"&gt;reverse:&lt;/span&gt; when enabled, the phase of the signal is reversed. This is not audible per se, only in comparison with other tracks or itself.&lt;br&gt;&lt;span style="font-style: italic;"&gt;dB-slider:&lt;/span&gt; see Input 2.&lt;br&gt;&lt;span style="font-style: italic;"&gt;VU-meter:&lt;/span&gt; shows the level of the signal at any time.&lt;br&gt;&lt;font style="font-style: italic;" size="1"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;TO DO: implement peak meter&lt;/span&gt;&lt;/font&gt;&lt;br&gt;&lt;h3&gt;implementation&lt;/h3&gt;The dB-level is divided by 1.27 to make the input of the dbtorms range from 0 to 100. This is smoothed (&lt;span style="font-family: Courier New;"&gt;line~&lt;/span&gt;) and multiplied with the high passed signal at the input of the block. This signal is not connected to the hot inlet as normal, but this works because the level control signal is turned into an audio signal in the &lt;span style="font-family: Courier New;"&gt;line~ &lt;/span&gt;block.&lt;br&gt;The reverse logic is the same as in the rev~ block &lt;a title="[v1.0 pd]" href="http://ronny.ulyssis.be/PureData/Archive/rev%7E%20v1.0.pd"&gt;[v1.0 pd]&lt;/a&gt; &lt;a title="[v1.0 pdf]" href="http://ronny.ulyssis.be/PureData/Archive/rev%7E%20v1.0.pdf"&gt;[v1.0 pdf]&lt;/a&gt;. &lt;span style="font-style: italic;"&gt;In the future&lt;/span&gt; it might be substituted here.&lt;br&gt;The logic for driving the input of the VU-meter is a dB calculation and a shift to the right scale. But this might be replaced by an &lt;span style="font-family: Courier New;"&gt;env~&lt;/span&gt; block &lt;span style="font-style: italic;"&gt;in the future&lt;/span&gt;.&lt;br&gt;The mute logic: If mute is banged the message 0 is put as master-lvl while the previous value is stored in the bottom &lt;span style="font-family: Courier New;"&gt;f(loat)&lt;/span&gt; object. Another bang releases this value again on the master-lvl.&lt;br&gt;&lt;br&gt;&lt;img style="height: 428px; width: 550px;" src="http://docs.google.com/File?id=df7z8b86_155dfcc5v2f"&gt;&lt;br&gt;&lt;hr style="width: 100%; height: 2px;"&gt;&lt;br&gt;&lt;img style="height: 171px; width: 203px;" src="http://docs.google.com/File?id=df7z8b86_156g4rwfdf5"&gt;&lt;br&gt;&lt;h2&gt;channelM2S~&lt;/h2&gt;This is one of the channel blocks. It's the bottom part of channels on a real mixer. It allows to make all kinds of routing in your patch. It's output is routed to a &lt;span style="font-family: Courier New;"&gt;master~&lt;/span&gt; block to make it audible. When multiple blocks of this kind are used, one must specify a unique argument. This is almost always the case. No outlet is visible, because the signal is put on the left and right master bus internally. Be sure to include a &lt;span style="font-family: Courier New;"&gt;master~&lt;/span&gt; block in your patch!&lt;br&gt;In this block one can mute this channel, reverse each channel signal and adjust the level. A VU-meter is also visible to follow what happens. One can also change and reset the place of the signal in the stereospectrum with the PAN parameter.&lt;br&gt;&lt;h3&gt;version&lt;/h3&gt;v1.0: built 20/04/2007 with Pd v0.40-2 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/channelM2S%7E%20v1.0.pd" title="[pd]"&gt;[pd]&lt;/a&gt;&lt;br&gt;&lt;h3&gt;interface&lt;/h3&gt;Input 1: The mono audio signal&lt;br&gt;Input 2: A control input for the dB level. It ranges from 0 to 127, the former meaning silence, the latter the loudest.&lt;br&gt;Input 3: A control input for the PAN position. -128 means left and 128 means right.&lt;br&gt;&lt;br&gt;&lt;span style="font-style: italic;"&gt;Controls:&lt;/span&gt;&lt;br&gt;&lt;span style="font-style: italic;"&gt;pan&lt;/span&gt;: when clicking on the bang the PAN position is reset to zero. The number box can be used to change the position and the result of either a change with the number box, either a change at the corresponding inlet will be visible with the slider. Internally (in the block) one can choose between 4 panning laws, also look at the documentation of the &lt;span style="font-family: Courier New;"&gt;monopanner~&lt;/span&gt;). The default law is a sine curve.&lt;br&gt;&lt;span style="font-style: italic;"&gt;solo:&lt;/span&gt; doesn't work yet&lt;br&gt;&lt;span style="font-style: italic;"&gt;mute:&lt;/span&gt; when enabled, the signal is not throughput to the masterbus. When released again, the last value is taken again.&lt;br&gt;&lt;span style="font-style: italic;"&gt;reverseL, reverseR:&lt;/span&gt; when enabled, the phase of the signal is reversed. This is not audible per se, only in comparison with other tracks or itself.&lt;br&gt;&lt;span style="font-style: italic;"&gt;dB-slider:&lt;/span&gt; see Input 2.&lt;br&gt;&lt;span style="font-style: italic;"&gt;VU-meter:&lt;/span&gt; shows the level of the signal at any time.&lt;br&gt;&lt;font style="font-style: italic;" size="1"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;TO DO: implement peak meter&lt;/span&gt;&lt;/font&gt;&lt;br&gt;&lt;h3&gt;implementation&lt;/h3&gt;The dB-level is divided by 1.27 to make the input of the dbtorms range from 0 to 100. This is smoothed (&lt;span style="font-family: Courier New;"&gt;line~&lt;/span&gt;) and multiplied with the high passed signal at the input of the block. This signal is not connected to the hot inlet as normal, but this works because the level control signal is turned into an audio signal in the &lt;span style="font-family: Courier New;"&gt;line~ &lt;/span&gt;block.&lt;br&gt;The reverse logic is the same as in the rev~ block &lt;a title="[v1.0 pd]" href="http://ronny.ulyssis.be/PureData/Archive/rev%7E%20v1.0.pd"&gt;[v1.0 pd]&lt;/a&gt; &lt;a title="[v1.0 pdf]" href="http://ronny.ulyssis.be/PureData/Archive/rev%7E%20v1.0.pdf"&gt;[v1.0 pdf]&lt;/a&gt;. &lt;span style="font-style: italic;"&gt;In the future&lt;/span&gt; it might be substituted here.&lt;br&gt;The logic for driving the input of the VU-meter is a dB calculation and a shift to the right scale. But this might be replaced by an &lt;span style="font-family: Courier New;"&gt;env~&lt;/span&gt; block &lt;span style="font-style: italic;"&gt;in the future&lt;/span&gt;.&lt;br&gt;The mute logic: If mute is banged the message 0 is put as master-lvl while the previous value is stored in the bottom &lt;span style="font-family: Courier New;"&gt;f(loat)&lt;/span&gt; object. Another bang releases this value again on the master-lvl.&lt;br&gt;The panorama logic is the same as in the &lt;span style="font-family: Courier New;"&gt;monopanner~&lt;/span&gt; block. view that documentation.&lt;br&gt;&lt;br&gt;&lt;a target="_blank" href="http://docs.google.com/File?id=df7z8b86_157fzf6qtdv"&gt;&lt;img style="width: 640px; height: 464.964px;" src="http://docs.google.com/File?id=df7z8b86_157fzf6qtdv"&gt;&lt;/a&gt;&lt;br&gt;&lt;hr style="width: 100%; height: 2px;"&gt;&lt;img style="height: 182px; width: 195px;" src="http://docs.google.com/File?id=df7z8b86_158g9sr26f4"&gt;&lt;br&gt;&lt;h2&gt;channelS2S~&lt;/h2&gt;This is one of the channel blocks. It's the bottom part of channels on a real mixer. It allows to make all kinds of routing in your patch. It's output is routed to a &lt;span style="font-family: Courier New;"&gt;master~&lt;/span&gt; block to make it audible. When multiple blocks of this kind are used, one must specify a unique argument. This is almost always the case. No outlet is visible, because the signal is put on the left and right master bus internally. Be sure to include a &lt;span style="font-family: Courier New;"&gt;master~&lt;/span&gt; block in your patch!&lt;br&gt;In this block one can mute this channel, reverse each channel signal and adjust the level. A VU-meter is also visible to follow what happens. One can also change and reset the place of the signal in the stereospectrum with the PAN parameter.&lt;br&gt;&lt;h3&gt;version&lt;/h3&gt;v1.0: built 20/04/2007 with Pd v0.40-2 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/channelS2S%7E%20v1.0.pd" title="[pd]"&gt;[pd]&lt;/a&gt;&lt;br&gt;&lt;h3&gt;interface&lt;/h3&gt;Input 1, 2: The two channels of the stereo audio signal&lt;br&gt;Input 3: A control input for the dB level. It ranges from 0 to 127, the former meaning silence, the latter the loudest.&lt;br&gt;Input 4: A control input for the PAN position. -128 means left and 128 means right.&lt;br&gt;&lt;br&gt;&lt;span style="font-style: italic;"&gt;Controls:&lt;/span&gt;&lt;br&gt;&lt;span style="font-style: italic;"&gt;pan&lt;/span&gt;: when clicking on the bang the PAN position is reset to zero. The number box can be used to change the position and the result of either a change with the number box, either a change at the corresponding inlet will be visible with the slider. Internally (in the block) one can choose between 4 panning laws, also look at the documentation of the &lt;span style="font-family: Courier New;"&gt;monopanner~&lt;/span&gt;). The default law is a sine curve.&lt;br&gt;&lt;span style="font-style: italic;"&gt;solo:&lt;/span&gt; doesn't work yet&lt;br&gt;&lt;span style="font-style: italic;"&gt;mute:&lt;/span&gt; when enabled, the signal is not throughput to the masterbus. When released again, the last value is taken again.&lt;br&gt;&lt;span style="font-style: italic;"&gt;reverseL, reverseR:&lt;/span&gt; when enabled, the phase of the signal is reversed. This is not audible per se, only in comparison with other tracks or itself.&lt;br&gt;&lt;span style="font-style: italic;"&gt;dB-slider:&lt;/span&gt; see Input 3.&lt;br&gt;&lt;span style="font-style: italic;"&gt;VU-meter:&lt;/span&gt; shows the level of the signal at any time.&lt;br&gt;&lt;font style="font-style: italic;" size="1"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;TO DO: implement peak meter&lt;/span&gt;&lt;/font&gt;&lt;br&gt;&lt;h3&gt;implementation&lt;/h3&gt;The dB-level is divided by 1.27 to make the input of the dbtorms range from 0 to 100. This is smoothed (&lt;span style="font-family: Courier New;"&gt;line~&lt;/span&gt;) and multiplied with the high passed signal at the input of the block. This signal is not connected to the hot inlet as normal, but this works because the level control signal is turned into an audio signal in the &lt;span style="font-family: Courier New;"&gt;line~ &lt;/span&gt;block.&lt;br&gt;The reverse logic is the same as in the rev~ block &lt;a title="[v1.0 pd]" href="http://ronny.ulyssis.be/PureData/Archive/rev%7E%20v1.0.pd"&gt;[v1.0 pd]&lt;/a&gt; &lt;a title="[v1.0 pdf]" href="http://ronny.ulyssis.be/PureData/Archive/rev%7E%20v1.0.pdf"&gt;[v1.0 pdf]&lt;/a&gt;. &lt;span style="font-style: italic;"&gt;In the future&lt;/span&gt; it might be substituted here.&lt;br&gt;The logic for driving the input of the VU-meter is a dB calculation and a shift to the right scale. But this might be replaced by an &lt;span style="font-family: Courier New;"&gt;env~&lt;/span&gt; block &lt;span style="font-style: italic;"&gt;in the future&lt;/span&gt;.&lt;br&gt;The mute logic: If mute is banged the message 0 is put as master-lvl while the previous value is stored in the bottom &lt;span style="font-family: Courier New;"&gt;f(loat)&lt;/span&gt; object. Another bang releases this value again on the master-lvl.&lt;br&gt; The panorama logic is the same as in the &lt;span style="font-family: Courier New;"&gt;monopanner~&lt;/span&gt; block. view that documentation. One might call it balance instead of pan, but the implementation is the same, because the two channels of the stereo spectrum are mixed before entering the pan logic.&lt;br&gt;&lt;a target="_blank" href="http://docs.google.com/File?id=df7z8b86_159fbnjk4dm"&gt;&lt;img style="width: 640px; height: 452.414px;" src="http://docs.google.com/File?id=df7z8b86_159fbnjk4dm"&gt;&lt;/a&gt;&lt;br&gt;&lt;hr style="width: 100%; height: 2px;"&gt;&lt;img style="height: 167px; width: 200px;" src="http://docs.google.com/File?id=df7z8b86_160gxjwz7fr"&gt;&lt;br&gt;&lt;h2&gt;master~&lt;/h2&gt;Each analog mixer has an audio chain that ends with a master section. It represents the last step and is connected with the master outs. This block is also the last block in our chain. It puts the two master busses on the speaker outputs. There can be only one &lt;span style="font-family: Courier New;"&gt;master~&lt;/span&gt; block per patch.&lt;br&gt;&lt;h3&gt;version&lt;/h3&gt; v1.0: built 20/04/2007 with Pd v0.40-2 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/master%7E%20v1.0.pd" title="[pd]"&gt;[pd]&lt;/a&gt;&lt;br&gt;&lt;font size="1"&gt;&lt;span style="font-style: italic; color: rgb(255, 0, 0);"&gt;TO DO: also implement a recording facility for recording examples of our results.&lt;/span&gt;&lt;/font&gt;&lt;br&gt; &lt;h3&gt;interface&lt;/h3&gt;&lt;span style="font-style: italic;"&gt;Controls:&lt;/span&gt;&lt;br&gt; &lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;mute:&lt;/span&gt; when enabled, the signal is not throughput to the speakers. Also the DSP is stopped. One can use it as a &lt;span style="font-style: italic;"&gt;panic!&lt;/span&gt; knob. When released again, the last value is taken again. When the MIDI value 40 is received mute is toggled.&lt;br&gt; &lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;dB-slider:&lt;/span&gt; controls the volume level of each channel. They are both controllable with the MIDI values 30 and 7 (two last sliders on a Korg MICROkorg)&lt;br&gt; &lt;span style="font-style: italic;"&gt;VU-meter:&lt;/span&gt; shows the level of the signal at any time.&lt;br&gt; &lt;font style="font-style: italic;" size="1"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;TO DO: implement peak meter&lt;/span&gt;&lt;/font&gt;&lt;br&gt; &lt;h3&gt;implementation&lt;/h3&gt;For the level and meter logic the same implementation is used as in the examples above.&lt;br&gt;The DSP is stopped when the mute knob has value 1, with the command &lt;span style="font-family: Courier New;"&gt;pd dsp 0&lt;/span&gt;. When it's not 1 (but lower, thus being 0) the command &lt;span style="font-family: Courier New;"&gt;pd dsp 1&lt;/span&gt; puts the DSP (and the sound) back on.&lt;br&gt;&lt;br&gt;&lt;img style="height: 464px; width: 421px;" src="http://docs.google.com/File?id=df7z8b86_163dqz4nshr"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-8048147579381299804?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/8048147579381299804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=8048147579381299804' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/8048147579381299804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/8048147579381299804'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/04/mixer-documentation-net-yet-finished.html' title='mixer'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-7950791110555645778</id><published>2007-04-21T15:35:00.000+02:00</published><updated>2007-05-17T20:21:34.317+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>pan~</title><content type='html'>              &lt;img src="http://docs.google.com/File?id=df7z8b86_149cjmvr8dc" style="height: 28px; width: 64px;"&gt; &lt;h1&gt;   pan~ &lt;/h1&gt; &lt;p&gt;   This block is a simple panorama block. It has an input to control the position and works according to the equal power idea, using a sine function.&lt;br&gt; &lt;/p&gt; &lt;h3&gt;   version &lt;/h3&gt; &lt;span style="font-family: Courier New;"&gt;&lt;/span&gt;v1.0: built 15/04/2007 with Pd v0.40-2 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/pan%7E%20v1.0.pd" title="[pd]"&gt;[pd]&lt;/a&gt;&lt;a href="http://ronny.ulyssis.be/PureData/Archive/pan%7E%20v1.0.pdf" title="[pdf]"&gt;[pdf]&lt;/a&gt;&lt;br&gt; &lt;font style="color: rgb(255, 0, 0);" size="1"&gt;&lt;span style="font-style: italic;"&gt;TO DO: the sine function is implemented with a table. When &lt;/span&gt;&lt;span style="font-family: Courier New; font-style: italic;"&gt;pan~&lt;/span&gt;&lt;span style="font-style: italic;"&gt; is used several times in one patch, they'll all have to work with the same control function (sine in this case). I didn't yet find how to comprise the $ argument in the patch so that every &lt;/span&gt;&lt;span style="font-family: Courier New; font-style: italic;"&gt;pan~&lt;/span&gt;&lt;span style="font-style: italic;"&gt; block works with its own table.&lt;/span&gt;&lt;/font&gt;&lt;span style="font-family: Courier New;"&gt;&lt;/span&gt;&lt;br&gt; v1.1: built 9/05/2007 with Pd v0.40-2 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/pan%7E%20v1.1.pd" title="[pd]"&gt;[pd]&lt;/a&gt;&lt;a href="http://ronny.ulyssis.be/PureData/Archive/pan%7E%20v1.1.pdf" title="[pdf]"&gt;[pdf]&lt;/a&gt; &lt;h3&gt;   interface &lt;/h3&gt; Input1 : the mono audio signal input&lt;br&gt; Input2 : the control input; ranging from -127 (LEFT) to 127 (RIGHT) where 0 marks the CENTER position&lt;br&gt; &lt;br&gt; Output1: the left channel audio signal&lt;br&gt; Output2: the right channel audio signal&lt;br&gt; &lt;br&gt;Controls: internally one can choose between 4 panning laws: sine, root, gogin and linear. (see the documentation of the &lt;span style="font-family: Courier New;"&gt;monopanner~&lt;/span&gt;)&lt;br&gt; &lt;h3&gt;   implementation&lt;br&gt; &lt;/h3&gt;The inlet receives a control signal as specified in the interface section. This signal is shifted. It's range is then from 0 to 256, which is the same range as the table used. For every value an attenuation factor is looked up in the table. This is then multiplied with the signal itself.&lt;br&gt;The initialization is done by setting the control value to zero and initializing the table.&lt;br&gt;Dollar arguments are implemented to make sure multiple use of &lt;span style="font-family: Courier New;"&gt;pan~&lt;/span&gt; in the same patch allows for unique behaviour.&lt;br&gt;&lt;br&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;a target="_blank" href="http://docs.google.com/File?id=df7z8b86_251c77q799c"&gt;&lt;img style="width: 640px; height: 357.966px;" src="http://docs.google.com/File?id=df7z8b86_251c77q799c"&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;  &lt;br&gt; &lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Verdana;"&gt;&lt;br style="font-family: Verdana;"&gt; &lt;/span&gt;&lt;span style="font-family: Verdana;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt; &lt;div style="text-align: center;"&gt;   &lt;br&gt; &lt;/div&gt; &lt;br&gt; &lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-7950791110555645778?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/7950791110555645778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=7950791110555645778' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/7950791110555645778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/7950791110555645778'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/04/pan-this-block-is-simple-panorama-block.html' title='pan~'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-1684616573303925513</id><published>2007-04-21T14:56:00.000+02:00</published><updated>2007-04-29T16:34:28.604+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>rev~</title><content type='html'>&lt;img src="http://docs.google.com/File?id=df7z8b86_146f59j6nfj" style="height: 35px; width: 64px;" /&gt; &lt;h1&gt;   rev~ &lt;/h1&gt; &lt;p&gt;   This block implements signal reverse: a stereo signal enters the block and one can choose to reverse each channel or both by sending a 1 for reverse and a zero for normal.&lt;br /&gt;&lt;/p&gt; &lt;h3&gt;   version &lt;/h3&gt; &lt;span style="font-family:Courier New;"&gt;&lt;/span&gt;v1.0: built 14/04/2007 with Pd v0.40-2 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/rev%7E%20v1.0.pd" title="[pd]"&gt;[pd]&lt;/a&gt;&lt;a href="http://ronny.ulyssis.be/PureData/Archive/rev%7E%20v1.0.pdf" title="[pdf]"&gt;[pdf]&lt;/a&gt;&lt;span style="font-family:Courier New;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;   interface &lt;/h3&gt; Input1 : the left channel audio signal input&lt;br /&gt;Input2 : the left channel control input; 0 is normal, 1 is reverse signal&lt;br /&gt;Input3 : the right channel control input; 0 is normal, 1 is reverse signal&lt;br /&gt;Input4 : the right channel audio signal input&lt;br /&gt;&lt;br /&gt;Output1: the left channel audio signal, normal or reversed&lt;br /&gt;Output2: the right channel audio signal, normal or reversed&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;   implementation&lt;br /&gt;&lt;/h3&gt;To reverse a signal a multiplication with -1 is done. A moses block bangs the right message for the multiplication by routing the control input. This message changes the factor of the multiplication.&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_147d6zm8fvq" style="height: 204px; width: 307px;" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-family:Verdana;"&gt;  &lt;/span&gt;&lt;span style="font-family:Verdana;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;  &lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-1684616573303925513?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/1684616573303925513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=1684616573303925513' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1684616573303925513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1684616573303925513'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/04/rev-this-block-implements-signal.html' title='rev~'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-6823185048744655407</id><published>2007-04-20T15:38:00.000+02:00</published><updated>2007-04-29T16:34:28.604+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>EARdetector~</title><content type='html'>    &lt;h1&gt;&lt;img style="height: 119px; width: 129px;" src="http://docs.google.com/File?id=df7z8b86_143hfqdj7"&gt;&lt;/h1&gt;&lt;h1&gt;EARdetector~&lt;/h1&gt;&lt;br&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;/span&gt;An &lt;span style="font-weight: bold;"&gt;e&lt;/span&gt;nvelope, &lt;span style="font-weight: bold;"&gt;a&lt;/span&gt;ttack and &lt;span style="font-weight: bold;"&gt;r&lt;/span&gt;est detector. This blocks tells us the instantaneous RMS and peak values of a signal, both in dB and amplitude scale. It also gives a bang when an attack is detected or a rest of more than a specified time constant is registered. The attack and rest detection is based on the envelope of the signal.&lt;br&gt;&lt;h3&gt;version&lt;/h3&gt;v1.0: built 20/04/2007 with Pd v0.40-2 &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/EARdetector%7E%20v1.0.pd"&gt;[pd]&lt;/a&gt;&lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/EARdetector%7E%20v1.0.pdf"&gt;[pdf]&lt;/a&gt;&lt;br&gt;&lt;h3&gt;interface&lt;/h3&gt;Input 1: the signal you want to follow. The attack and rest detectors will only work nicely when this signal is amplified to the loudest level without clipping. This is like adjusting the gain on a mixer.&lt;br&gt;&lt;br&gt;Output 1: in this output three results are packed: a smoothed RMS signal, the instantaneous RMS signal (both in dB) and the smoothed amplitude signal (between 0 and 1)&lt;br&gt;Output 2: in this output two results are packed: a smoothed peak signal in dB and the amplitude signal of it.&lt;br&gt;Output 3: receives a bang if an attack is detected. This happens when a threshold of 55dB is reached and the signal was lower than 45dB before it.&lt;br&gt;Output 4: receives a bang if a rest is detected. This happens whenever a threshold of 45dB is not reached for longer then 100ms&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;When loaded the rest outlet gives a bang after the specified delay.&lt;/span&gt;&lt;br&gt;&lt;h3&gt;implementation&lt;/h3&gt;The basic block used here is the env~ block. It's output is in dB. To calculate the RMS amplitude value a &lt;span style="font-family: Courier New;"&gt;dbtorms &lt;/span&gt;block has to be inserted.&lt;br&gt;&lt;font style="font-style: italic; color: rgb(255, 0, 0);" size="1"&gt;TO DO: test if different arguments give better results (the argument stands for the interval in msec used to calculate the RMS on)&lt;/font&gt;&lt;br&gt;This signal is smoothed by running it through three lowpass filters with a cutoff frequency of 1Hz. Because the filters work on audio signals, a &lt;span style="font-family: Courier New;"&gt;snapshot~&lt;/span&gt; block had to be attached.&lt;br&gt;In the help patch about the env~ block that is found in a standard version of Pd, one sees that the peak value is 3.01dB higher than the RMS value.  &lt;br&gt;The different results are packed to two outlets, the first outputs all RMS values, the second all peak values.&lt;br&gt;The attack detection works as a state machine with two states. When the state is 0 and the signal reaches 55dB or higher, the state becomes 1. When the state is 1 and the signal gets lower than 45dB, the state becomes 0. It might be necessary to adapt these thresholds later.&lt;br&gt;Also the rest detector works a two-state state machine. If a signal is more than 100msec under the threshold of 45dB the state changes to 1. It might be necessary to adapt these thresholds later.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;img style="height: 725px; width: 618px;" src="http://docs.google.com/File?id=df7z8b86_144dd9c9t"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-6823185048744655407?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/6823185048744655407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=6823185048744655407' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/6823185048744655407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/6823185048744655407'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/04/eardetector-documentation-not-yet.html' title='EARdetector~'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-1873959202667980445</id><published>2007-04-16T21:05:00.000+02:00</published><updated>2007-04-23T10:25:27.624+02:00</updated><title type='text'>beat detection</title><content type='html'>    &lt;h1&gt;beat detection&lt;/h1&gt;&lt;h3&gt;development sheet&lt;/h3&gt;In this document blocks and thoughts will be collected that have anything to do with the development of a beat detector in Pure Data. This document (or post) will be updated as long as the first definitive version is not ready.&lt;br&gt;The basic implementation structure is as follows:&lt;br&gt;In a main file beat~ everything will be done. &lt;br&gt;Some smaller topics:&lt;br&gt;&lt;ul&gt;&lt;li&gt;First a few &lt;span style="font-weight: bold;"&gt;links &lt;/span&gt;to previous posts about the topic:&lt;br&gt;&lt;ul&gt;&lt;li&gt;&lt;a title="explanation of the idea" href="http://idafx.blogspot.com/2007/04/beat-detection-in-pure-data.html"&gt;explanation of the idea&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a title="about bonk~" href="http://idafx.blogspot.com/2007/03/beat-detection-in-puredata.html"&gt;about &lt;span style="font-family: Courier New;"&gt;bonk~&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;An &lt;span style="font-weight: bold;"&gt;&lt;span style="font-family: Courier New;"&gt;add &lt;/span&gt;block&lt;/span&gt; is made to be able to add more than two arguments at the same time. It receives a list from a &lt;span style="font-family: Courier New;"&gt;pack &lt;/span&gt;command with up to 20 elements. When this &lt;span style="font-family: Courier New;"&gt;pack &lt;/span&gt;block is banged at the first input, the addition is calculated, and only then. So be sure to put some kind of bang logic there! At the outlet appears the sum as a result of pairwise additions. This block tested and works when the bang is applied.&lt;br&gt;&lt;div style="text-align: center;"&gt;&lt;img style="height: 115px; width: 286px;" src="http://docs.google.com/File?id=df7z8b86_139ckwgxf" align="absmiddle"&gt;---&amp;gt;implementation---&amp;gt;&lt;img style="height: 428px; width: 434px;" src="http://docs.google.com/File?id=df7z8b86_140dhbp96" align="absmiddle"&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;Oops: we are a bit banged by the complexity of using Pd to translate this algorithm. We're now skinning the matlab code we have (see link to &lt;span style="font-style: italic;"&gt;beat it!&lt;/span&gt;) and learning how to make our own externals in C.&lt;br&gt;&lt;br&gt; &lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-1873959202667980445?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/1873959202667980445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=1873959202667980445' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1873959202667980445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1873959202667980445'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/04/beat-detection-development-sheet-in.html' title='beat detection'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-3763968432463614702</id><published>2007-04-12T19:18:00.000+02:00</published><updated>2007-04-15T13:33:24.251+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>sin~</title><content type='html'> &lt;img style="width: 175px; height: 122px;" src="http://docs.google.com/File?id=dhq5msb7_16htghcz"&gt;  &lt;h1&gt;sin~ &lt;/h1&gt; &lt;p&gt;This block calculates the sine for a audio signal (sample by sample). Only &lt;span style="font-family: Courier New;"&gt;cos~&lt;span style="font-family: Verdana;"&gt; is included in PureData.&lt;br&gt;The input is the audio signal. The output its' sine. You can verify its working well with &lt;/span&gt;&lt;/span&gt;&lt;a title="testcos_sin.pd" style="font-family: Verdana;" href="http://ronny.ulyssis.be/PureData/Archive/testcos_sin.pd"&gt;testcos_sin.pd&lt;/a&gt;  &lt;/p&gt;  &lt;h3&gt;version &lt;/h3&gt;&lt;span style="font-family: Courier New;"&gt;&lt;/span&gt;v1.0: built 12/04/2007 with Pd v0.40-2 &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/sin%7E%20v1.0.pd"&gt;[pd]&lt;/a&gt;&lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/sin%7E%20v1.0.pdf"&gt;[pdf]&lt;/a&gt;&lt;br&gt;    &lt;span style="font-family: Courier New;"&gt;&lt;/span&gt;related testfile: &lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Verdana;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;a title="testcos_sin.pd" style="font-family: Verdana;" href="http://ronny.ulyssis.be/PureData/Archive/testcos_sin.pd"&gt;testcos_sin.pd&lt;/a&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;&lt;/span&gt;v1.1: built 13/04/2007 with Pd v0.40-2 &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/sin%7E%20v1.1.pd"&gt;[pd]&lt;/a&gt;&lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/sin%7E%20v1.1.pdf"&gt;[pdf]&lt;/a&gt;&lt;span style="font-family: Courier New;"&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt; &lt;h3&gt;interface &lt;/h3&gt;Input1 : the (mono) audio signal input &lt;br&gt;&lt;br&gt;Output1: the sine for the audio signal&lt;br&gt;&lt;br&gt; &lt;h3&gt;implementation&lt;br&gt;&lt;/h3&gt; &lt;div style="text-align: left;"&gt;&lt;img style="height: 180px; width: 474px;" src="http://docs.google.com/File?id=df7z8b86_137hg9h2d"&gt; &lt;/div&gt;The implementation is based on the relationship between the cosine and the sine function. You have to be careful here because in PureData the arguments are normalised. This means 1 corresponds to 360 degrees or 2*Pi. The cosine of 0.25 gives 0, 0.5 gives -1, 0.75 gives 0 again. This means the sine of  0.25 has to be 1, 0.5 has to be 0, 0.75 has to be -1. So there is a translation of 0.25 between the 2 functions. This comes from&lt;span style="font-style: italic;"&gt; sin(x) = cos (pi/2-x)&lt;/span&gt;&lt;br&gt; &lt;br&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Verdana;"&gt;&lt;br style="font-family: Verdana;"&gt;&lt;/span&gt;&lt;span style="font-family: Verdana;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt; &lt;div style="text-align: center;"&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-3763968432463614702?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/3763968432463614702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=3763968432463614702' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/3763968432463614702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/3763968432463614702'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/04/sin-this-block-calculates-sinus-for.html' title='sin~'/><author><name>tony</name><uri>http://www.blogger.com/profile/05311149308629939532</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-2152052728287107971</id><published>2007-04-12T15:45:00.000+02:00</published><updated>2007-04-13T14:11:09.821+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>rev_mono~</title><content type='html'>          &lt;img style="height: 84px; width: 147px;" src="http://docs.google.com/File?id=dhq5msb7_13fg7fdc"&gt; &lt;h1&gt;   rev_mono~ &lt;/h1&gt;This reverb block contains only 1 input (the mono signal). &lt;br&gt;&lt;br&gt;The creation arguments (liveness, crossover frequency, HF damping) are supplied in three inlets as shown.   &lt;br&gt;&lt;ul&gt;&lt;li&gt;    The "&lt;span style="color: rgb(255, 0, 0);"&gt;liveness&lt;/span&gt;" (actually the internal feedback percentage) should be 100 for infinite reverb, 90 for longish, and 80 for short and so on... &lt;br&gt;&lt;/li&gt;&lt;li&gt;    The &lt;span style="color: rgb(255, 0, 0);"&gt;crossover frequency&lt;/span&gt; and &lt;span style="color: rgb(255, 0, 0);"&gt;HF damping&lt;/span&gt; work together: at frequencies above crossover, the feedback is diminished by the "damping" as a percentage. So zero HF damping means equal reverb time at all frequencies, and 100% damping means almost nothing above the crossover frequency gets through. This is implemented to simulate a vintage analog reverb sound, because the analog circuitry used had also as an effect that the high frequencies were attenuated.&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt; &lt;h3&gt;   version &lt;/h3&gt;v1.0: built 11/04/2007 with Pd v0.40-2 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/rev_mono%7E%20v1.0.pd" title="[pd]"&gt;[pd]&lt;/a&gt;&lt;a href="http://ronny.ulyssis.be/PureData/Archive/rev_mono%7E%20v1.0.pdf" title="[pdf]"&gt;[pdf]&lt;/a&gt;&lt;br&gt;     Final version; defaults are included, output level has to be controlled from outside (not like in rev3~.pd)&lt;br&gt;&lt;br&gt; &lt;br&gt; &lt;h3&gt;   interface &lt;/h3&gt; Input1: mono input channel.&lt;br&gt; &lt;br&gt; Outputs1-4: 4 different combinations of the internal delay taps. Possibly combine them into left and right output&lt;br&gt;&lt;br&gt; Controls:&lt;br&gt;INLET1: set a value for the internal feedback percentage, called liveness, usually between 85 and 100. It ranges form 0 to 100.&lt;br&gt; INLET2: set a value here that indicates the crossover frequency.Once reached, damping occurs. It ranges from 0 to 20kHz. Default is 3000Hz.&lt;br&gt;INLET3: set a value for percentage of feedback damping after reaching the crossover frequency. It ranges from 0 to 100.&lt;br&gt;&lt;br&gt; &lt;br&gt; &lt;h3&gt;   implementation&lt;br&gt; &lt;/h3&gt; &lt;div style="text-align: left;"&gt;   &lt;img style="height: 217px; width: 368px;" src="http://docs.google.com/File?id=dhq5msb7_20gt6wm5" align="middle"&gt;&lt;img style="height: 217px; width: 429px;" src="http://docs.google.com/File?id=dhq5msb7_10cjnjd8" align="middle"&gt;  &lt;/div&gt; The input directly goes to the &lt;span style="font-family: Courier New;"&gt;pd doit&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;block,&lt;span style="font-family: Courier New;"&gt; &lt;span style="font-family: Verdana;"&gt;actually the reverberation calculation block. In this case there is only one mono channel input. We make a combination of the same input into this block. &lt;/span&gt;&lt;br style="font-family: Verdana;"&gt;&lt;br style="font-family: Verdana;"&gt;&lt;span style="font-family: Verdana;"&gt;The control signals are, if needed, translated to different range/values and are given a name. This is the case for INLET1 (gets name &lt;span style="font-weight: bold;"&gt;fb&lt;/span&gt;): the liveness input goes from 0 to 100 (default 85), but in reality has a maximum value of 25%. For INLET2 (gets name &lt;span style="font-weight: bold;"&gt;lop&lt;/span&gt;): the crossover frequency default is set to 3000 Hz. For INLET3 (gets name &lt;span style="font-weight: bold;"&gt;damp&lt;/span&gt;): HF damping is set to a percentage value (default is 50) &lt;/span&gt;&lt;span style="font-family: Verdana;"&gt;and a linear transition is set to 50 ms in order to obtain a smooth change of value.&lt;br&gt;&lt;br&gt;In the figure below you can see the actual filter bank for calculating the reverberation effect. You can see there are 16 different delay lines that are combined into this diagram and all transformed with respect to the give parameters. &lt;span style="font-family: Courier New;"&gt;Lop~ &lt;span style="font-family: Verdana;"&gt;is used to subtract the low frequency part of the signal from the original in order to obtain the high frequency part. After this operation damping with factor &lt;span style="font-weight: bold;"&gt;damp&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; occurs. The level of each delay tab is influenced by &lt;span style="font-weight: bold;"&gt;fb&lt;/span&gt;. The actual combinatorial diagram is just one implementation method. Different methods are possible. This is the best found.&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;img style="height: 797px; width: 894px;" title="the actual calculation of reverbation in different delay tabs" src="http://docs.google.com/File?id=dhq5msb7_11dp2rmx" align="middle"&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Verdana;"&gt;&lt;br style="font-family: Verdana;"&gt;&lt;/span&gt;&lt;span style="font-family: Verdana;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt; &lt;div style="text-align: center;"&gt;   &lt;br&gt; &lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-2152052728287107971?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/2152052728287107971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=2152052728287107971' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/2152052728287107971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/2152052728287107971'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/04/revmono-this-reverb-block-also-contains.html' title='rev_mono~'/><author><name>tony</name><uri>http://www.blogger.com/profile/05311149308629939532</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-925799777886642436</id><published>2007-04-12T15:24:00.000+02:00</published><updated>2007-05-04T15:02:53.977+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>rev_stereo~</title><content type='html'>        &lt;img style="height: 56px; width: 170px;" src="http://docs.google.com/File?id=dhq5msb7_5cr2ngz"&gt; &lt;h1&gt;   rev_stereo~ &lt;/h1&gt;Left/right input respectively for left/right stereo input.&lt;br&gt;The creation arguments (liveness, crossover frequency, HF damping) are suplied in three inlets as shown.   &lt;br&gt;&lt;ul&gt;&lt;li&gt;    The "&lt;span style="color: rgb(255, 0, 0);"&gt;liveness&lt;/span&gt;" (actually the internal feedback percentage) should be 100 for infinite reverb, 90 for longish, and 80 for short and so on... &lt;br&gt;&lt;/li&gt;&lt;li&gt;    The &lt;span style="color: rgb(255, 0, 0);"&gt;crossover frequency&lt;/span&gt; and &lt;span style="color: rgb(255, 0, 0);"&gt;HF damping&lt;/span&gt; work together: at frequencies above crossover, the feedback is diminished by the "damping" as a percentage.So zero HF damping means equal reverb time at all frequencies, and 100% damping means almost nothing above the crossover frequency gets through.This is implemented to simulate a vintage analog reverb sound, because the analog circuitry used had also as an effect that the high frequencies were attenuated.&lt;/li&gt;&lt;/ul&gt;&lt;br&gt; &lt;h3&gt;   version &lt;/h3&gt;&lt;a href="http://ronny.ulyssis.be/PureData/Archive/rev_stereo%7E%20v1.0.pd" title="[pd]"&gt;&lt;/a&gt;v1.0: built 11/04/2007 with Pd v0.40-2 &lt;a href="http://ronny.ulyssis.be/PureData/Archive/rev_stereo%7E%20v1.0.pd" title="[pd]"&gt;[pd]&lt;/a&gt;&lt;a href="http://ronny.ulyssis.be/PureData/Archive/rev_stereo%7E%20v1.0.pdf" title="[pdf]"&gt;[pdf]&lt;/a&gt;&lt;br&gt;     Final version; defaults are included included, output level has to be controlled from outside (not like in rev3~.pd)&lt;br&gt;&lt;br&gt; &lt;br&gt; &lt;h3&gt;   interface &lt;/h3&gt; Input1 &amp;amp; 2: the left and right channel from stereo signal&lt;br&gt; &lt;br&gt; Outputs1-4: 4 different combintions of the internal delay taps. Possibly combine them into left and right output&lt;br&gt;&lt;br&gt; Controls:&lt;br&gt;INLET1: set a value for the internal feedback percentage, called liveness, usually between 85 and 100. It ranges form 0 to 100.&lt;br&gt; INLET2: set a value here that indicates the crossover frequency.Once reached, damping occures. It ranges from 0 to 20kHz. Default is 3000Hz.&lt;br&gt;INLET3: set a value for percentage of feedback damping after reaching the crossover frequency. It ranges from 0 to 100.&lt;br&gt;&lt;br&gt; &lt;br&gt; &lt;h3&gt;   implementation&lt;br&gt; &lt;/h3&gt; &lt;div style="text-align: left;"&gt;   &lt;img style="height: 197px; width: 367px;" src="http://docs.google.com/File?id=dhq5msb7_6dscpnw" align="middle"&gt;&lt;img style="height: 217px; width: 429px;" src="http://docs.google.com/File?id=dhq5msb7_10cjnjd8" align="middle"&gt;  &lt;/div&gt; The input directly goes to the &lt;span style="font-family: Courier New;"&gt;pd doit&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;block,&lt;span style="font-family: Courier New;"&gt; &lt;span style="font-family: Verdana;"&gt;actually the reverbation calculation block. In this case there are 2 different inputs (left and right channel). It is possible to make a combination of the same input into this block.&lt;/span&gt;&lt;br style="font-family: Verdana;"&gt;&lt;br style="font-family: Verdana;"&gt;&lt;span style="font-family: Verdana;"&gt;The control signals are, if needed, translated to different range/values and are given a name. This is the case for INLET1 (gets name &lt;span style="font-weight: bold;"&gt;fb&lt;/span&gt;): the liveness input goes from 0 to 100 (default 85), but in reality has a maximum value of 25%. For INLET2 (gets name &lt;span style="font-weight: bold;"&gt;lop&lt;/span&gt;): the crossover frequency default is set to 3000 Hz. For INLET3 (gets name &lt;span style="font-weight: bold;"&gt;damp&lt;/span&gt;): HF damping is set to a percentage value (default is 50) &lt;/span&gt;&lt;span style="font-family: Verdana;"&gt;and a linear transition is set to 50 ms in orde to obtain a smooth change of value.&lt;br&gt;&lt;br&gt;In the figure below you can see the actual filterbank for calculating the reverbation effect. You can see there are 16 different delay lines that are combined into this diagram and all transformed with respect to the give parameters. &lt;span style="font-family: Courier New;"&gt;Lop~ &lt;span style="font-family: Verdana;"&gt;is used to substract the low frequency part of the signal from the origininal in order to obtain the high frequency part. After this operation damping with factor &lt;span style="font-weight: bold;"&gt;damp&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; occures. The level of each delay tab is influenced by &lt;span style="font-weight: bold;"&gt;fb&lt;/span&gt;. The actual combinatorial diagram is just one implementation method. Different methods are possible. This is the best found.&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;img style="height: 797px; width: 894px;" title="the actual calculation of reverbation in different delay tabs" src="http://docs.google.com/File?id=dhq5msb7_11dp2rmx" align="middle"&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Verdana;"&gt;&lt;br style="font-family: Verdana;"&gt;&lt;/span&gt;&lt;span style="font-family: Verdana;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt; &lt;div style="text-align: center;"&gt;   &lt;br&gt; &lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-925799777886642436?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/925799777886642436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=925799777886642436' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/925799777886642436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/925799777886642436'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/04/revstereo-leftright-input-respectively.html' title='rev_stereo~'/><author><name>tony</name><uri>http://www.blogger.com/profile/05311149308629939532</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-4395914226188409865</id><published>2007-04-10T15:44:00.000+02:00</published><updated>2007-04-14T19:02:48.639+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>waves</title><content type='html'>     &lt;img style="height: 46px; width: 65px;" src="http://docs.google.com/File?id=df7z8b86_124hhdmxf"&gt;&lt;br&gt;&lt;h1&gt;waves&lt;/h1&gt;A block that implements some waves with a specific frequency and normalized output. It provides a (co)sine wave, (reverse) sawtooth, triangle and rectangular wave. Two blocks can be added or combined and rescaled in any other way to make new waves. One &lt;span style="font-family: Courier New;"&gt;waves &lt;/span&gt;block connected to another one gives quadratic waves.&lt;br&gt;&lt;h3&gt;version&lt;/h3&gt;sin~ &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/sin%7E%20v1.0.pd"&gt;[pd]&lt;/a&gt; &lt;br&gt;v1.0: built with Pd v0.40-2 &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/waves%20v1.0.pd"&gt;[pd]&lt;/a&gt; &lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/waves%20v1.0.pdf"&gt;[pdf]&lt;/a&gt;&lt;br&gt;v1.1: adapted with Pd v0.40-2 &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/waves%20v1.1.pd"&gt;[pd]&lt;/a&gt; &lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/waves%20v1.1.pdf"&gt;[pdf]&lt;/a&gt;&lt;br&gt;    sine wave added, RESET knob added&lt;br&gt;v2.0: built with Pd v0.40-2 &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/waves%20v2.0.pd"&gt;[pd]&lt;/a&gt; &lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/waves%20v2.0.pdf"&gt;[pdf]&lt;/a&gt;&lt;br&gt;    new control logic&lt;br&gt;    reverse sawtooth added&lt;br&gt; &lt;h3&gt;interface&lt;br&gt;&lt;/h3&gt;Input 1: A value for the frequency of the wave. It is expressed in Hertz and thus must be positive.&lt;br&gt;Input 2: Reset knob. When it is pressed, the wave is restarted from the beginning. For a sine wave, square and sawtooth this is 0, for a cosine, reverse sawtooth and triangle it is 1&lt;br&gt;Input 3: MIDI control change number. This is used to select the wave: when MIDI control change message 52 sends a value of 127 (aka is pressed in), the different waveforms are cycled.&lt;br&gt;&lt;br&gt;Output 1: A waveform with a specified frequency, specified form and an amplitude that ranges between 0 and 1.&lt;br&gt;&lt;h3&gt;implementation&lt;/h3&gt;&lt;br&gt;&lt;div style="text-align: center;"&gt;&lt;img style="height: 174px; width: 232px;" src="http://docs.google.com/File?id=df7z8b86_135g74qtw" align="absmiddle"&gt;&lt;img style="height: 184px; width: 211px;" src="http://docs.google.com/File?id=df7z8b86_125cc2hj4" align="absmiddle" border="0" hspace="0" vspace="0"&gt;&lt;img style="height: 178px; width: 214px;" src="http://docs.google.com/File?id=df7z8b86_127ff26dz" align="absmiddle"&gt;&lt;img style="height: 184px; width: 219px;" src="http://docs.google.com/File?id=df7z8b86_128hgsq8x" align="absmiddle" border="0" hspace="0" vspace="0"&gt;&lt;img style="height: 177px; width: 215px;" src="http://docs.google.com/File?id=df7z8b86_130dxgrdh" align="absmiddle"&gt;&lt;br&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="text-decoration: underline;"&gt;fig&lt;/span&gt;: respectively prints of a reverse sawtooth, sine or cosine, sawtooth, triangle and quadratic wave&lt;/span&gt;&lt;br&gt;&lt;/div&gt;The frequency value one inputs is turned into a signal type with &lt;span style="font-family: Courier New;"&gt;sig~&lt;/span&gt;. You get a signal with constant amplitude equal to the value specified. Then a &lt;span style="font-family: Courier New;"&gt;phasor~&lt;/span&gt; object runs through every value starting from 0 to 1 and again at a frequency specified. This already is a ready-made sawtooth signal.&lt;br&gt;The sine block is based on the relationship between sine and cosine function. Read more in documentation of &lt;span style="font-family: Courier New;"&gt;sin~&lt;/span&gt;&lt;br&gt;The sawtooth wave is also used as table lookup signal for the other waves. The &lt;span style="font-family: Courier New;"&gt;cos~&lt;/span&gt; block calculates for each sample the cosine value. This sine is raised above 0 and normalized by dividing with two, or less expensive: multiplying with a half.&lt;br&gt;The triangle is calculated by shifting the sawtooth so it lies around zero, then taking the absolute value so that the negative part is mirrored to the positive side. This triangle wave has to be scaled by multiplying it with two.&lt;br&gt;To obtain a reverse sawtooth, the sawtooth is multiplied with -1 which results in a mirroring of the wave around the x-axis. To rescale the wave to a range of 0 to 1, a shift is performed by adding 1 to the wave.&lt;br&gt;The rectangular wave is made by selectively choosing a 1 or a 0 to output. This is done by the&lt;span style="font-family: Courier New;"&gt; moses&lt;/span&gt; block. Because it takes only control lines or values, one has to add a &lt;span style="font-family: Courier New;"&gt;snapshot~&lt;/span&gt; block before it that is banged after each DSP cycle with the &lt;span style="font-family: Courier New;"&gt;bang~&lt;/span&gt; block. The &lt;span style="font-family: Courier New;"&gt;sig~&lt;/span&gt; block transforms this control signal into an audio signal again.&lt;br&gt;All waves can be seen in the graph when banged on the knob that is located next to the &lt;span style="font-family: Courier New;"&gt;select &lt;/span&gt;block on top. It isn't automatically rewritten because that would slow down calculations. Every time a new wave is selected it will be drawn once.&lt;br&gt;The control logic is simple. When a specific MIDI control change number is received with a value of 127 a counter adds up. This addition is modulo the number of waveforms. An extra select block is added to select a number from the counter and then bang the right message.&lt;span style="font-family: Courier New;"&gt;&lt;/span&gt; Each output in this patch has a multiplication with one or zero to turn it on or off.&lt;br&gt; -ronny 4/14/07 6:59 PM&lt;/span&gt; &lt;br&gt;&lt;br&gt;&lt;div style="text-align: center;"&gt;&lt;img style="height: 517px; width: 1024px;" src="http://docs.google.com/File?id=df7z8b86_134dgz5kb"&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-4395914226188409865?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/4395914226188409865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=4395914226188409865' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/4395914226188409865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/4395914226188409865'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/04/waves-block-that-implements-some-waves.html' title='waves'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-149304480947949417</id><published>2007-04-06T10:44:00.000+02:00</published><updated>2007-05-09T22:08:20.160+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>phaser~</title><content type='html'>&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_221mkj5xphz" /&gt;&lt;/div&gt;&lt;h1&gt;phaser~&lt;/h1&gt;Adds a phase-shifted sound to the original sound, producing a swirling modulation that creates spaciousness and depth. Three different methods are selectable and one can control the frequency and range of the modulation, also providing different control wave forms.&lt;br /&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;version&lt;/h3&gt;&lt;br /&gt;v1.0: built 5/04/2007 with Pd v0.40-2 &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/phaser%7E%20v1.0.pd"&gt;[pd]&lt;/a&gt; &lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/phaser%7E%20v1.0.pdf"&gt;[pdf]&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;interface&lt;/h3&gt;Input1: incoming mono audio signal&lt;br /&gt;Input2: this inlet takes values between 0 and 127 that specify the frequency of the control waves. It stands for the RATE parameter.&lt;br /&gt;Input3: this inlet takes values between 0 and 127 that specify the range of the control waves. It stands for the DEPTH parameter.&lt;br /&gt;&lt;br /&gt;Output1: The phase shifted mono signal that is output.&lt;br /&gt;&lt;br /&gt;Controls:&lt;br /&gt;Different control curves: For a sine wave, sawtooth, triangle or square wave, currently the MIDI control messages are assigned this way: respectively 52, 53, 54, 55.&lt;br /&gt;Different phaser implementations: Also assigned with MIDI control change messages: 4 allpass stages is 56, 3 times 4 stages is 57 and 6 stages is 58. The default is four allpass stages.&lt;br /&gt;&lt;h3&gt;implementation&lt;/h3&gt;&lt;img style="height: 132px; width: 173px;" src="http://docs.google.com/File?id=df7z8b86_119fxth3h" align="left" border="0" hspace="0" vspace="0" /&gt;The basic building block of the phaser is a &lt;span style="font-family:Courier New;"&gt;pd allpass~&lt;/span&gt; block. As seen in the figure it is a real one-zero (non-recursive) 'reverse' filter followed by a real one-pole (recursive) filter, both with the same coëfficiënts. For visual reasons, the coëfficiënts are passed to an outlet. This combination thus presents one stage of allpass filtering. This leaves the gain of all frequencies unchanged, but it alters the phase response.&lt;br /&gt;The coëfficiënts of these allpass filters are altered in time. The &lt;span style="font-family:Courier New;"&gt;waves &lt;/span&gt;block outputs a specific control curve with a chosen frequency (RATE). This curve (that lies between 0 and 1) is then scaled with the DEPTH parameter and it is also offset to lie under one. The DEPTH parameter is divided by 131 because the maximum value of the curve is 0.97 and when a range is chosen it can maximally extend to zero. The maximum value that can be passed is 127, so the 131 divides the interval maximally.&lt;br /&gt;With the &lt;span style="font-family:Courier New;"&gt;select &lt;/span&gt;and &lt;span style="font-family:Courier New;"&gt;ctlin &lt;/span&gt;block one can choose between three setups. The A-form (A has no special meaning) uses four stages and outputs the signal coming from the last stage. The B-form, that sounds more boosted, uses three times four stages and sums every block of four stages. The C-form is another widely spread form that uses 6 allpass stages.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img style="height: 654px; width: 519px;" src="http://docs.google.com/File?id=df7z8b86_118f7g5rq" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-149304480947949417?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/149304480947949417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=149304480947949417' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/149304480947949417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/149304480947949417'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/04/monophaser-adds-phase-shifted-sound-to.html' title='phaser~'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-9030910342032458023</id><published>2007-04-05T23:15:00.000+02:00</published><updated>2007-04-05T23:29:26.779+02:00</updated><title type='text'>beat detection in pure data</title><content type='html'>Today I've also been working on a beat detection algorithm for pure data.&lt;br /&gt;The basic idea behind the whole algorithm is outlined in &lt;a href="http://www.owlnet.rice.edu/%7Eelec301/Projects01/beat_sync/beatalgo.html"&gt;&lt;span style="font-style: italic;"&gt;beat this!&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;It consists of four steps:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;filterbank&lt;/li&gt;&lt;li&gt;smoothing&lt;/li&gt;&lt;li&gt;diff-rect&lt;/li&gt;&lt;li&gt;comb filtering&lt;/li&gt;&lt;/ul&gt;The first three steps (see website for more explanation) are done by the bonk~ block that is included in the standard Pd download. So as an output we get, for eleven parts of the frequency spectrum, the loudness of an attack.&lt;br /&gt;The last step use a bunch of combfilters, each representing a specific tempo. All filters are convoluted with each signal and this should have to give higher energy values for comb filters that are close to the tempo of the signal.&lt;br /&gt;I made a combfilter block that we can use afterwards. It uses three arguments: window, frame or blocksize firstly, then the resonant frequency and then the bandwidth. The bandwidth specifies how wide the teeth of the comb are: when it is close to zero, most of the signal is let through. When it's close to 0.5, the teeth are very wide and there is not much space between them.&lt;br /&gt;I already realize that the convolution is better done in the frequency domain, because it is a multiplication there.&lt;br /&gt;But the rest is for tomorrow or something.&lt;br /&gt;Sleep tight&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-9030910342032458023?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/9030910342032458023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=9030910342032458023' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/9030910342032458023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/9030910342032458023'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/04/beat-detection-in-pure-data.html' title='beat detection in pure data'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-4177203213150098833</id><published>2007-04-04T18:30:00.000+02:00</published><updated>2007-05-06T22:16:06.102+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>flanger~</title><content type='html'>           &lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_218gzbwnnc9"&gt;&lt;/div&gt;&lt;br&gt;&lt;h1&gt;flanger~&lt;/h1&gt;This block applies a flanger effect on the incoming mono audio signal, that is the original signal delayed with a variable delay. It gives a metallic resonant effect like a jet plane taking off or landing. You can choose between several control curves and a free input for a control curve. You also have to include an argument otherwise the effect won't work. &lt;br&gt;&lt;h3&gt;version&lt;/h3&gt;&lt;span style="font-family: Courier New;"&gt;waves v2.0: &lt;span style="font-family: Verdana;"&gt;look at the documentation of this block to see what it does &lt;/span&gt;&lt;/span&gt;&lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/waves%20v2.0.pd"&gt;[pd]&lt;/a&gt; &lt;br&gt;v1.0: built 4/04/2007 with Pd v0.40-2 &lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/flanger%7E%20v1.0.pdf"&gt;[pdf]&lt;/a&gt; &lt;font size="1"&gt;&lt;/font&gt;&lt;br&gt;v1.1: built 5/04/2007 with Pd v0.40-2 &lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/flanger%7E%20v1.1.pdf"&gt;[pdf]&lt;/a&gt;&lt;br&gt;    &lt;span style="font-family: Courier New;"&gt;waves &lt;/span&gt;block added for more choices in control curve&lt;br&gt;    free control added&lt;br&gt;v1.2: built 13/04/2007 with Pd v0.40-2 &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/flanger%7E%20v1.2.pd"&gt;[pd]&lt;/a&gt;&lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/flanger%7E%20v1.2.pdf"&gt;[pdf]&lt;/a&gt;&lt;br&gt;    &lt;span style="font-family: Courier New;"&gt;waves &lt;/span&gt;block is separated in development and documentation&lt;br&gt;    thus no real differences with previous version, alone the documentation has changed.&lt;br&gt;v2.0: built 13/04/2007 with Pd v0.40-2 &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/flanger%7E%20v2.0.pd"&gt;[pd]&lt;/a&gt;&lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/flanger%7E%20v2.0.pdf"&gt;[pdf]&lt;/a&gt;&lt;br&gt;    a feedback loop is added and the level and feedback are unified into one control&lt;br&gt;&lt;h3&gt;interface&lt;/h3&gt;Input1: incoming mono audio signal&lt;br&gt;Input2: modulation frequency (MODFREQ) ranges from 0-127 (representing normalized values between 0 and 1). This parameter specifies how fast the delayed signal changes between leaping forward and lagging behind. It's modulation curve is selectable in the waves block: one can cycle through different waveforms by pushing a specific button (see documentation on &lt;span style="font-family: Courier New;"&gt;waves&lt;/span&gt;). The amplitude is fixed to 10. If one wants to use a different amplitude for the control curve of the variable delay, the previous version should be used.&lt;br&gt;Input3: the feedback level (FBK) ranges from 0-127. This parameter specifies the range of the variable delay, how far it lags behind or leaps forward. It represents the maximum difference from no delay. When leaping forward the pitch gets higher and vice versa. If it's zero, the loop is off.&lt;br&gt;Input4: an inlet for a control signal that directly controls the variable delay time. Be careful to give a quite low frequency signal with an amplitude that is not too big.&lt;br&gt;&lt;br&gt;Output1: outgoing mono audio signal: this is only the wet signal, the original signal delayed with a variable delay.&lt;br&gt;&lt;h3&gt;implementation&lt;/h3&gt;The input signal is written into a delay line.&lt;br&gt;The &lt;span style="font-family: Courier New;"&gt;waves &lt;/span&gt;block outputs a normalized waveform with a frequency specified by the MODFREQ parameter.&lt;br&gt;The amplitude is fixed to 10 by a multiplication. This waveform is then used as the varying delay time for the &lt;span style="font-family: Courier New;"&gt;vd~&lt;/span&gt; block. When the values of the waveform are greater than zero, the delay will leap forward (with a maximum of one block size), when it's smaller it leaps behind (the delay time is greater).&lt;br&gt;&lt;div style="text-align: left;"&gt;This signal is put in the feedback loop, which feedback level is controlled by a simple amplitude logic consisting of scale block (/127) and a multiplication.&lt;br&gt;&lt;br&gt;It is important to include an argument. This is needed to make, at the same time, 2 different flanger computations possible. Otherwise the delay-lines of several flanger effects used would have the same name. Now with the dollar sign, the name of the argument is inserted.&lt;br&gt;&lt;div style="text-align: center;"&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;div style="padding: 1em 0pt; text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_220pws8rbck"&gt;&lt;/div&gt;&lt;/div&gt;   &lt;/div&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-4177203213150098833?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/4177203213150098833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=4177203213150098833' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/4177203213150098833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/4177203213150098833'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/04/flanger-this-block-applies-flanger.html' title='flanger~'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-4059861470673258880</id><published>2007-04-02T18:04:00.000+02:00</published><updated>2007-04-13T10:56:40.479+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>stereomultitapdelay~</title><content type='html'>&lt;img src="http://docs.google.com/File?id=df7z8b86_92sqvkm2" style="height: 358px; width: 701px;" /&gt;&lt;br /&gt;&lt;h1&gt;   monomultitapdelay~ &lt;/h1&gt; This is a versatile delay effect. It can simulate the traditional delay (as in the &lt;span style="font-family:Courier New;"&gt;monotraditionaldelay~&lt;/span&gt; block and others), and many more. One has ten taps at his disposal, each one is separately controllable: delay time DLY, volume level of that tap LVL and place in the stereo image PAN. The first five taps also have the feedback level FBK parameter (as for the traditional delay).&lt;br /&gt;Use:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;     To simulate the monotraditionaldelay~ use one of the first five taps, set     LVL and PAN to 0. All other parameters are also 0. Now choose your DLY and     FBK.   &lt;/li&gt;   &lt;li&gt;     Ping-pong delay: Look at the figure on top of this page. Every tap is routed     to another output. Here you see a L-R style. Other styles are: L_C_R,     dynamic and random.   &lt;/li&gt; &lt;/ul&gt; Every tap is output separately, but the stereo signal is on the last two outputs. All these signals are wet (that means, the original signal is not included)&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;   version &lt;/h3&gt;monotraditionaldelaysimple~ v1.0 &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/monotraditionaldelaysimple%7E%20v1.0.pd"&gt;[pd]&lt;/a&gt;&lt;br /&gt;pan~ v1.0 &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/pan%7E%20v1.0.pd"&gt;[pd]&lt;/a&gt;&lt;br /&gt;v1.0: built 2/04/2007 with Pd v0.40-2 &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/monomultitapdelay%7E%20v1.0.pd"&gt;[pd]&lt;/a&gt;&lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/monomultitapdelay%7E%20v1.0.pdf"&gt;[pdf]&lt;/a&gt;&lt;br /&gt;   Temporary version; presets will be included, display will be less full, more inputs will be added to control the effect like other delay blocks (BPM, measure, an array of DLY,...)&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;   interface &lt;/h3&gt; Input1: the mono signal you want to delay/ go crazy&lt;br /&gt;&lt;br /&gt;Outputs1-10: the mono signal that is output by the corresponding tap&lt;br /&gt;Outputs11-12: the left and right main output of the effect. All the taps are summed here after being placed in the stereo image.&lt;br /&gt;&lt;br /&gt;Controls:&lt;br /&gt;DLY1-10: set a value here that indicates when the delayed signal will be throughput. It ranges from 0 to 3000msec.&lt;br /&gt;LVL1-10: set a value here that indicates the volume level of the corresponding tap. It ranges from 0 to 100, 100 meaning at the same level as the input signal.&lt;br /&gt;FBK1-5: set a value here that indicates the attenuation of the inner delay loop of this tap. It ranges from 0 to 100, 100 meaning that the loop will keep on repeating infinitely and as loud as the input signal (instability)&lt;span style="color: rgb(255, 0, 0);font-size:78%;" &gt;&lt;span style="font-style: italic;"&gt;(TO DO)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;PAN1-10: set a value here  that indicates where the mono signal is placed in the stereo image. It ranges from -127 to 127, 0 meaning CENTER. The panning curve used is the equal power sine curve.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;   implementation&lt;br /&gt;&lt;/h3&gt; &lt;div style="text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_93fr6pbw" style="height: 89px; width: 174px;" /&gt;             &lt;img src="http://docs.google.com/File?id=df7z8b86_94fpmjf8" style="height: 102px; width: 127px;" /&gt;&lt;br /&gt;&lt;/div&gt; The input is directly written in a delay line &lt;span style="font-family:Courier New;"&gt;delay &lt;/span&gt;with a maximum delay length of 3000 msec. It is also on a bus with the &lt;span style="font-family:Courier New;"&gt;throw~&lt;/span&gt; block for every tap to grab the signal from.&lt;br /&gt;The main output section also consists of two buses, one for each channel of the stereospectrum.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_95fbrt5r" style="height: 101px; width: 270px;" align="absmiddle" border="0" hspace="0" vspace="0" /&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_96hmvkhz" style="height: 71px; width: 138px;" align="absmiddle" border="0" hspace="0" vspace="0" /&gt;&lt;img src="http://docs.google.com/File?id=df7z8b86_97fpp52s" style="height: 248px; width: 125px;" align="absmiddle" border="0" hspace="0" vspace="0" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt;From left to right: a single delay part with feedback control, a single delay part and a single tap part.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;A delay in a tap is done by reading the delay line delay at a specific time. The &lt;span style="font-family:Courier New;"&gt;delread~&lt;/span&gt; object does this. For the five first taps also a simple mono traditional delay block is foreseen. It's nothing but a skinned version of the original &lt;span style="font-family:Courier New;"&gt;monotraditionaldelay~&lt;/span&gt; block. It also has no display. You can see the implementation in the figure hereunder.&lt;br /&gt;Every tap is then attenuated by the LVL parameter before being sent to its output. Also this attenuated signal is panned with a &lt;span style="font-family:Courier New;"&gt;pan~&lt;/span&gt; block, also a simpler version of the original &lt;span style="font-family:Courier New;"&gt;monopanner~&lt;/span&gt; block. See the figure underneath. As you can see, also here the controls are left out and only the inlets are kept. It is then put on the buses outL and outR. There will be no documentation for these two blocks as long as their not used elsewhere.&lt;br /&gt;&lt;img style="height: 528px; width: 266px;" src="http://docs.google.com/File?id=df7z8b86_98g46t22" align="absmiddle" /&gt;&lt;img style="height: 351px; width: 821px;" src="http://docs.google.com/File?id=df7z8b86_99f7mvgq" align="absmiddle" border="0" hspace="0" vspace="0" /&gt;&lt;br /&gt;For completeness also the implementation of the controls and display are given. Every parameter is sent or received apart, where a pack and unpack block could have been used. This is not done because the idea exists that it would slow down the algorithm. This because every time a parameter would change, a whole array must be re-sent, packed and unpacked. On the other side, it would look nicer.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img style="height: 561px; width: 295px;" src="http://docs.google.com/File?id=df7z8b86_105htndm9" align="absmiddle" /&gt;&lt;img style="height: 459px; width: 389px;" src="http://docs.google.com/File?id=df7z8b86_106fjzb74" align="absmiddle" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-4059861470673258880?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/4059861470673258880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=4059861470673258880' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/4059861470673258880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/4059861470673258880'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/04/monomultitapdelay-this-is-versatile.html' title='stereomultitapdelay~'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-5725874310587985522</id><published>2007-04-01T15:56:00.000+02:00</published><updated>2007-04-13T10:56:40.479+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>monotraditionaldelay~</title><content type='html'>&lt;h1&gt;&lt;img style="width: 375px; height: 156px;" src="http://docs.google.com/File?id=df7z8b86_89gbt3np" /&gt;&lt;/h1&gt; &lt;h1&gt;monotraditionaldelaybpm~&lt;/h1&gt; &lt;p&gt;This block implements a traditional delay effect with feedback loop. Every parameter can be changed by the inlets, except the measure. It handles a mono signal and outputs a mono signal too. It is based on the parameter bpm and works on the tempo of the song. You can choose how much times the delayed signal is repeated between two beats.&lt;/p&gt; &lt;h3&gt;version&lt;/h3&gt; &lt;p&gt;v1.0: built 30/03/2007 with Pd v0.40-2 &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/monotraditionaldelaybpm%7E%20v1.0.pd"&gt;[pd]&lt;/a&gt;&lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/monotraditionaldelaybpm%7E%20v1.0.pdf"&gt;[pdf]&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;interface&lt;/h3&gt; &lt;p&gt;Input 1: the mono signal you want to delay&lt;br /&gt;Input 2: the beats per minute parameter BPM&lt;br /&gt;Input 3: the feedback parameter FBK&lt;/p&gt; &lt;p&gt;Input 4: the on/off switch for external control&lt;br /&gt;&lt;br /&gt;Output 1: the delayed, wet mono signal&lt;br /&gt;&lt;br /&gt;Controls:&lt;/p&gt; &lt;p&gt;&lt;em&gt;params:&lt;/em&gt; These four number boxes show the current values of the respective parameters. There's also a small slider to display the DLY parameter physically (easier to compare the effect of the BPM on the DLY). The DLY value is the delay time between the current and the next signal samples. The BPM value is current tempo that is chosen. actFBK is the current feedback level, which indicates the attenuation of the next delayed signal compared to the current one. The memFBK is the value of FBK that will be used when the switch is turned to back on.&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;span style="font-size:78%;color:#ff0000;"&gt;TO DO: find another name for this parameter, as the FBK is not really remembered. This is not a problem, because one has to be able to set a new value before turning it on again.&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;top number box and horizontal slider:&lt;/span&gt; adjust the beats per minute (BPM) parameter. One can choose a tempo for the delay. It ranges from 20bpm tot 250bpm. This equals a maximum delay value of 3000msec when a BPM value of 20bpm is chosen and the measure is 1/1.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;bottom number box and horizontal slider:&lt;/span&gt; adjust the feedback (FBK) level parameter. The signal is attenuated with this value divided by 1000. In other words, you can vary the level from 0 (no delay audible) to 0.999 (maximum amplitude of the delayed signals, keeps on repeating as if it never ends) with steps of thousands.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;switch button:&lt;/span&gt; is used to set the FBK parameter to 0 and thus turning of the delayed signal. When the switch is turned back on, the last chosen value of FBK or the new value if the controls are changed, will be reset.&lt;/p&gt; &lt;p&gt;measure: One can specify how many times the signal is sent back into the delayloop between two beats. A fraction of 1/2 will divide the DLY time by two, so that two delays are heard between two beats.&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;span style="font-size:78%;color:#ff0000;"&gt;TODO: maybe also some fractions with a numerator greater than the denominator can be added to the effect.&lt;/span&gt;&lt;/em&gt;&lt;/p&gt; &lt;h3&gt;implementation&lt;/h3&gt; &lt;p&gt;The delay itself is pretty simple: the incoming signal is read by a &lt;span style="font-family:Courier New;"&gt;delread~&lt;/span&gt; object that writes the signal into a delay line called &lt;span style="font-family:Courier New;"&gt;delay1&lt;/span&gt; and with length 3000msec. Although there's no visible loop, this is how the loop is formed: after a delay time DLY the associated &lt;span style="font-family:Courier New;"&gt;delread~&lt;/span&gt; object reads what's in the delay line, outputs it and sends it back into the &lt;span style="font-family:Courier New;"&gt;delwrite~&lt;/span&gt; object. Before outputting the delayed signals they are attenuated every time by a factor FBK ranging between 0 and 0.999 (with 1 clipping is to easy), in steps of thousands. That's why the control parameter lies between 0.001 and 999.&lt;br /&gt;A possibility is left in the implementation to also mix the wet output with the original, dry signal, by connecting the unconnected &lt;span style="font-family:Courier New;"&gt;throw~&lt;/span&gt; and &lt;span style="font-family:Courier New;"&gt;catch~&lt;/span&gt; objects.&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0); font-style: italic;font-size:78%;" &gt;TO DO: It's possible to also implement an HF DAMP function which simulates a retro analog delay effect. It's nothing more than adding a lowpass filter with fairly high cutoff frequency (or even adjustable) in the delayline.&lt;/span&gt;&lt;br /&gt;A short calcultation is done to compute the delay time parameter from the BPM and the measure choice DIV.  &lt;span style="font-family:Courier New;"&gt;DLY=DIV*60000*BPM^-1&lt;/span&gt;. The &lt;span style="font-family:Courier New;"&gt;bang&lt;/span&gt; and &lt;span style="font-family:Courier New;"&gt;multiplication&lt;/span&gt; block have to be added to ensure direct reaction when another measure is chosen. Here also the default value of 1 is set by using it as a parameter in the &lt;span style="font-family:Courier New;"&gt;multiplication&lt;/span&gt; lbock.&lt;/p&gt; &lt;p&gt;The initialisation is done mainly at the left of the canvas: The BPM is set to its maximum value 250 so that the DLY is as small as possible. FBK is set to zero and the switch is off too.&lt;/p&gt; &lt;p&gt;The switch functions because the value of the toggle (0 or 1) is used to multiply the current FBK with, resulting in a zero when the switch is off and the actual value if it is on.&lt;br /&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;img style="width: 761px; height: 713px;" src="http://docs.google.com/File?id=df7z8b86_90c6t5bc" /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-5725874310587985522?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/5725874310587985522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=5725874310587985522' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/5725874310587985522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/5725874310587985522'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/04/monotraditionaldelaybpm-this-block.html' title='monotraditionaldelay~'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-3965169245349250328</id><published>2007-03-30T15:23:00.000+02:00</published><updated>2007-04-30T17:43:33.959+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>PureData remarks 2</title><content type='html'>&lt;ul&gt;&lt;li&gt;As long as I don't find a better solution, I'll put the parameters for display and for adjusting both apartly in the display. If I just connect a number box and a slider together, stack overflow errors occur, sometimes slowing down the system.&lt;/li&gt;&lt;li&gt;I connected my &lt;span style="font-weight: bold;font-family:trebuchet ms;" &gt;korg microkorg&lt;/span&gt; midicontroller to my laptop to use it in PureData. This works fine. I keep a written chart with all the control change numbers of the controls at hand. Because MIDI data ranges from 0 to 127, I adjusted the inputs of some effects I already had. From now on this will be the unified way for ranges of control inlets.&lt;/li&gt;&lt;li&gt;Apparently when one reads into an array, an array must be added to the patch too. You can make it small by unchecking the graph on parent button, but it is still wondering around there.&lt;/li&gt;&lt;li&gt;It's important that when you will be using a block several times in the same patch (something we must do), every parameter name that can be sent without a line is named with a $-sign. send, receive, throw, catch, delread, delwrite and several others must have a name like $1-name. When you use the block, you give a unique number as argument. This number is filled where $1 is placed. This works only when the dollarsign is placed in front of the name.&lt;/li&gt;&lt;li&gt;The dollarsign has another meaning when used in messages. There exists no $0. The dollarsign is replaced by the n-th value of the inlet.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-3965169245349250328?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/3965169245349250328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=3965169245349250328' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/3965169245349250328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/3965169245349250328'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/03/puredata-remarks-2.html' title='PureData remarks 2'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-5195433373960985630</id><published>2007-03-29T21:18:00.000+02:00</published><updated>2007-04-13T10:56:40.480+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>monotraditionaldelaybpm~ bad try</title><content type='html'>&lt;h3&gt;   &lt;img src="http://docs.google.com/File?id=df7z8b86_80nz8kwx" style="width: 376px; height: 154px;" /&gt;&lt;br /&gt;&lt;/h3&gt; &lt;h1&gt;   monotraditionaldelaybpm~ &lt;/h1&gt; &lt;h1&gt;   &lt;span style="color: rgb(255, 0, 0);"&gt;bad try - discontinued&lt;/span&gt;&lt;br /&gt;&lt;/h1&gt; This block delays an incoming signal and outputs the wet signal on one channels. The original signal is not throughput. It works like the traditional delays, this means with a feedback loop, actually one per channel. Users can change all parameters with the visible controls, or they can vary them by using the three other inputs.&lt;br /&gt;When varying the beats pet minute (BPM) parameter, one can choose what the division is of the time between two beats. Only the grey buttons will keep the delayed signal synchronized with the original signal.&lt;br /&gt;&lt;h3&gt;   version &lt;/h3&gt; v1.0: built 28/03/2007 with Pd v0.40-2 &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/badmonotraditionaldelaybpm%7E%20v1.0.pd"&gt;[pd]&lt;/a&gt; &lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/badmonotraditionaldelaybpm%7E%20v1.0.pdf"&gt;[pdf]&lt;/a&gt;  &lt;h3&gt;   interface &lt;/h3&gt; Input 1: the mono signal you want to delay&lt;br /&gt;Input 2: the beats per minute parameter&lt;br /&gt;Input 3: the delay time parameter&lt;br /&gt;Input 4: the feedback parameter&lt;br /&gt;&lt;br /&gt;Output 1: the delayed, wet monosignal&lt;br /&gt;&lt;br /&gt;Controls:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;top number box and horizontal slider:&lt;/span&gt; adjust the beats per minute (BPM) parameter. It specifies the tempo that synchronizes the delayed signal. It ranges from 20bpm to 250bpm.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;middle number box and horizontal slider:&lt;/span&gt; adjust the delay time (DLY) parameter. It specifies how long it takes in milliseconds before you hear the following repetition. It ranges from 0msec tot 3000msec (3 seconds). This is not only the maximum value of the slider and number box, but also the length of the delay line used in the implementation. When these are adjusted, the DLY controls are adjusted accordingly.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;bottom number box and horizontal slider:&lt;/span&gt; adjust the feedback (FBK) level parameter. The signal is attenuated with this value divided by 1000. In other words, you can vary the level from 0 (no delay audible) to 0.999 (maximum amplitude of the delayed signals, keeps on repeating as if it never ends) with steps of thousands. When these are adjusted, the value of the BPM controls are not adjusted accordingly (read the implementation to see why).&lt;br /&gt;&lt;span style="font-style: italic;"&gt;switch button:&lt;/span&gt; is used to reset the feedback parameter to 0 and thus turning of the delayed signal. When a cross is visible, the effect is turned on. The previous value is remembered and displayed in the number box above the FBK slider as long as one doesn't touch the number box. When turning the effect back on, the slider and the number box jump to the last value remembered.&lt;br /&gt;16 measure buttons: choose the fraction of time between two beats. It resembles the measure of a musical piece, but it is not. It's more like a measure between two beats, as if between two beats a total measure takes places. The grey buttons will stay synchronized between two beats, but also the other ones can stay synchronized over different beats:&lt;br /&gt;&lt;h3&gt;   implementation &lt;/h3&gt; &lt;p&gt;   The implementation is the same as the &lt;span style="font-family:Courier New;"&gt;monotraditionaldelay~&lt;/span&gt; block. Only the new details will be described here. &lt;/p&gt; &lt;p&gt;   For smoothing the signal when parameters are changed, a &lt;span style="font-family:Courier New;"&gt;line&lt;/span&gt; block is implemented for the value.&lt;br /&gt;  Adjusting the BPM slider is the same as adjusting the delay time DLY parameter. The factor is: DLY = 60000*BPM^-1. This is then multiplied by a factor that expresses the measure as a fraction of time between two beats. The mechanism used for this is a message that is banged the moment you press the button on the display. This updates the factor (that has a default value of 1). To make sure it updates directly, a &lt;span style="font-family:Courier New;"&gt;bang&lt;/span&gt; block is inserted to the hot input of the multiplication block. Inside the message the measure fractions (DIV for division) are set rounded to 5 numbers after the comma. &lt;/p&gt; &lt;p&gt;   &lt;span style="color: rgb(255, 0, 0); font-style: italic;font-size:78%;" &gt;TO DO: It's possible to also implement an HF DAMP function which simulates a retro analog delay effect. It's nothing more than adding a lowpass filter with fairly high cutoff frequency (or even adjustable) in the delayline.&lt;/span&gt; &lt;/p&gt; &lt;p&gt;   &lt;em&gt;&lt;span style="font-size:78%;color:#ff0000;"&gt;TO DO: When adjusting DLY, the other one is not updated in the display. In the next version this is taken care of. For this update it would require an inverse recalculation. This consumes CPU time, so the effect of it must be researched first.&lt;/span&gt;&lt;/em&gt; &lt;/p&gt; &lt;p align="center"&gt;   &lt;img src="http://docs.google.com/File?id=df7z8b86_82fdxvq6" style="width: 743px; height: 537px;" title="fig 1: switch system" border="1" hspace="0" /&gt; &lt;/p&gt; &lt;p&gt;   &lt;span style="color:#000000;"&gt;The switch toggle switches the effect off by setting the feedback level FBK to 0. The value is remembered and restored when turning the effect back on. In the number display you still see the remembered value. How this system functions can be seen in &lt;em&gt;fig. 1: switch implementation &lt;/em&gt;above&lt;em&gt;.&lt;/em&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt;   &lt;em&gt;&lt;/em&gt;  &lt;/p&gt; &lt;h3&gt;   problems &lt;/h3&gt; &lt;p&gt;   &lt;span style="color:#33cc00;"&gt;There are some problems, although everything works.&lt;/span&gt; &lt;/p&gt; &lt;p&gt;   &lt;span style="color:#33cc00;"&gt;When the output of the bpm slider is connected with the input of the number box above it, an &lt;em&gt;error: stack overflow&lt;/em&gt; occurs and slows down the computation. Strange, because exactly the same thing is done with the delay_time controls. The same error shows up when it's adjusted although not connected to each other, but without really slowing things down. The latter happens also with the delay controls. It stops when the &lt;span style="font-family:Courier New;"&gt;r dly&lt;/span&gt; block above the controls are uncoupled, for both controls: DLY and BPM.&lt;/span&gt; &lt;/p&gt; &lt;p&gt;   &lt;span style="color:#33cc00;"&gt;When the feedback_level controls are adjusted an &lt;em&gt;error: inlet: no method for 'list'&lt;/em&gt; occurs if the switch is turned of and an &lt;em&gt;error: stack overflow&lt;/em&gt; occurs when the switch is turned on, without really slowing things down.&lt;/span&gt; &lt;/p&gt; &lt;p&gt;   &lt;span style="color:#33cc00;"&gt;To make it possible to adjust the DLY control displays when changing the BPM controls the &lt;span style="font-family:Courier New;"&gt;r dly&lt;/span&gt; block must stay attached to the delay_time number box. As a result these stack overflow errors keep appearing...&lt;/span&gt; &lt;/p&gt; &lt;p&gt;  &lt;br /&gt; &lt;br /&gt;&lt;/p&gt; &lt;div style="text-align: center;"&gt;   &lt;img src="http://docs.google.com/File?id=df7z8b86_84hfd3rm" style="width: 736px; height: 735px;" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-5195433373960985630?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/5195433373960985630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=5195433373960985630' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/5195433373960985630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/5195433373960985630'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/03/monotraditionaldelaybpm-bad-try.html' title='monotraditionaldelaybpm~ bad try'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-5541347830655995493</id><published>2007-03-28T17:09:00.000+02:00</published><updated>2007-04-13T10:56:40.480+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>stereotraditionaldelay~</title><content type='html'>&lt;img style="height: 134px; width: 226px;" src="http://docs.google.com/File?id=df7z8b86_68f52ts9" /&gt;&lt;br /&gt;&lt;h1&gt;stereotraditionaldelay~&lt;/h1&gt;This block delays an incoming signal and outputs the wet signal on two channels. The original signal is not throughput. It works like the traditional delays, this means with a feedback loop, actually one per channel. Users can change all parameters with the visible controls, or they can vary them by using the two other inputs, except for the phase reverse and switch-off. The difference with the mono delay, except for the stereo part, is the variable delay time per channel and the choice for in-phase or reversed-phase delayed signals.&lt;br /&gt;&lt;h3&gt;version&lt;/h3&gt;v1.0: built 28/03/2007 with Pd v0.40-2 &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/stereotraditionaldelay%7E%20v1.0.pd"&gt;[pd]&lt;/a&gt; &lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/stereotraditionaldelay%7E%20v1.0.pdf"&gt;[pdf]&lt;/a&gt; &lt;h3&gt;interface&lt;/h3&gt;Input 1: the mono signal you want to delay&lt;br /&gt;Input 2: the delay time parameter&lt;br /&gt;Input 3: the feedback parameter&lt;br /&gt;Inputs 4 and 5: the left and right channel delay time offset&lt;br /&gt;&lt;br /&gt;Output 1 and 2: the delayed, wet stereosignal&lt;br /&gt;&lt;br /&gt;Controls:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;top number box and horizontal slider:&lt;/span&gt; adjust the delay time (DLY) parameter. It specifies how long it takes in milliseconds before you hear the following repetition. It ranges from 0msec to 1500msec (1,5 seconds). This is not only the maximum value of the slider and number box, but also the length of the delay line used in the implementation.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;bottom number box and horizontal slider:&lt;/span&gt; adjust the feedback (FBK) level parameter. The signal is attenuated with this value divided by 1000. In other words, you can vary the level from 0 (no delay audible) to 0.999 (maximum amplitude of the delayed signals, keeps on repeating as if it never ends) with steps of thousands.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;switch-off button:&lt;/span&gt; is used to reset all the parameters to 0 and thus turning of the delayed signal.&lt;br /&gt;&lt;span style="font-style: italic;font-size:78%;" &gt;&lt;span style="color: rgb(255, 0, 0);"&gt;TO DO: It might be better to call the switch-off button a reset button, implying that after pressing it, the values will not be remembered.&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;phase-reverse buttons: toggle on and off to create slight difference due to cancelling out of parts of delayed signals.&lt;br /&gt;&lt;span style="font-style: italic;font-size:78%;" &gt;&lt;span style="color: rgb(255, 0, 0);"&gt;TO CHECK: It might be possible that this function doesn't work properly because the difference with both switches off is really negligent.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;L-offset and R-offset: adjust the delay time of each channel relative to the delay time DLY. It ranges from -200msec to 200msec.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;implementation&lt;/h3&gt;The basic delay is implemented the same way as the mono traditional delay, but with two copies then. Both loops have the same FBK parameter in common, that is calculated once.&lt;br /&gt;For smoothing the signal when parameters are changed, &lt;span style="font-family:Courier New;"&gt;line&lt;/span&gt; blocks are implemented for the &lt;span style="font-family:Courier New;"&gt;dlyLeft&lt;/span&gt;, &lt;span style="font-family:Courier New;"&gt;dlyRight&lt;/span&gt; and &lt;span style="font-family:Courier New;"&gt;fbk&lt;/span&gt; values. Also a one pole high pass filter is added at the outputs, with a very low cutoff frequency.&lt;br /&gt;The &lt;span style="font-family:Courier New;"&gt;dlyLeft&lt;/span&gt; and &lt;span style="font-family:Courier New;"&gt;dlyRight&lt;/span&gt; values are calculated by adding the delay time parameter DLY to respectively the L-offset and R-offset parameter. Both values are being input in the left slot of the &lt;span style="font-family:Courier New;"&gt;+&lt;/span&gt;, because that's the hot one: everytime a value at the left is changed, the block will execute an addition.&lt;br /&gt;Also here a &lt;span style="font-family:Courier New;"&gt;throw~&lt;/span&gt; and &lt;span style="font-family:Courier New;"&gt;catch~&lt;/span&gt; block are left behind. If you want to add the dry signal to the wet one inside the block, it's done by connecting the unconnected blocks to the nearby slots.&lt;br /&gt;The phase reverse logic works like this: when the button is toggled it transmits a 1 or a 0. The &lt;span style="font-family:Courier New;"&gt;moses&lt;/span&gt; block sends a 0 to the left output and a 1 to the right, because x&amp;lt;1 is sent to the left, etc. The following messages contain the factor by which the signal must be multiplied. -1 for a phase reverse (as easily seen when you draw a signal on an x-axis with a phase circle next to it). The multiplication that follows (and begins with a 1) is banged by the message and the factor thus changes inside the &lt;span style="font-family:Courier New;"&gt;*~&lt;/span&gt; block.&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(255, 0, 0);font-size:78%;" &gt; TO DO: It's possible to also implement an HF DAMP function which simulates a retro analog delay effect. It's nothing more than adding a lowpass filter with fairly high cutoff frequency (or even adjustable) in the delayline.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img style="height: 736px; width: 538px;" src="http://docs.google.com/File?id=df7z8b86_69dmn4sv" align="middle" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-5541347830655995493?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/5541347830655995493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=5541347830655995493' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/5541347830655995493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/5541347830655995493'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/03/stereotraditionaldelay-this-block.html' title='stereotraditionaldelay~'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-3319752424160221008</id><published>2007-03-28T16:25:00.000+02:00</published><updated>2007-04-13T10:56:40.480+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>monotraditionaldelay~</title><content type='html'>&lt;img style="width: 228px; height: 115px;" src="http://docs.google.com/File?id=df7z8b86_64gkp794" align="left" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;monotraditionaldelay~&lt;/h1&gt;This block delays an incoming signal and outputs the wet signal on one channel. The original signal is not throughput. It works like the traditional delays, this means with a feedback loop. Users can change the two parameters with the visible controls, or they can vary them by using the two other inputs.&lt;br /&gt;&lt;h3&gt;version&lt;/h3&gt; &lt;p&gt;v1.0: built 28/03/2007 with Pd v0.40-2 &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/monotraditionaldelay%7E%20v1.0.pd"&gt;[pd]&lt;/a&gt; &lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/monotraditionaldelay%7E%20v1.0.pdf"&gt;[pdf]&lt;/a&gt; &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;h3&gt;interface&lt;/h3&gt;Input 1: the mono signal you want to delay&lt;br /&gt;Input 2: the delay time parameter&lt;br /&gt;Input 3: the feedback parameter&lt;br /&gt;&lt;br /&gt;Output 1: the delayed, wet mono signal&lt;br /&gt;&lt;br /&gt;Controls:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;top number box and horizontal slider:&lt;/span&gt; adjust the delay time (DLY) parameter. It specifies how long it takes in milliseconds before you hear the following repetition. It ranges from 0msec tot 3000msec (3 seconds). This is not only the maximum value of the slider and number box, but also the length of the delay line used in the implementation.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;bottom number box and horizontal slider:&lt;/span&gt; adjust the feedback (FBK) level parameter. The signal is attenuated with this value divided by 1000. In other words, you can vary the level from 0 (no delay audible) to 0.999 (maximum amplitude of the delayed signals, keeps on repeating as if it never ends) with steps of thousands.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;switch-off button:&lt;/span&gt; is used to reset all the parameters to 0 and thus turning of the delayed signal.&lt;br /&gt;&lt;span style="font-style: italic;font-size:78%;" &gt;&lt;span style="color: rgb(255, 0, 0);"&gt;TO DO: It might be better to call the switch-off button a reset button, implying that after pressing it, the values will not be remembered.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;implementation&lt;/h3&gt;&lt;br /&gt;&lt;img style="width: 264px; height: 698px;" src="http://docs.google.com/File?id=df7z8b86_65cr5snj" align="left" /&gt;The delay itself is pretty simple: the incoming signal is read by a &lt;span style="font-family:Courier New;"&gt;delread~&lt;/span&gt; object that writes the signal into a delay line called &lt;span style="font-family:Courier New;"&gt;delay1&lt;/span&gt; and with length 3000msec. Although there's no visible loop, this is how the loop is formed: after a delay time DLY the associated &lt;span style="font-family:Courier New;"&gt;delread~&lt;/span&gt; object reads what's in the delay line, outputs it and sends it back into the &lt;span style="font-family:Courier New;"&gt;delwrite~&lt;/span&gt; object. Before outputting the delayed signals they are attenuated every time by a factor FBK ranging between 0 and 0.999 (with 1 clipping is to easy), in steps of thousands. That's why the control parameter lies between 0.001 and 999.&lt;br /&gt;A possibility is left in the implementation to also mix the wet output with the original, dry signal, by connecting the unconnected &lt;span style="font-family:Courier New;"&gt;throw~&lt;/span&gt; and &lt;span style="font-family:Courier New;"&gt;catch~&lt;/span&gt; objects.&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0); font-style: italic;font-size:78%;" &gt;TO DO: It's possible to also implement an HF DAMP function which simulates a retro analog delay effect. It's nothing more than adding a lowpass filter with fairly high cutoff frequency (or even adjustable) in the delayline.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-3319752424160221008?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/3319752424160221008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=3319752424160221008' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/3319752424160221008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/3319752424160221008'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/03/monotraditionaldelay-this-block-delays.html' title='monotraditionaldelay~'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-1832739147387239703</id><published>2007-03-27T22:30:00.000+02:00</published><updated>2007-03-27T22:45:05.304+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='links'/><title type='text'>beat detection in PureData</title><content type='html'>A block exists that tracks beats. I didn't yet read the details, but it's standard in Pd and is called bonk~. &lt;a href="http://www.obiwannabe.co.uk/"&gt;Obiwannabe &lt;/a&gt;wrote an article on it &lt;a href="http://www.obiwannabe.co.uk/html/music/bonker/bonker.html"&gt;here&lt;/a&gt;.  He also wrote other interesting stuff about music synthesis and all using Pd.&lt;br /&gt;I also found a library that collects a bunch of feature extraction scripts written in C.  I want to download it, but I don't know how I should compile it or at least make it work anyway. It's named &lt;a href="http://aubio.piem.org/"&gt;aubio&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-1832739147387239703?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/1832739147387239703/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=1832739147387239703' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1832739147387239703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1832739147387239703'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/03/beat-detection-in-puredata.html' title='beat detection in PureData'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-7396726087354393237</id><published>2007-03-27T21:47:00.000+02:00</published><updated>2007-03-27T22:03:07.782+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='esat'/><category scheme='http://www.blogger.com/atom/ns#' term='update'/><title type='text'>weekly update</title><content type='html'>This week we both read through the tutorials of PureData as indicated last week.  Also the book of Puckette M. is not virgin anymore.&lt;br /&gt;For the next week we'll implement some concrete effects. Concrete means that they really work with a given input, from input to output. If there's time we might also try an extraction algorithm already. But we have to keep it simple so as to achieve something concretely this week.&lt;br /&gt;Things we talked about during our meeting:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I tried already measuring the latency by just connecting the input of my external soundcard (EDIROL FA101) with the output through PureData. With a sample rate of 44,1kHz and quantizing at 24bit I reach a minimal latency of 37msec, these is too audible and 1msec less results in a big mess. This is not the case when using other profeesional audio software on my computer (adobe audition 2.0, Live 6.0.1) I didn't really search further, I ony tried it out once and it works at least. I know there exists a latency test patch for Pd on the internet. I'll search it the next time I do real input tests.&lt;/li&gt;&lt;li&gt;Anyway, Sam says that an audible latency is OK as long as we have a realtime working effect. The latency of the program would be rather normal because of the complexity of the code.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-7396726087354393237?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/7396726087354393237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=7396726087354393237' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/7396726087354393237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/7396726087354393237'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/03/weekly-update.html' title='weekly update'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-5257291221746563232</id><published>2007-03-27T21:32:00.000+02:00</published><updated>2007-04-13T15:08:51.533+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>monopanner~</title><content type='html'>  &lt;h1&gt;&lt;img style="width: 228px; height: 124px;" src="http://docs.google.com/File?id=df7z8b86_868ckwrd"&gt; &lt;br&gt;&lt;/h1&gt; &lt;h1&gt;monopanner~&lt;/h1&gt;&lt;h3&gt;&lt;span style="color: rgb(153, 51, 153);"&gt;discontinued&lt;/span&gt;&lt;br&gt;&lt;/h3&gt;This block places a mono signal in a stereo panorama. You can choose the panning curve that is applied. An input is also provided to vary the pan parameter externally.&lt;br&gt;This block is discontinued but it's implementation is used in the series of &lt;span style="font-family: Courier New;"&gt;channel &lt;/span&gt;blocks.&lt;br&gt;&lt;br&gt; &lt;h3&gt;version&lt;/h3&gt; &lt;p&gt;&lt;a title="goginLeft.txt" href="http://ronny.ulyssis.be/PureData/Archive/goginLeft.txt"&gt;goginLeft.txt&lt;/a&gt; - &lt;a title="goginRight.txt" href="http://ronny.ulyssis.be/PureData/Archive/goginRight.txt"&gt;goginRight.txt&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;a title="linearLeft.txt" href="http://ronny.ulyssis.be/PureData/Archive/linearLeft.txt"&gt;linearLeft.txt&lt;/a&gt; - &lt;a title="linearRight.txt" href="http://ronny.ulyssis.be/PureData/Archive/linearRight.txt"&gt;linearRight.txt&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;a title="rootLeft.txt" href="http://ronny.ulyssis.be/PureData/Archive/rootLeft.txt"&gt;rootLeft.txt&lt;/a&gt; - &lt;a title="rootRight.txt" href="http://ronny.ulyssis.be/PureData/Archive/rootRight.txt"&gt;rootRight.txt&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;a title="sineLeft.txt" href="http://ronny.ulyssis.be/PureData/Archive/sineLeft.txt"&gt;sineLeft.txt&lt;/a&gt; - &lt;a title="sineRight.txt" href="http://ronny.ulyssis.be/PureData/Archive/sineRight.txt"&gt;sineRight.txt&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;a title="pancurves.m" href="http://ronny.ulyssis.be/PureData/Archive/pancurves.m"&gt;pancurves.m&lt;/a&gt; &lt;/p&gt;&lt;p&gt;v1.0: built 27/03/2007 with Pd v0.40-2 &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/monopanner%7E%20v1.0.pd"&gt;[pd]&lt;/a&gt; &lt;br&gt;v1.1: adjustment 28/03/2007 with Pd v0.40-2&lt;br&gt;    the output of the horizontal slider is now connected to the number box above it. This way the value in the number box is updated also when you slide the slider.&lt;br&gt;v2.0: built 29/03/2007 with Pd v0.40-2 &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/monopanner%7E%20v2.0.pd"&gt;[pd]&lt;/a&gt;&lt;br&gt;    extra input for reset&lt;br&gt;    PAN parameter input rescaled for MIDI data: 0-127&lt;br&gt;    separate controls and displays for PAN parameter&lt;br&gt;    rescaling calculated once instead of twice&lt;/p&gt; &lt;p&gt;v2.1: adjustment 1/04/2007 with Pd v0.40-2 &lt;a title="[pd]" href="http://ronny.ulyssis.be/PureData/Archive/monopanner%7E%20v2.1.pd"&gt;[pd]&lt;/a&gt;&lt;a title="[pdf]" href="http://ronny.ulyssis.be/PureData/Archive/monopanner%7E%20v2.1.pdf"&gt;[pdf]&lt;/a&gt;&lt;/p&gt; &lt;p&gt;    Other connections made it able to leave some away, for the initialisation logic&lt;/p&gt; &lt;p&gt;    The reset knob only resets the PAN to the center. The table is left untouched.&lt;/p&gt; &lt;p&gt;    Initialisation sets the table too, to the root function, because it's a more normal pan control curve than the gogin curve that was the default before.&lt;br&gt;&lt;br&gt;&lt;/p&gt; &lt;h3&gt;interface&lt;br&gt;&lt;/h3&gt;&lt;br&gt;Input 1: the mono signal you want to pan&lt;br&gt;Input 2: the pan parameter, that is also included in the front of the block. It's range goes from 0 to 127 in steps of 1, where 0 stands for LEFT and 127 stands for RIGHT. This results in a PAN parameter that changes with a step size of 2, zero is not reachable with this input.&lt;br&gt;&lt;font style="color: rgb(255, 0, 0);" size="1"&gt;&lt;span style="font-style: italic;"&gt;TO DO: re-size the tables, so that the step size of the input as well as the slider is equal.&lt;/span&gt;&lt;/font&gt;&lt;br&gt;Input 3: reset the PAN parameter to CENTER. That is the value read on sample 128 of the curves&lt;br&gt;&lt;br&gt;Output 1 &amp;amp; 2: the stereo output signal.&lt;br&gt;&lt;br&gt;Controls:&lt;br&gt;number box and small slider PAN: This displays the current value of the PAN parameter on a scale of -127 for LEFT to 127 for RIGHT with 0 as CENTER (when controlling from the second inlet, the value 0 is not reachable. One can do it with the reset button. This display is included to view the changes while the effect is controlled externally, as you see on the top figure: the current PAN value is 127, apparently controlled from the outside, because the controls themselves are still centered.&lt;br&gt;&lt;span style="font-style: italic;"&gt;reset:&lt;/span&gt; resets the pan parameter to 0 or CENTER&lt;br&gt;&lt;span style="font-style: italic;"&gt;number box and horizontal slider:&lt;/span&gt; adjust the pan parameter&lt;br&gt;&lt;span style="font-style: italic;"&gt;gogin, linear, root and sine:&lt;/span&gt; choose a panning curve. root is the default value after loading the patch.&lt;br&gt;&lt;img style="width: 560px; height: 420px;" src="http://docs.google.com/File?id=df7z8b86_72frf7zv"&gt;&lt;img style="width: 560px; height: 420px;" src="http://docs.google.com/File?id=df7z8b86_77mv6mtj"&gt;&lt;img style="width: 560px; height: 420px;" src="http://docs.google.com/File?id=df7z8b86_78cjkz73"&gt;&lt;img style="width: 560px; height: 420px;" src="http://docs.google.com/File?id=df7z8b86_79fn8n7q"&gt;&lt;br&gt;&lt;br&gt; &lt;h3&gt;implementation&lt;/h3&gt; &lt;p&gt;&lt;br&gt;For the pan control curves a table is used. Per curve type there are two tables: one for the left and one for the right channel. The vectors are calculated in matlab with the following  m-file:&lt;br&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;xMin = -128;&lt;br&gt;xMax = 127;&lt;br&gt;x = [0:1/(xMax-xMin):1];&lt;br&gt;&lt;br&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;% gogin&lt;/span&gt;&lt;br&gt;arg = x*pi-pi/2;&lt;br&gt;goginLeft = sqrt(2)/2*(cos(arg)-sin(arg));&lt;br&gt;goginRight = sqrt(2)/2*(cos(arg)+sin(arg));&lt;br&gt;figure;plot(goginLeft,'b');hold on;plot(goginRight,'r');&lt;br&gt;&lt;br&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;% square root&lt;/span&gt;&lt;br&gt;rootLeft = sqrt(1-x);&lt;br&gt;rootRight = sqrt(x);&lt;br&gt;figure;plot(rootLeft,'b');hold on;plot(rootRight,'r');&lt;br&gt;&lt;br&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;% sine&lt;/span&gt;&lt;br&gt;sineLeft = cos(x*pi/2);&lt;br&gt;sineRight = sin(x*pi/2);&lt;br&gt;figure;plot(sineLeft,'b');hold on;plot(sineRight,'r');&lt;br&gt;&lt;br&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;% linear&lt;/span&gt;&lt;br&gt;linearLeft = 1-x;&lt;br&gt;linearRight = x;&lt;br&gt;figure;plot(linearLeft,'b');hold on;plot(linearRight,'r');&lt;br&gt;&lt;br&gt;&lt;span style="font-family: Verdana;"&gt;As you might have already remarked a choice is made here about how many values the control curve has.  This can be changed afterwards in this m-file.  xMin en xMax are defined here the same way as they are defined in the block itself: ranging from -128 to 127. A larger range would result in a smoother transition when panning, but with these values there's already no audible step.&lt;br&gt;The plotted figures can be seen in the section &lt;span style="font-style: italic;"&gt;interface&lt;/span&gt;.&lt;br&gt;After calculating the values, this vector is copy pasted into a .txt-file.  This space separated list is directly readable by PureData through the command &lt;span style="font-family: Courier New;"&gt;read&lt;/span&gt; placed inside a message box.  The values are thus read and written away in an array called left Channel and right Channel.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Verdana;"&gt; &lt;p&gt;&lt;br&gt;The inlet accepts values between 0 and 127, the controls range from -127 to +127 and the control curves are written in tables with a width that ranges from 0 to 256. So the range of the inlet must be multiplied with two and a one has to be added. The controls just have to be shifted over 128 samples. Then the &lt;font face="Courier New"&gt;tabread&lt;/font&gt; block looks up the corresponding value, depending on the chosen control function. This value is used to attenuate the incoming audio signal.&lt;/p&gt; &lt;p&gt;The center values per type are:&lt;br&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt; &lt;ul&gt; &lt;li&gt;gogin: L=0.693; R=0.720  &lt;/li&gt;&lt;li&gt;linear: L=0.494; R=0.505 (-1 is a better center)  &lt;/li&gt;&lt;li&gt;root: L=0.702; R=0.711 (-1 is a better center)  &lt;/li&gt;&lt;li&gt;sine: L=0.700; R=0.713 (-1 is a better center)&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;The table that draws the array as a graph in the patch itself as an y-index that ranges from -1 to 1. The negative values are necessary for representing all the values of the gogin function.&lt;br&gt;&lt;font style="color: rgb(255, 0, 0); font-style: italic;" size="1"&gt;TO DO: maybe I can change the range of the control curves to an odd number of indices, so as to provide a real centered center, with equal loudness for both the left and right channel.&lt;/font&gt;&lt;br&gt; &lt;div style="text-align: center;"&gt;&lt;img style="width: 763px; height: 728px;" src="http://docs.google.com/File?id=df7z8b86_87qb5k3d"&gt;&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-5257291221746563232?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/5257291221746563232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=5257291221746563232' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/5257291221746563232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/5257291221746563232'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/03/monopanner-this-block-places-mono.html' title='monopanner~'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-4208441179594056254</id><published>2007-03-27T19:12:00.000+02:00</published><updated>2007-04-13T10:56:40.481+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>PureData remarks</title><content type='html'>&lt;ul&gt;&lt;li&gt;Apparently Pd organizes the inlets and outlets of a subpatch according to their horizontal position. So no matter if they're placed at the top or at the bottom of the subpatch, you will find the leftmost inlet also as the left inlet of the blok in the parent patch.&lt;/li&gt;&lt;li&gt;The delete knob of the computer does NOT work...&lt;/li&gt;&lt;li&gt;I had problems moving a canvas around in a subpatch, but apparently this is done with the canvas properties box (right-click on an empty spot in the window). The margins stand for the distance form the left and top margins of the window.&lt;/li&gt;&lt;li&gt;Also the placement of the title of a box (knobs, etc.) is moveable by adjusting their x_off and y_off parameters.&lt;/li&gt;&lt;li&gt;Also something strange happens when I insert my monopanner~ block in the main file (just an input and an output). The array drawn in the subpatch appear at the far bottom of my parent patch main.pd... &lt;span style="color: rgb(51, 204, 0);"&gt;Any idea why?&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;And now for the monopanner~ object I implemented today. You can find the documentation in the folder monopanner~ or in the post with the same name. The latest document I keep as a google document on my google account.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-4208441179594056254?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/4208441179594056254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=4208441179594056254' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/4208441179594056254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/4208441179594056254'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/03/monopanner-in-puredata.html' title='PureData remarks'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-1858955468419387975</id><published>2007-03-23T13:18:00.001+01:00</published><updated>2007-03-23T13:18:35.441+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='update'/><category scheme='http://www.blogger.com/atom/ns#' term='links'/><title type='text'>weekly update and information resources to PureData</title><content type='html'>Short update today. I showed some basic features of PureData I discovered last two days. Conclusion: try to work with PureData as fast as possible (as in next week).&lt;br /&gt;That's what we are going to do. Firstly by running through all the tutorial patches.&lt;br /&gt;I also discouvered the accompanying book (which might turn into a reference work) written by the author of PureData. It gives mathematical background to all the exercices and more: &lt;a style="font-style: italic;" href="http://www.crca.ucsd.edu/%7Emsp/techniques/latest/book.pdf"&gt;The techniques and theory of electronic music&lt;/a&gt;. I printed the book and now I'm looking in it and reading interesting parts.&lt;br /&gt;Another essential work, but I'm putting it here more for private reasons than for this thesis is the book of Benson: &lt;a style="font-style: italic;" href="http://www.maths.abdn.ac.uk/%7Ebensondj/html/music.pdf"&gt;Music, a mathematical offering&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-1858955468419387975?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/1858955468419387975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=1858955468419387975' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1858955468419387975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1858955468419387975'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/03/weekly-update-and-information-resources.html' title='weekly update and information resources to PureData'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-7222971950784021710</id><published>2007-03-20T19:17:00.000+01:00</published><updated>2007-03-20T20:24:04.252+01:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;PureData session on beat controlled delay (pt1)&lt;/h2&gt;&lt;br /&gt;Today I start already a practical example as an extra means to try to learn PureData. I'm still very pleased by the program. I can run it from my cheap memorystick and it's so small I can even save all the soundfiles and pd files with it.&lt;br /&gt;So I began with an abstraction for the output like the one given in the tutorial (only changing the control to a slider).&lt;br /&gt;Then I added the delay loop. It has the control parameters DELAY TIME (DLY) and FEEDBACK LEVEL (FBK) which are now controlled by a slider. This slider can receive a number as input, so we can attach the result of the extraction algorithm or mapping to the slider itself without having to change anything else.&lt;br /&gt;I now want to implement a multitap delay (where you can specify the number of delayed samples you hear) but using the delay with feedback loop (not with the easier but totally other way).&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;First I tried to calculate when the level of the nth delayed signal would be smaller than the fraction of the n-1th version. But after a while I realized that the only easy way to do this was by stopping the input of the delay loop after n * DLY.&lt;br /&gt;But also this doesn't work because if you stop input for the loop, also the ongoing delays are not written anymore and only one delay tap rests.&lt;br /&gt;Therefore I tried starting from a multitapdelay to join the two types of delay. But I don't find a way to implement it without having a number of delay reads equal to the max number you want to have. So &lt;span style="color: rgb(51, 204, 0);"&gt;I don't find a way to do it in a loop.&lt;/span&gt;..&lt;br /&gt;&lt;/div&gt;Then I also want to try to attenuate every feedback copy while it's playing, because now it is played with a constant attenuated level. This can be done sith an envelope maker in the loop or the same effect might be reached by giving an envelope to the overall delayed signal. wow I'm going too fast. This is a feature that migh be useful when using really long delays, otherwise it's really not needed. But in this case it might give some very surprising and creative results (eg by not attenuating but making the feedbacked signal louder as it is played). It would require a lot of control signalling at first sight, so I put it on a long trail. &lt;span style="color: rgb(51, 204, 0);"&gt;Maybe one evening, who knows&lt;/span&gt;...&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;When I draw it on a paper, it seems that it is equivalent to, or that the only possible thing is to apply a control curve to the feedback level parameter. &lt;span style="color: rgb(51, 204, 0);"&gt;Let's try that sometime&lt;/span&gt;!&lt;br /&gt;&lt;/div&gt;I also implemented a panorama block with which you can choose different connections between the left and right channels. One problem I encounter here is that when I try to mix both signals in both outputs, it doesn't give the expected result. &lt;span style="color: rgb(51, 204, 0);"&gt;Any ideas why?&lt;/span&gt; See the image.&lt;br /&gt;&lt;img style="height: 397px; width: 763px;" src="http://docs.google.com/File?id=df7z8b86_56cqnpck" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-7222971950784021710?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/7222971950784021710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=7222971950784021710' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/7222971950784021710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/7222971950784021710'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/03/puredata-session-on-beat-controlled.html' title=''/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-7891129678955530940</id><published>2007-03-19T10:45:00.000+01:00</published><updated>2007-04-13T10:56:40.481+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pd documentation'/><title type='text'>Installing and learning PureData</title><content type='html'>For future reference:&lt;br /&gt;Installing PureData in Windows XP is as simple as downloading a zipfile and saving the extracted files somewhere in a folder where you like. You find the program itself in the subfolder /bin/pd.exe .&lt;br /&gt; From there you can run it, or you can create a shortcut to somewhere else.&lt;br /&gt;I also checked if we could indeed add our own blocks in C and that's OK, it's even possible in C++ or FORTRAN (whatever).&lt;br /&gt;Now I'm running over a bunch of examples to learn working with the platform.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;a question that rises now is that for example a delay (even very pratical and complex ones) can be made in PureData without 'descending' to level of matlab language. Everything can be done at the higher level, they even got analysis blocks (but their complexity and functionality I must first research), so why bother with the matlab level?&lt;br /&gt;This is a question for tomorrows weekly meeting.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-7891129678955530940?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/7891129678955530940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=7891129678955530940' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/7891129678955530940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/7891129678955530940'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/03/installing-and-learning-puredata.html' title='Installing and learning PureData'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-1884407317600337211</id><published>2007-03-15T17:18:00.000+01:00</published><updated>2007-03-15T17:21:58.137+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='esat'/><category scheme='http://www.blogger.com/atom/ns#' term='matlab'/><title type='text'>matlab session on the signal routing for testing my delay and other effects</title><content type='html'>I worked on the file effectSystem.m and all it needs still is the output part: playing and plotting the results of the effect. And also the part where the different frames are glued together again to form a soundfile and the mixer part.&lt;br /&gt;After that I can start implementing and testing effect files I already have, or new ones.&lt;br /&gt;I did not yet pay attention in effectSystem.m to the feature extraction part.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-1884407317600337211?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/1884407317600337211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=1884407317600337211' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1884407317600337211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1884407317600337211'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/03/matlab-session-on-signal-routing-for.html' title='matlab session on the signal routing for testing my delay and other effects'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-1858289433683465246</id><published>2007-03-15T15:43:00.000+01:00</published><updated>2007-03-15T15:45:36.887+01:00</updated><title type='text'>EFFECTS</title><content type='html'>heb nog paar linkjes gevonden met implementaties voor effecten&lt;br /&gt;moesten we er toch nog willen bijnemen:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;REVERB&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://cnx.org/content/m14222/latest/"&gt;http://cnx.org/content/m14222/latest/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;DISTORTION&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://cnx.org/content/m14221/latest/"&gt;http://cnx.org/content/m14221/latest/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.cs.stir.ac.uk/%7Elss/lsspapers.html"&gt;&lt;br /&gt;http://www.cs.stir.ac.uk/~lss/lsspapers.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.cs.stir.ac.uk/%7Elss/recentpapers/IEEETransNNSept2004.pdf"&gt;http://www.cs.stir.ac.uk/~lss/recentpapers/IEEETransNNSept2004.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;using pitch detection&lt;br /&gt;&lt;a href="http://ismir2005.ismir.net/proceedings/1008.pdf"&gt;http://ismir2005.ismir.net/proceedings/1008.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;information:&lt;br /&gt;&lt;a href="http://www.cs.uvic.ca/%7Egtzan/work/publications.html"&gt;http://www.cs.uvic.ca/~gtzan/work/publications.html&lt;/a&gt;&lt;span style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://www.cs.uvic.ca/%7Egtzan/work/publications.html"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-1858289433683465246?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/1858289433683465246/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=1858289433683465246' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1858289433683465246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1858289433683465246'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/03/effects.html' title='EFFECTS'/><author><name>tony</name><uri>http://www.blogger.com/profile/05311149308629939532</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-1044629098007277853</id><published>2007-03-15T15:37:00.000+01:00</published><updated>2007-03-15T15:42:44.850+01:00</updated><title type='text'>Onset detection</title><content type='html'>veel links, veel lectuur, veel informatie beetje verwarrend...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.music-ir.org/evaluation/mirex-results/articles/all/short/west.pdf"&gt;http://www.music-ir.org/evaluation/mirex-results/articles/all/short/west.pdf&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.music-ir.org/evaluation/mirex-results/articles/onset/collins.pdf"&gt;http://www.music-ir.org/evaluation/mirex-results/articles/onset/collins.pdf&lt;/a&gt;&lt;br /&gt;&lt;a href="http://ieeexplore.ieee.org/iel5/10376/33958/01621213.pdf?tp=&amp;isnumber=33958&amp;amp;amp;arnumber=1621213"&gt;http://www.speech.kth.se/prod/publications/files/875.pdf&lt;/a&gt;&lt;br /&gt;&lt;a href="http://ieeexplore.ieee.org/iel5/10376/33958/01621213.pdf?tp=&amp;isnumber=33958&amp;amp;arnumber=1621213"&gt;http://ieeexplore.ieee.org/iel5/10376/33958/01621213.pdf?tp=&amp;isnumber=33958&amp;amp;arnumber=1621213&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Er bestaat zelfs zoiets als de &lt;span style="color: rgb(255, 0, 0);"&gt;onset detection Contest &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Hadden we dit geweten....&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.lam.jussieu.fr/src/Membres/Leveau/SOL/SOL.htm"&gt;http://www.lam.jussieu.fr/src/Membres/Leveau/SOL/SOL.htm&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.lam.jussieu.fr/src/Membres/Leveau/ressources/Leveau_ISMIR04.pdf"&gt;http://www.lam.jussieu.fr/src/Membres/Leveau/ressources/Leveau_ISMIR04.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;nog iet gevonden over &lt;span style="color: rgb(204, 51, 204);"&gt;Piano note detection&lt;/span&gt;&lt;br /&gt;te vinden op &lt;a href="http://cnx.org/content/m14196/latest/"&gt;http://cnx.org/content/m14196/latest/&lt;/a&gt;&lt;br /&gt;dit zijn een aantal m-files, waarvan de onset detection&lt;br /&gt;eigenlijk vrij goed algemeen werkt... momemteel&lt;br /&gt;gaan we hiervan uit, indien achteraf blijkt dat dit niet voldoende is,&lt;br /&gt;zullen we toch teurg op die papers moeten hervallen...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-1044629098007277853?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/1044629098007277853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=1044629098007277853' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1044629098007277853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1044629098007277853'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/03/onset-detection.html' title='Onset detection'/><author><name>tony</name><uri>http://www.blogger.com/profile/05311149308629939532</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-5390578564205274597</id><published>2007-03-15T15:09:00.000+01:00</published><updated>2007-03-15T16:12:34.665+01:00</updated><title type='text'>beat detection: the sequel</title><content type='html'>Als vervolg op vorige topics over beat detection/extraction, zie hier:&lt;br /&gt;&lt;a href="http://idafx.blogspot.com/2007/02/some-links-for-beat-extraction.html"&gt;http://idafx.blogspot.com/2007/02/some-links-for-beat-extraction.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://idafx.blogspot.com/2007/02/vandaag-beat-detection-algorithm-enkele.html"&gt;http://idafx.blogspot.com/2007/02/vandaag-beat-detection-algorithm-enkele.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Na overleg met Toon besloten da de subbandinformatie moet gewogen worden.&lt;br /&gt;Bij het herbekijken van de code beseft dat ik de subbandverdeling met parameter&lt;br /&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;Bandlimits &lt;span style="color: rgb(0, 0, 0);"&gt;had aangepast aan de sample frequentie wat feitelijk niet de bedoeling was,&lt;br /&gt;omdat daardoor de hogeren frequentiebanden een hoger gewicht krijgen. Het is de&lt;br /&gt;bedoeling om de lage frequentiebanden het meest te laten doorwegen.&lt;br /&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;Bandlimits&lt;/span&gt; = &lt;span style="color: rgb(0, 0, 0);"&gt;[200 400 800 1600 3200 samplefreq] zoals in de oorspronkelijk code&lt;br /&gt;stond dus.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;test results ---&gt; geprobeerd met die wegingsfactoren&lt;br /&gt;                   ---&gt; wegingsfactoren ??---&gt; bandbreedte subbanden aanpassen&lt;br /&gt;                   ---&gt; oorspronkelijke hersteld --&gt; juiste results voor loopkes&lt;br /&gt;&lt;br /&gt;AC_100A_kit1.wav ---&gt; 100&lt;br /&gt;AC_75_kit2.wav         76  acc,bpm:&lt;br /&gt;AC_90_kit1.wav         90&lt;br /&gt;BB_135_Lp10.wav       135&lt;br /&gt;BB_95_K03_Lp03.wav     95&lt;br /&gt;FHP_130_DRMLP_26.wav  130&lt;br /&gt;FHP_130_DRMLP_48.wav  130&lt;br /&gt;Jw_65_kit2.wav         65&lt;br /&gt;Jw_70_full1.wav        70&lt;br /&gt;Jw_80_full2.wav        80&lt;br /&gt;Jw_95_perc3.wav        95&lt;br /&gt;&lt;br /&gt;Sh_120 Rhodes Loop 7C.wav  120&lt;br /&gt;Sh_120 Synth  Loop 3C.wav  acc,bpm 1,118 .5,120.5 .3 119.6 .2,119.6 .1,119.6&lt;br /&gt;Sh_125 C Live Bass 2.wav   125&lt;br /&gt;Sh_128 Drum Loop 1.wav     128&lt;br /&gt;&lt;br /&gt;Toms_diner.wav             86, kan ook kloppen want heb ongeveer schatting gedaan op basis aantal tellen in die 4 seconden ---&gt; 8/9 tellen&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;Conclusie: &lt;span style="color: rgb(0, 0, 0);"&gt;juiste resultaten, algoritme detecteert ook wanneer er geen beat aanwezig is&lt;br /&gt;het gaat hier dus om RITME extractie.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Op zoek naar niet iteratieve methodes !!?&lt;br /&gt;interessante links:&lt;br /&gt;--&gt;selfsimilarity matrix: &lt;a href="http://www.fxpal.com/?p=similaritymatrixFAQ"&gt;http://www.fxpal.com/?p=similaritymatrixFAQ&lt;/a&gt;&lt;br /&gt;--&gt;&lt;a href="http://www.cs.cmu.edu/%7Elebanon/IR-lab.htm"&gt;http://www.cs.cmu.edu/~lebanon/IR-lab.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;heel interessante site !!&lt;br /&gt;&lt;a href="http://mue.music.miami.edu/thesis/KurtJacobson/KJacobson_msmue_final.pdf"&gt;http://mue.music.miami.edu/thesis/KurtJacobson/KJacobson_msmue_final.pdf&lt;/a&gt;&lt;br /&gt;Hier staat op het einde van de pdf een heel uitgebreide matlab code voor het berekenen&lt;br /&gt;van allerlei features... mss moeten we daar eens in gaan snuffelen...&lt;br /&gt;&lt;br /&gt;Nog nen site met allerlei tools uitgewerkt in matlab code:&lt;br /&gt;&lt;a href="http://labrosa.ee.columbia.edu/matlab/"&gt;http://labrosa.ee.columbia.edu/matlab/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-5390578564205274597?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/5390578564205274597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=5390578564205274597' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/5390578564205274597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/5390578564205274597'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/03/beat-detection-sequel.html' title='beat detection: the sequel'/><author><name>tony</name><uri>http://www.blogger.com/profile/05311149308629939532</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-7790739539221027124</id><published>2007-03-13T18:49:00.000+01:00</published><updated>2007-03-13T18:57:58.546+01:00</updated><title type='text'></title><content type='html'> &lt;h2&gt;Brainstorm session on our goal&lt;/h2&gt;&lt;br&gt;After the presentation of last friday we decided to choose a few effects and a few features and to implement these in real-time. The idea is to write working code with matlab at first and we can use simulink for the inputs/outputs and signal routing. Then we'll translate it to c code, using PureData probably for the routing part.&lt;br&gt;For feature extraction  we would surely like to try onset detection and the other two we already worked on (rhythm/beat and pitch extraction). &lt;br&gt;As for the effects: delay and vibrato for sure, and then maybe a wah effect, panning, (,...)&lt;br&gt;The basic ideas we want to try with these effects and features are:&lt;br&gt;&lt;ul&gt;&lt;li&gt;the delay time parameter of the delay effect controlled by the tempo of the song (auto-adaptive as well as adaptive (master channel or drums channel, with a mic or with insert cables))&lt;/li&gt;&lt;li&gt;the rate and depth of the vibrato will be faster with high pitched notes and/or loudness&lt;/li&gt;&lt;li&gt;the wah effect and the panner can be controlled with onset and beat detection, but this already works this way&lt;/li&gt;&lt;li&gt;when a singer sings a high and loud note, the delay effect can be more distinct and with a nice long delay (to make it stronger. this is the same as the sound engineers do by hand now)&lt;/li&gt;&lt;li&gt;...&lt;/li&gt;&lt;/ul&gt;There might be added some other idea later on, but this are the starting blocks.&lt;br&gt;So the beat extraction will extract the tempo of the music andwe will use this to sync the other effects. This is one example of cross reference for our list of effects and features.&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-7790739539221027124?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/7790739539221027124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=7790739539221027124' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/7790739539221027124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/7790739539221027124'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/03/brainstorm-session-on-our-goal-after.html' title=''/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-7843437275556560568</id><published>2007-03-06T18:43:00.000+01:00</published><updated>2007-03-07T15:03:19.188+01:00</updated><title type='text'></title><content type='html'> &lt;h2&gt;   delay in simulink with adjustable parameters and weekly update&lt;br&gt; &lt;/h2&gt; &lt;br&gt; Problems:&lt;br&gt; &lt;ul&gt;   &lt;li&gt;     How do I make in simulink a vector with N zeros and thereafter a one, while     the N is supplied by an input? I didn't find blocks for creating matrices,     so I wanted to do it with a matlab code snippet. But this gave a lot of     strange problems. delayVector = [zeros(N,1);1]; This was my function, but     the debugger said that this N gives problems and that the matrix must be     constant or non-empty. Has it got something to do with iterations? I don't     know what to do with this, so temporally I will use a fixed matrix.&lt;br&gt;     &lt;blockquote&gt;Non-constant expression or empty matrix.&lt;br&gt;     This expression must be constant because its value determines the size or     class of some expression.&lt;br&gt;     &lt;/blockquote&gt;This is still a problem after applying toons proposal (see comment). The identity matrix seems not to output a matrix. Here you see the error code simulink gives us:&lt;br&gt;&lt;blockquote&gt;Element 1 of port 2 in 'effectSystem/Delay1/Selector' has a value of 257. This value is not within the range of permissible values (1 through 1) that allows selection of a valid input data element.&lt;br&gt;&lt;/blockquote&gt;&lt;img style="height: 143px; width: 519px;" src="http://docs.google.com/File?id=df7z8b86_52cmgjpb"&gt;&lt;br&gt;I tried narrowing down all possible causes so far that I ended with another little document:&lt;br&gt;&lt;img style="height: 74px; width: 227px;" src="http://docs.google.com/File?id=df7z8b86_51fmqxts"&gt;And even this won't work. So I ain't got no clue for what's happening.&lt;br&gt; &lt;/li&gt; &lt;/ul&gt; &lt;ul&gt;   &lt;li&gt;     Now I got another problem with our FIR filter: there would be a singularity     problem.&lt;br&gt;     &lt;blockquote&gt;Trouble solving algebraic loop containing     'delaySubSystem/Subsystem/     -N z' at time 0.      Stopping simulation.  There may be a singularity in the solution.      If the model is correct, try reducing the step size (either by reducing the     fixed step size or by tightening the error tolerances)&lt;br&gt;     &lt;/blockquote&gt;I don't understand what they mean, and even so I can't find a     way to adjust the step size like they suggest.&lt;br&gt;     &lt;br&gt; &lt;/li&gt; &lt;/ul&gt; &lt;img src="http://docs.google.com/File?id=df7z8b86_50g588th" style="height: 1043px; width: 997px;"&gt;&lt;br&gt; &lt;br&gt; &lt;font style="font-weight: bold; color: rgb(153, 153, 153);" size="3"&gt;weekly update&lt;/font&gt;&lt;br&gt; &lt;br&gt; First we talked about the things we did and didn't understand during the last days.&lt;br&gt; And of course our discovery of extensive literature on the topic and what would be our place now. Is it changed or not?&lt;br&gt; For the presentation on friday:&lt;br&gt; Tell something general, about the effects, about the feature extractions, about the proposed mapping method of Verfaille. And ending with our future vision.&lt;br&gt; As we think now there are two ways to continue from here:&lt;br&gt; &lt;ol&gt;   &lt;li&gt;     Or we try the general framework idea and after that we try all sorts of     combinations   &lt;/li&gt;   &lt;li&gt;     Or we try some specific new effects out, but then we don't have to     generalize   &lt;/li&gt; &lt;/ol&gt; Tomorrow we schedule the presentation making.&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-7843437275556560568?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/7843437275556560568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=7843437275556560568' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/7843437275556560568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/7843437275556560568'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/03/delay-in-simulink-with-adjustable.html' title=''/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-1906545609704230548</id><published>2007-03-06T13:31:00.000+01:00</published><updated>2007-03-06T19:00:18.641+01:00</updated><title type='text'></title><content type='html'> &lt;h2&gt;   important papers &lt;/h2&gt; &lt;br&gt; &lt;ul&gt;   &lt;li&gt;     &lt;a href="http://www.csis.ul.ie/dafx01/proceedings/papers/verfaille_a.pdf"&gt;A-DAFX     adaptive digital effects&lt;/a&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;a href="http://ieeexplore.ieee.org/iel5/10376/32978/101109TSA2005858531.pdf?arnumber=101109TSA2005858531"&gt;Adaptive     digital audio effects (A-DAFX) : a new class of sound transformations&lt;/a&gt;   &lt;/li&gt; &lt;/ul&gt; &lt;br&gt; These two papers show that there's already been some research on our topic.Ihaven't got much time to conclude them now, but by showing a few images fromthesecond paper, you already see how they made a general framework like we werethinking of.&lt;br&gt; &lt;img src="http://docs.google.com/File?id=df7z8b86_44hd952w" style="height: 337px; width: 532px;" align="left"&gt;&lt;br&gt; &lt;img src="http://docs.google.com/File?id=df7z8b86_45g6xvs4" style="height: 192px; width: 532px;" align="left"&gt;&lt;br&gt; &lt;img src="http://docs.google.com/File?id=df7z8b86_4625z7bc" style="height: 337px; width: 532px;" align="left"&gt;&lt;br&gt; &lt;img src="http://docs.google.com/File?id=df7z8b86_47cnvxfd" style="height: 321px; width: 532px;" align="left"&gt;&lt;br&gt; I'll summarize the papers by summing up the things I marked:&lt;br&gt; &lt;ul&gt;   &lt;li&gt;     &lt;font size="1"&gt;&lt;a href="http://ieeexplore.ieee.org/iel5/10376/32978/101109TSA2005858531.pdf?arnumber=101109TSA2005858531" style="color: rgb(153, 153, 153);"&gt;Adaptive     digital audio effects (A-DAFX) : a new class of sound     transformations&lt;/a&gt;&lt;span style="color: rgb(153, 153, 153);"&gt; p2:&lt;/span&gt;&lt;/font&gt;&lt;br&gt;     In the class of loudness effects (perceptive classification) the first     adaptive effects already exist: compressor and expander, limiter and noise     gate. They're auto-adaptive effects.   &lt;/li&gt;   &lt;li&gt;     &lt;font style="color: rgb(153, 153, 153);" size="1"&gt;&lt;a href="http://ieeexplore.ieee.org/iel5/10376/32978/101109TSA2005858531.pdf?arnumber=101109TSA2005858531"&gt;Adaptive     digital audio effects (A-DAFX) : a new class of sound transformations&lt;/a&gt;     p4:&lt;/font&gt;&lt;br&gt;     Chorus and flanging are specific cases of phase modifications known as phase     shifting or phasing.   &lt;/li&gt;   &lt;li&gt;     &lt;font size="1"&gt;&lt;a href="http://ieeexplore.ieee.org/iel5/10376/32978/101109TSA2005858531.pdf?arnumber=101109TSA2005858531" style="color: rgb(153, 153, 153);"&gt;Adaptive     digital audio effects (A-DAFX) : a new class of sound     transformations&lt;/a&gt;&lt;span style="color: rgb(153, 153, 153);"&gt; p5:&lt;/span&gt;&lt;/font&gt;&lt;br&gt;     Here they advise lowpass filtering  the pitch extraction model (based     on autocorrelation). I marked this because it could be useful for my pitch     detection algorithm, they wrote this to say that it's might be enough to use     not so good algorithms depending on what you're going to use the feature     for.   &lt;/li&gt;   &lt;li&gt;     &lt;font size="1"&gt;&lt;a href="http://ieeexplore.ieee.org/iel5/10376/32978/101109TSA2005858531.pdf?arnumber=101109TSA2005858531" style="color: rgb(153, 153, 153);"&gt;Adaptive     digital audio effects (A-DAFX) : a new class of sound     transformations&lt;/a&gt;&lt;span style="color: rgb(153, 153, 153);"&gt; p5:&lt;/span&gt;&lt;/font&gt;&lt;br&gt;     Here they introduce the three layer mapping strategy using a perceptive     layer. There are sound feature extraction, sound feature combination and     signal conditioning.&lt;br&gt;     The sound feature combination using warping (after normalizing and before     combination). This can be used for different purposes: a truncation of the     feature in order to select an interesting part, a low-pass filtering, a     scale change (from linear to exponential or logarithmic).&lt;br&gt;     What is meant by this?&lt;br&gt;     &lt;blockquote&gt;Fourth, and finally, a warping function can also be applied to     the feature combination output in order to symetrically provide     modifications of features before and after combination.&lt;br&gt;     &lt;/blockquote&gt;&lt;br&gt;    Control signal conditioning is usually used to protect hardware from an input signal.&lt;br&gt;    Long term features can be used as controls of the mapping (fi(n)), while short term features are useful as inputs. &lt;/li&gt;   &lt;li&gt;     &lt;font size="1"&gt;&lt;a href="http://ieeexplore.ieee.org/iel5/10376/32978/101109TSA2005858531.pdf?arnumber=101109TSA2005858531" style="color: rgb(153, 153, 153);"&gt;Adaptive     digital audio effects (A-DAFX) : a new class of sound     transformations&lt;/a&gt;&lt;span style="color: rgb(153, 153, 153);"&gt; p7:&lt;/span&gt;&lt;/font&gt;&lt;br&gt;Real-time implementations are performed in Max/MSP and non-real time in Matlab.&lt;br&gt;I've seen this programming environment &lt;a title="Max/MSP" href="http://www.cycling74.com/products/maxmsp"&gt;Max/MSP&lt;/a&gt; being named a couple of times in papers about our subject. It looks a bit like simulink for musical purposes.&lt;br&gt;        &lt;/li&gt;   &lt;li&gt;     &lt;font size="1"&gt;&lt;a href="http://ieeexplore.ieee.org/iel5/10376/32978/101109TSA2005858531.pdf?arnumber=101109TSA2005858531" style="color: rgb(153, 153, 153);"&gt;Adaptive     digital audio effects (A-DAFX) : a new class of sound     transformations&lt;/a&gt;&lt;span style="color: rgb(153, 153, 153);"&gt; p3:&lt;/span&gt;&lt;/font&gt;&lt;br&gt;A beautiful classification scheme of audio extraction features is given:&lt;br&gt;&lt;img style="height: 765px; width: 1073px;" src="http://docs.google.com/File?id=df7z8b86_483dw8vx"&gt;&lt;br&gt;&lt;/li&gt; &lt;/ul&gt;&lt;br&gt;&amp;gt;&amp;gt; still two other papers to summarize!&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-1906545609704230548?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/1906545609704230548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=1906545609704230548' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1906545609704230548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1906545609704230548'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/03/important-papers-dafx-adaptive-digital.html' title=''/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-8953736603592171297</id><published>2007-03-03T19:07:00.000+01:00</published><updated>2007-03-06T15:33:21.864+01:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;   simulink and some reading &lt;/h2&gt; &lt;h2&gt;   &lt;img src="http://docs.google.com/File?id=df7z8b86_40g8gvg4" style="height: 170px; width: 461px;" align="right" /&gt; &lt;/h2&gt;&lt;br /&gt;I worked in simulink and things I encountered to remember are:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;     delay blocks are calculated this way:&lt;br /&gt; I put the delay in frames. 1 frame has a default value of 256 samples.     Because the sampling period (Ts = 1/Fs) equals 2,27E-5, one frame takes 5,8     milliseconds to end. So if the delay value is 10 frames, we have a delay     time of 58 msec.&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;     so the general formula could be stated as:     &lt;span style="font-weight: bold;"&gt;delay time = Nsamples * Nframes / Fs&lt;/span&gt;     with Nsamples the number of samples per frame and Nframes the number of     frames.&lt;br /&gt; Normal delay times are:   &lt;/li&gt;   &lt;ul&gt;     &lt;li&gt;       ROLAND SH32     &lt;/li&gt;     &lt;ul&gt;       &lt;li&gt;         stereo delay: 0-500 ms       &lt;/li&gt;       &lt;li&gt;         long delay: 0-1000 ms       &lt;/li&gt;       &lt;li&gt;         stereo and long delay sync type: (Thirty-second note), (Sixteenth-note         triplet), (Dotted thirty-second note), (Sixty-fourth-note triplet),         (Sixty-fourth note), (Thirty-second-note triplet), (Eighth note),         (Quarter-note triplet), (Dotted eighth note), (Quarter note), (Sixteenth         note), (Eighth-note triplet), (Dotted sixteenth note)&lt;br /&gt;     13         possibilities!&lt;img src="http://docs.google.com/File?id=df7z8b86_38fpxhvj" style="height: 266px; width: 185px;" align="right" border="0" hspace="0" vspace="0" /&gt;       &lt;/li&gt;       &lt;li&gt;         feedback : -98% - +98% (no mapping given)       &lt;/li&gt;     &lt;/ul&gt;     &lt;li&gt;       YAMAHA MO8     &lt;/li&gt;     &lt;ul&gt;       &lt;li&gt;         0.1 - 1638.3 (with value range: 1-16383)       &lt;/li&gt;       &lt;li&gt;         feedback level: -63 - +63 (0-127)&lt;br /&gt;     they also use a feedback time, which could mean       &lt;/li&gt;       &lt;ul&gt;         &lt;ul&gt;           &lt;li&gt;             they use delay time parameter for the first delay and the feedback             time for a new delay in the feedback loop, so for the rest of the             delays. If so then it's better to rename the             &lt;span style="font-style: italic;"&gt;delay time&lt;/span&gt; parameter to             &lt;span style="font-style: italic;"&gt;initial delay time&lt;/span&gt;.           &lt;/li&gt;           &lt;li&gt;             Another possibility is that it is used to specify a kind of gate time, like the number of copies you allow.&lt;br /&gt;&lt;/li&gt;         &lt;/ul&gt;       &lt;/ul&gt;     &lt;/ul&gt;     &lt;li&gt;       T.C.ELECTRONIC D2     &lt;/li&gt;     &lt;ul&gt;       &lt;li&gt;         feedback time in stereo mode is maximally 5 sec.&lt;br /&gt;   &lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt;   &lt;ul&gt;     &lt;li&gt;       KORG MICROKORG     &lt;/li&gt;     &lt;ul&gt;       &lt;li&gt;         Here they don't really give a time but the values: 0-127       &lt;/li&gt;       &lt;li&gt;         For the syncing they give as parameters: 1.32 - 1.1 (see the diagram) 15         possibilities!       &lt;/li&gt;       &lt;li&gt;         feedback (delay depth): 0-127       &lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt;   &lt;li&gt;     So it seems that for our purpose, our delay must have a range which is the     same as the range our bpm algorithm will work with. And there might have to     be an ability to choose the sync type too, with a knob or something     (=gesture control)   &lt;/li&gt;   &lt;li&gt;     I designed two delay implementations in simulink. The only one I'm going to     speak of is the one with the feedback line. The other one has a more     flexibel, but too complex way of assigning each delay or feedback level a     gain value.&lt;br /&gt; For the feedback looped delay, I have set a feedback level of 50%. It thus     has identically the same effect as the other implementation.&lt;br /&gt; &lt;img src="http://docs.google.com/File?id=df7z8b86_41g8cfjf" style="height: 944px; width: 1246px;" /&gt;&lt;br /&gt; To see what a negative percentage for the feedback level could mean, I tried     one out and also calculated the gain after every round through the loop: it     gives the same values as for the positive counterpart, but alternating     negative/positive. &lt;span style="color: rgb(51, 204, 0); font-weight: bold;"&gt;Is it true     that this is just a phase reverse after every loop? And is that the reason     why I don't hear a difference at first sight? And why do professional     keyboards give this choice than? Or is there another meaning connected to     this negative percentage&lt;/span&gt;? I just tried adding two delays: one with a     positive feedback level of .5 or 50% and one with a negative one of -.5 or     -50%. This gives a more beautiful sound, and on the image you can see that     some delaypeaks filter each other out due to a the sum of opposite     magnitudes. (in my thesis folder on ESAT, you can find an image an the model     too). This is an image where the original signal is not shown!&lt;br /&gt; &lt;img src="http://docs.google.com/File?id=df7z8b86_42cxvtbm" style="height: 158px; width: 260px;" /&gt;   &lt;/li&gt;   &lt;li&gt;     Now I am trying to include a HF damp filter in the loop (because it     reappears in many synths). For info on filters for audio applications, this     website seems interesting:     &lt;a href="http://ccrma.stanford.edu/%7Ejos/filters/" title="http://ccrma.stanford.edu/~jos/filters/"&gt;http://ccrma.stanford.edu/~jos/filters/&lt;/a&gt;.&lt;br /&gt; The ranges are:   &lt;/li&gt;   &lt;ul&gt;     &lt;ul&gt;       &lt;li&gt;         YAMAHA MO8: 0.1 - 1.0 kHz (1-10)       &lt;/li&gt;       &lt;li&gt;         ROLAND SH32: 200Hz - 8kHz or bypass&lt;br /&gt;   &lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt;   I read that this HF DAMP function tries to simulate analog delays. Because trying to simulate other effects will focus too much on effect design, and it's something extra that can be added later, I stop implementing it any further than this. So I'll use a lowpass filter modeled with a chebyshev II filter for which Fstop can be controlled with gestures (like a knob or slider). The A-stop could also be controlled, and many other things typical to a filter can be, but no effect device that I know of provides more control than the Fstop.&lt;br /&gt;&lt;/ul&gt; &lt;ul&gt;   &lt;li&gt;     Oh yes, sometimes you can choose how many times a sound is repeated, this is     possible with a multitap delay. eg the T.C.ELECTRONIC D2 has a max delay     time of 5000msec stereo or a total of 10000msec mono. When you want 5 taps     you have a max delay of 2000msec on every tap, when you want 10 taps, you     still have 1000msec available. I don't know if the implementation differs     rather than the parameter calculation. Therefore I'll just remember the     possibility but I won't implement it now.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;-6/3/2007-&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Another thing with simulink: a single line represents a scalar value per iteration. A double line represents a vector. In this case there are double lines because of  the fact that the audio input is given in frames. There is a way to see how the signals look on every line: Format -&gt; Port/Signal Displays -&gt; Signal Dimensions&lt;/li&gt;&lt;li&gt;The simplest way to use and process a stereo signal is to split the two channels in two mono channels right after the input block and to merge them again right before you enter the output block. This is done with the following commands:&lt;/li&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;select columns (stereo &gt; mono)&lt;br /&gt;   Simulink -&gt; Signal Routing -&gt; Selector&lt;/li&gt;&lt;li&gt;merge columns (mono &gt; stereo)&lt;br /&gt;   Simulink -&gt; Math Operations -&gt; Matrix Concatenation&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-8953736603592171297?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/8953736603592171297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=8953736603592171297' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/8953736603592171297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/8953736603592171297'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/03/simulink-and-some-reading-i-worked-in.html' title=''/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-6723572125594791811</id><published>2007-03-03T16:00:00.000+01:00</published><updated>2007-03-06T19:00:18.663+01:00</updated><title type='text'></title><content type='html'>  &lt;h2&gt;some more reading on adaptive effects&lt;/h2&gt;&lt;br&gt;Today is a reading day, because I found a lot of interesting articles about our subject.&lt;br&gt;&lt;ol&gt;&lt;li&gt;First I read the article on 'an interdisciplinary appproach to audio effect classification'. The best things to remember: they explained some vocabulary (effect, sound/audio effect, sound tranformation) that make it somewhat easier to classify them in a first way. Then they state that the most general way to classify audio effects is by their perception, what is heard by the listener. They also made layered model of levels on which you can speak about effects: (low-to-high level) digital implementation technique, processing domain, applied processing, control type, perceptual attribute, semantic descriptors. What we can remember here is not how to exactly classify effects, but more a clear view on them.&lt;/li&gt;&lt;li&gt;Then I discovered the thesis of our friend V.Verfaille: &lt;a title="Effets audionumeriques adaptatifs: theorie, mise en oeuvre et usage en creation musicale numerique" href="http://adafx.free.fr/downloads/Verfaille_PhD.pdf"&gt;Effets audionumeriques adaptatifs: theorie, mise en oeuvre et usage en creation musicale numerique&lt;/a&gt;. Over 300 pages about our subject. I won't read that now, because it's too much. But we must try to read as much of it as possible!&lt;/li&gt;&lt;/ol&gt;Also I wanted to try simulink again. (it's a long time ago). Look at the last &lt;span style="font-style: italic;"&gt;weekly meeting&lt;/span&gt; post to see why I want to do this. I'll try some effects or so out. Probably enough problems to solve before I succeed in that.&lt;br&gt;&lt;ul&gt;&lt;li&gt;signal processing blockset contains wave in and out blocks. You must be in the right working directory for the audio files to be found. When starting simulink the working directory is changed!&lt;/li&gt;&lt;li&gt;I also have a problem when trying to link more than one signal. I think I'm just using the wrong blocks. (mux or merge) Idea of sam is to use an adder block and maybe scaling blocks per signal. I'll try this out.&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-6723572125594791811?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/6723572125594791811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=6723572125594791811' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/6723572125594791811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/6723572125594791811'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/03/some-more-reading-on-adaptive-effects.html' title=''/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-718781410033886929</id><published>2007-02-28T15:58:00.000+01:00</published><updated>2007-02-28T15:58:15.901+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='esat'/><category scheme='http://www.blogger.com/atom/ns#' term='matlab'/><category scheme='http://www.blogger.com/atom/ns#' term='links'/><title type='text'>Reading at home and matlabsession in ESAT on HPS and a interface between effects</title><content type='html'>I finally found an article on that specific thing we are working on.  (uch, some articles):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www2.hsu-hh.de/ant/dafx2002/papers/DAFX02_Verfaille_Arfib_adaptive_DAFx.pdf"&gt;Implementation strategies for adaptive digital audio effects&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.csis.ul.ie/dafx01/proceedings/papers/verfaille_a.pdf"&gt;A-DAFX adaptive digital effects&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ieeexplore.ieee.org/iel5/10376/32978/101109TSA2005858531.pdf?arnumber=101109TSA2005858531"&gt;Adaptive digital audio effects (A-DAFX) : a new class of sound transformations&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://music.ucsd.edu/%7Esdubnov/Mu172/papers/P_296.pdf"&gt;Adaptive audio effects based on STFT, using a source filter model&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.elec.qmul.ac.uk/dafx03/proceedings/pdfs/dafx20.pdf"&gt;Driving pitch-shifting and time-scaling algorithms with adaptive and gestural techniques&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.dafx.ca/proceedings/papers/p_107.pdf"&gt;An interdisciplinary approach to audio effect classification&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Very interesting of course.&lt;br /&gt;In the first article they speak of mapping functions and a control curve. Also the control scaling part is nice.&lt;br /&gt;&lt;br /&gt;I'm going to read the other ones now too, because I tried some other things in matlab, but they wouldn't work well: a little bit more explanation:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I implemented the basics of the HPS algorithm as promised yesterday. Basically it's allright, but I don't know if it works because firstly I didn't yet implement the deciding code (which decides which peak is the current pitch), secondly because I didn't think about frames or blocks (Maybe this is not necessary, but I didn't yet think about this), thirdly because there's a seemingly stupid thing happening in matlab: it doesn't recognize the file I want to play. (&lt;span style="font-style: italic;"&gt;Solved: I have to give the attributes as a string, so encapsulated with ' ' &lt;/span&gt;)&lt;/li&gt;&lt;li&gt;I also tried to make an applyEffect.m-like file that selects the extraction algorithm and effect, and then reads the file, applies the effect with the parameters from the extraction algorithm and plays the file. This is complexer than I thought, so I need to read or think about the control curve some more.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-718781410033886929?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/718781410033886929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=718781410033886929' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/718781410033886929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/718781410033886929'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/02/reading-at-home-and-matlabsession-in.html' title='Reading at home and matlabsession in ESAT on HPS and a interface between effects'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-1300120310163925464</id><published>2007-02-28T13:26:00.000+01:00</published><updated>2007-02-28T13:35:19.460+01:00</updated><title type='text'>The official title of our thesis</title><content type='html'>Our department asked to give them the official title of our work. They need it for the official webpages about thesises on the website of KUL.&lt;br /&gt;Little brainstorm:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It's live music we're dealing with. Live as in real-time. Also as in 'with public' but that doesn't change anything for us.&lt;/li&gt;&lt;li&gt;It's music we're dealing with. If it's not necessary to specify which kind of music I wouldn't do it. But it might be appropriate to make a coarse distinction anyway. Something like: electro-acoustic music, or modern music (although this does not necessarily cancel out classical music). Maybe this isn't even necessary because the fact that you use audio effects already implies that you won't be doing classical music. Woops, not true: some effects might be useful for classical live conceerts too. What to do with this item?&lt;/li&gt;&lt;li&gt;Digital effects of course&lt;/li&gt;&lt;li&gt;Intelligent is a better name then adaptive if you ask me, although adaptive is already used in literature [verfaille, arfib]&lt;/li&gt;&lt;/ul&gt;Extensively comment on this post please!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-1300120310163925464?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/1300120310163925464/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=1300120310163925464' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1300120310163925464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1300120310163925464'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/02/official-title-of-our-thesis.html' title='The official title of our thesis'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-6899588358613598200</id><published>2007-02-27T17:14:00.000+01:00</published><updated>2007-02-27T22:39:51.864+01:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;matlab session on pitch tracking using harmonic product spectrum&lt;/h2&gt;&lt;br&gt;I'm hoping to implement a working matlab algorithm based on the HPS method.&lt;br&gt;Some information on it:&lt;br&gt;&lt;ul&gt;&lt;li&gt;&lt;a title="http://www-ccrma.stanford.edu/~pdelac/220c/Presentation/img1.htm" href="http://www-ccrma.stanford.edu/%7Epdelac/220c/Presentation/img1.htm"&gt;http://www-ccrma.stanford.edu/~pdelac/220c/Presentation/img1.htm&lt;/a&gt; &lt;br&gt;A short image-based explanation of the algorithm and some parameters of it&lt;/li&gt;&lt;li&gt;&lt;a title="http://cnx.org/content/m11714/latest/" href="http://cnx.org/content/m11714/latest/"&gt;http://cnx.org/content/m11714/latest/&lt;/a&gt; &lt;br&gt;A post about pitch detection explaining HPS too.&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;Much time 'lost' on the weekly meeting.&lt;br&gt;I started implementing HPS, but I'll continue tomorrow, nothing worth to say for now.&lt;br&gt;I also tried the frame-by-frame idea. Have to study it, but I made an implementation in the thesis folder on ESAT.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;In between the soup and potatoes (dutch saying) I added a mixer section to the applyEffect algorithm:&lt;br&gt;&lt;blockquote&gt;%% mixer&lt;br&gt;inputSignalMixer = outputSignalEffect(1:length(originalSignal)); % cut any extra samples away for the wet and dry signals to match&lt;br&gt;outputSignalMixer = wet * inputSignalMixer + (1 - wet) * originalSignal; % mix wet and dry signal&lt;br&gt;&lt;/blockquote&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-6899588358613598200?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/6899588358613598200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=6899588358613598200' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/6899588358613598200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/6899588358613598200'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/02/matlab-session-on-pitch-tracking-using.html' title=''/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-3639176687995497469</id><published>2007-02-27T15:55:00.000+01:00</published><updated>2007-02-28T13:26:00.858+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='esat'/><category scheme='http://www.blogger.com/atom/ns#' term='update'/><title type='text'>weekly meeting</title><content type='html'>A very long meeting, many things are said. I'll try a conclusion:&lt;br /&gt;In this stage we see too many possibilities, too many ways we can walk. That's normal.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A good idea is to keep on swimming in this chaos for a few days and then try to decide on some things and ordering everything in our minds.&lt;/li&gt;&lt;li&gt;We discussed a while on realtime issues and complexity issues:&lt;br /&gt;Following Toons' opinion there are two extremes for us. I made a little figure of them:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nZN_cKLn0nw/ReROQU7516I/AAAAAAAADVY/00L2tws0nPQ/s1600-h/system+with+one+instrument+itself.PNG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_nZN_cKLn0nw/ReROQU7516I/AAAAAAAADVY/00L2tws0nPQ/s400/system+with+one+instrument+itself.PNG" alt="" id="BLOGGER_PHOTO_ID_5036236325711894434" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nZN_cKLn0nw/ReROQE7515I/AAAAAAAADVQ/7pKsnLuGpSQ/s1600-h/system+with+different+known+tracks.PNG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_nZN_cKLn0nw/ReROQE7515I/AAAAAAAADVQ/7pKsnLuGpSQ/s400/system+with+different+known+tracks.PNG" alt="" id="BLOGGER_PHOTO_ID_5036236321416927122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The first one shows the most difficult one: extracting information from the signal upon which we want to apply the effect.&lt;br /&gt;&lt;br /&gt;The second one is complexer, but easier. Here we have the whole spectrum of chosen tracks we want to use to extract different features from the music. Best is to use them all at once as an input, then the algorithm can choose the tracks it needs for the solution. This feature vector is then used as an input for effects that are applied on different tracks of choice (not necessarily the same tracks that are used as input for the feature extraction.)&lt;br /&gt;&lt;br /&gt;-28feb2007-&lt;br /&gt;There is another well defined extreme I thought of: It's like the second idea, but using only the master tracks as an input for the extraction algorithms. This means you have your 'intelligent effect box' and you plug into it a stereo mic or the outputs of the stereo masters of the mixer. The algorithms have to segment the music then or at least they have to do their thing without knowing specific knowledge about the input. They must be able to deal with noise from the public. &lt;span style="color: rgb(255, 0, 0);"&gt;This is a problem we won't handle&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I talked also a lot about the interface of the effect blocks and extraction blocks. Probably the best and only choice is to use a modular structure. But in that case I want to have as soon as possible a standard interface.&lt;/li&gt;&lt;li&gt;We will never reach the stage where we implement the effect in C or something like that, the farthest we'll get might be simulink (modular and realtime). It might be the right time to switch to simulink sometimes already.&lt;/li&gt;&lt;li&gt;Obviously I forgot a lot of details here... &lt;span style="color: rgb(51, 204, 0); font-weight: bold;"&gt;someone?&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-3639176687995497469?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/3639176687995497469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=3639176687995497469' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/3639176687995497469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/3639176687995497469'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/02/weekly-meeting_27.html' title='weekly meeting'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_nZN_cKLn0nw/ReROQU7516I/AAAAAAAADVY/00L2tws0nPQ/s72-c/system+with+one+instrument+itself.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-2474334716855122303</id><published>2007-02-26T14:00:00.000+01:00</published><updated>2007-02-27T13:20:33.255+01:00</updated><title type='text'></title><content type='html'>  &lt;h2&gt;time based pitch tracking in matlab&lt;/h2&gt;&lt;br&gt;Today I'll try a basic algorithm based on long term prediction (LTP). See DAFX p348 and further. It is optimized for a singing voice. This optimization is done in the post-processing part. I have to change the main algorithm the same way I did with the frequency based algorithm of the previous post.&lt;br&gt;Some calculations were needed to make sure the matrix dimensions of the for-loop are not exceeded.&lt;br&gt;&lt;div style="margin-left: 40px;"&gt;indexMax = ((blocks-1)*K) + N + pre&lt;br&gt;                           -&amp;gt; ((blocks-1)*K) &amp;lt; Nx&lt;br&gt;                           -&amp;gt; Nx = n1 - pre = n1 - lmax&lt;br&gt;             &amp;lt; n1 - pre + N + pre&lt;br&gt;             = n1 + N&lt;br&gt;&lt;/div&gt;So we need to pad the X-vector with N extra zeros:&lt;br&gt;&lt;blockquote&gt;X = [X,zeros(1,N)]; % zero-padding until new length&lt;br&gt;&lt;/blockquote&gt;The algorithm, with indicated external functions and default values:&lt;br&gt;&lt;blockquote&gt;&lt;font size="1"&gt;% M-file 9.23&lt;br&gt;% pitch_tracker_ltp.m&lt;br&gt;%&lt;br&gt;% main file for a pitch tracker based on long-term prediction in time domain&lt;br&gt;% (c) 2002 Florian Keiler&lt;br&gt;&lt;br&gt;fname='x1.wav';&lt;br&gt;%n0=2000; %start index&lt;br&gt;%n1=210000;&lt;br&gt;[X,Fs]=wavread(fname);&lt;br&gt;n0=1;&lt;br&gt;n1=length(X);&lt;br&gt;&lt;br&gt;K=200;   % hop size for time resolution of pitch estimation&lt;br&gt;N=1024;  %block length&lt;br&gt;&lt;br&gt;% checked pitch range in Hz:&lt;br&gt;fmin=50;&lt;br&gt;fmax=800;&lt;br&gt;b0_thres=.2;      % threshold for LTP coeff&lt;br&gt;p_fac_thres=1.05; % threshold for voiced detection&lt;br&gt;                  % deviation of pitch from mean value   &lt;br&gt;&lt;br&gt;%[xin,Fs]=wavread(fname,[n0 n0]); %get Fs&lt;br&gt;%lag range in samples:&lt;br&gt;lmin=floor(Fs/fmax);&lt;br&gt;lmax=ceil(Fs/fmin);&lt;br&gt;pre=lmax; %number of pre-samples&lt;br&gt;if n0-pre&amp;lt;1&lt;br&gt;  n0=pre+1;&lt;br&gt;end  &lt;br&gt;Nx=n1-n0+1; %signal length&lt;br&gt;blocks=floor(Nx/K);&lt;br&gt;% blocks=floor(length(X)/K);%number of blocks&lt;br&gt;Nx=(blocks-1)*K+N;&lt;br&gt;%[X,Fs]=wavread(fname,[n0-pre n0+Nx]);&lt;br&gt;X=X(:,1)';&lt;br&gt;X = [X,zeros(1,N)]; % zero-padding until new length&lt;br&gt;&lt;br&gt;&lt;br&gt;pitches=zeros(1,blocks);&lt;br&gt;for b=1:blocks&lt;br&gt;  x=X((b-1)*K+(1:N+pre));&lt;br&gt;  [M, Fp]=&lt;span style="font-weight: bold; background-color: rgb(255, 153, 0);"&gt;find_pitch_ltp&lt;/span&gt;(x, lmin, lmax, N, Fs, b0_thres);&lt;br&gt;  if ~isempty(M)&lt;br&gt;    pitches(b)=Fs/M(1); % take candidate with lowest pitch&lt;br&gt;  else&lt;br&gt;    pitches(b)=0;&lt;br&gt;  end  &lt;br&gt;end&lt;br&gt;&lt;br&gt;%%%% post-processing:&lt;br&gt;L=9;  % number of blocks for mean calculation&lt;br&gt;if mod(L,2)==0 % L is even&lt;br&gt;  L=L+1;&lt;br&gt;end  &lt;br&gt;D=(L-1)/2; %delay&lt;br&gt;h=ones(1,L)./L;  % impulse response for mean calculation&lt;br&gt;% mirror beginning and end for "non-causal" filtering:&lt;br&gt;p=[pitches(D+1:-1:2), pitches, pitches(blocks-1:-1:blocks-D)]; % 2D samples longer&lt;br&gt;y=conv(p,h);        % length: blocks+2D+2D&lt;br&gt;pm=y((1:blocks)+2*D); % cut result&lt;br&gt;&lt;br&gt;Fac=zeros(1,blocks); &lt;br&gt;idx=find(pm~=0); % dont divide by zero&lt;br&gt;Fac(idx)=pitches(idx)./pm(idx);&lt;br&gt;ii=find(Fac&amp;lt;1 &amp;amp; Fac~=0);&lt;br&gt;Fac(ii)=1./Fac(ii); % all non-zero element are now &amp;gt; 1&lt;br&gt;% voiced/unvoiced detection:&lt;br&gt;voiced=Fac~=0 &amp;amp; Fac&amp;lt;p_fac_thres;&lt;br&gt;&lt;br&gt;T=40; % time in ms for segment lengths&lt;br&gt;M=round(T/1000*Fs/K); % min. number of blocks in a row&lt;br&gt;[V,p2]=&lt;span style="background-color: rgb(255, 153, 0); font-weight: bold;"&gt;segmentation&lt;/span&gt;(voiced, M, pitches);&lt;br&gt;p2=V.*p2;  % set pitches to zero for unvoiced &lt;br&gt;&lt;br&gt;%plotting things&lt;br&gt;figure(1)&lt;br&gt;clf&lt;br&gt;time=(0:blocks-1)*K+1; %start sample of blocks&lt;br&gt;time=time/Fs;  %time in seconds&lt;br&gt;t=(0:length(X)-1)/Fs; % time in sec for original&lt;br&gt;subplot(211)&lt;br&gt;plot(t, X)&lt;br&gt;title('original x(n)')&lt;br&gt;axis([0 max([t,time]) -1.1*max(abs(X)) 1.1*max(abs(X))])&lt;br&gt;&lt;br&gt;subplot(212)&lt;br&gt;idx=find(p2~=0);&lt;br&gt;&lt;span style="font-weight: bold; background-color: rgb(255, 153, 0);"&gt;plot_split&lt;/span&gt;(idx,time, p2)&lt;br&gt;title('pitch in Hz')&lt;br&gt;xlabel('time/s rightarrow')&lt;br&gt;axis([0 max([t,time]) .9*min(p2(idx)) 1.1*max(p2(idx))])&lt;br&gt;&lt;br&gt;&lt;br&gt;% synthesize sinusoids:&lt;br&gt;y2=synth_sine_fade(p2,K,Fs);&lt;br&gt;soundsc(y2, Fs)&lt;br&gt;wavwrite(.99*y2,Fs,[fname, '_pitch_ltp'])&lt;br&gt;&lt;/font&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;img style="height: 420px; width: 560px;" src="http://docs.google.com/File?id=df7z8b86_33hjx46j"&gt;&lt;br&gt;This is the result with default arguments:&lt;br&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;n0 = 1&lt;/li&gt;&lt;li&gt;n1 = length(X)&lt;/li&gt;&lt;li&gt;K = 200&lt;/li&gt;&lt;li&gt;N = 1024&lt;/li&gt;&lt;li&gt;fmin = 50&lt;/li&gt;&lt;li&gt;fmax = 800&lt;/li&gt;&lt;li&gt;b0_thres = .2&lt;/li&gt;&lt;li&gt;p_fac_thres = 1.05&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br&gt;The parameter K has the same effect as in the previous post.&lt;br&gt;Already having a very low threshold value I assumed the algorithm would be able to track x2.wav (a musical piece with strong melody) too (as seen in the previous post). But this is not true here. Whether this is inherent to the algorithm itself or due to the post-processing part I cannot tell. With a quick look on the code it seems that for both algorithms tested until now, the post-processing part is exactly the same, so this suggests that the algorithm itself is not fit for tracking musical melodies.&lt;br&gt;The threshold value has another effect apparently, because when I enlarge it, the results for x2.wav are somewhat better. I might check the exact meaning of the threshold value, but first I'll try some other algorithms, necause it seems that this one is inherently not fitted for our purpose.&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-2474334716855122303?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/2474334716855122303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=2474334716855122303' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/2474334716855122303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/2474334716855122303'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/02/time-based-pitch-tracking-in-matlab.html' title=''/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-408109843842878018</id><published>2007-02-23T15:38:00.000+01:00</published><updated>2007-02-26T11:27:40.223+01:00</updated><title type='text'></title><content type='html'>   &lt;h2&gt;matlab session on pitch tracking ctd.&lt;/h2&gt;&lt;br&gt;I started analyzing the FFT based pitch tracking algorithm described in DAFX pages 337 and further.&lt;br&gt;First I did the &lt;span style="font-weight: bold;"&gt;find_pitch_fft.m&lt;/span&gt; file:&lt;br&gt;&lt;blockquote&gt;function [FFTidx, Fp_est, Fp_corr] = find_pitch_fft(x, &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;win&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;, &lt;/span&gt;Nfft, &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;Fs&lt;/span&gt;, R, fmin, fmax, thres)&lt;br&gt;&lt;br&gt;%[x,Fs] = wavread(soundFile);&lt;br&gt;%x = x(1:Nfft+R);&lt;br&gt;% [FFTidx, Fp_est, Fp_corr] = find_pitch_fft(x, win, Nfft, Fs, R, fmin, fmax, thres)&lt;br&gt;%&lt;br&gt;% M-file 9.15&lt;br&gt;% find_pitch_fft.m&lt;br&gt;%&lt;br&gt;% find pitch candidates of given signal block x&lt;br&gt;%      x: input signal of length Nfft+R&lt;br&gt;%      win: window for the FFT&lt;br&gt;%      Nfft: FFT length&lt;br&gt;%      Fs: sampling frequency&lt;br&gt;%      R: FFT hop size&lt;br&gt;%      fmin, fmax: minumum/ maximum pitch freqs to be detected&lt;br&gt;%      thres: omit maxima more than thres dB below the main peak&lt;br&gt;% &lt;br&gt;% (c) 2002 Florian Keiler&lt;br&gt;&lt;br&gt;FFTidx  = [];            % FFT indices&lt;br&gt;Fp_est  = [];            % FFT bin frequencies&lt;br&gt;Fp_corr = [];            % corrected frequencies&lt;br&gt;dt      = R/Fs;          % time diff between FFTs&lt;br&gt;df      = Fs/Nfft;       % freq resolution&lt;br&gt;kp_min  = round(fmin/df);&lt;br&gt;kp_max  = round(fmax/df);&lt;br&gt;x1      = x(1:Nfft);     % 1st block&lt;br&gt;x2      = x((1:Nfft)+R); % 2nd block with hop size R&lt;br&gt;[X1, Phi1] = fftdb(x1.*win,Nfft);&lt;br&gt;[X2, Phi2] = fftdb(x2.*win,Nfft);&lt;br&gt;X1      = X1(1:kp_max+1); &lt;br&gt;Phi1    = Phi1(1:kp_max+1);&lt;br&gt;X2      = X2(1:kp_max+1); &lt;br&gt;Phi2    = Phi2(1:kp_max+1);&lt;br&gt;idx     = find_loc_max(X1);&lt;br&gt;Max     = max(X1(idx));&lt;br&gt;ii      = find(X1(idx)-Max&amp;gt;-thres);&lt;br&gt;&lt;br&gt;%----- omit maxima more than thres dB below the main peak -----&lt;br&gt;idx     = idx(ii);&lt;br&gt;Nidx    = length(idx);   % number of detected maxima&lt;br&gt;maxerr  = R/Nfft;        % max phase diff error/pi (pitch max. 0.5 bins wrong)&lt;br&gt;maxerr  = maxerr*1.2;    % some tolerance&lt;br&gt;for ii=1:Nidx&lt;br&gt;   k        = idx(ii) - 1;            % FFT bin with maximum&lt;br&gt;   phi1     = Phi1(k+1);            % phase of x1 in [-pi,pi]&lt;br&gt;   phi2_t   = phi1 + 2*pi/Nfft*k*R;   % expected target phase after hop size R&lt;br&gt;   phi2     = Phi2(k+1);            % phase of x2 in [-pi,pi]&lt;br&gt;   phi2_err = princarg(phi2-phi2_t);&lt;br&gt;   phi2_unwrap = phi2_t+phi2_err;&lt;br&gt;   dphi     = phi2_unwrap - phi1;     % phase diff&lt;br&gt;   if (k&amp;gt;kp_min) &amp;amp; (abs(phi2_err)/pi&amp;lt;maxerr)&lt;br&gt;      Fp_corr = [Fp_corr; dphi/(2*pi*dt)];&lt;br&gt;      FFTidx  = [FFTidx; k];&lt;br&gt;      Fp_est  = [Fp_est; k*df];&lt;br&gt;   end&lt;br&gt;end&lt;br&gt;&lt;br&gt;&lt;/blockquote&gt;Problems I encountered:&lt;br&gt;&lt;ul&gt;&lt;li&gt;I erased Fs as an input argument, because I can get directly from the wavread command. This posed no problems until I used another function that calls this function. For both functions to use the same Fs, it's necessary to send it as an input argument.&lt;/li&gt;&lt;li&gt;When inputting the argument &lt;span style="font-style: italic;"&gt;win&lt;/span&gt; I must describe it like this:&lt;br&gt;&lt;blockquote&gt;find_pitch_fft('La.wav',hann(1024),1024,1,20,15000,40)&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;Then after that I went on to the &lt;span style="font-weight: bold;"&gt;Pitch_Tracker_FFT_main.m&lt;/span&gt; file.&lt;br&gt;&lt;br&gt;In the main function only I encountered some problems:&lt;br&gt;&lt;ul&gt;&lt;li&gt;I had to correct the first line like this:&lt;br&gt;I had to add the apostrophes and the .wav extension&lt;br&gt;&lt;blockquote&gt;fname='x1.wav';&lt;br&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="1"&gt;Next thing was that they used the algorithm optimized for a specific wavfile. To generalize this I had to adjust the n0 and n1 boundaries. I reasoned, what is the most general solution for this, and it would be to set n0 to zero and n1 to the number of samples the given piece contains.&lt;br&gt;&lt;/font&gt;&lt;blockquote&gt;&lt;font size="1"&gt;%these are optimized for x1.wav&lt;br&gt;%n0=2000; %start index&lt;br&gt;%n1=210000;&lt;br&gt;%I'll try it in general&lt;br&gt;[X,Fs]=wavread(fname);&lt;br&gt;n0=0&lt;br&gt;n1=length(X)&lt;br&gt;&lt;/font&gt;&lt;/blockquote&gt;&lt;font size="1"&gt;This gave some problems where they do some changes on n0 and n1, because suddenly the new n1 would be bigger than the length of the piece. I solved this by just eliminating this part. The algorithm still works then, so I ask &lt;span style="color: rgb(51, 204, 0);"&gt;why this part was contained in the algorithm&lt;/span&gt;. &lt;span style="color: rgb(255, 0, 0);"&gt;(OK)&lt;/span&gt;&lt;br&gt;&lt;/font&gt;&lt;blockquote&gt;&lt;font size="1"&gt;%Nx=n1-n0+1+R %signal length&lt;br&gt;%blocks=floor(Nx/K)&lt;br&gt;%Nx=(blocks-1)*K+Nfft+R&lt;br&gt;%n1=n0+Nx % new end index&lt;br&gt;&lt;/font&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="1"&gt;But this gives a matrix dimensions exceede problem:&lt;br&gt;&lt;/font&gt;&lt;blockquote&gt;&lt;font size="1"&gt;for b=1:blocks&lt;br&gt;  x=X((b-1)*K+1+(1:Nfft+R));&lt;br&gt;&lt;/font&gt;&lt;/blockquote&gt;&lt;font size="1"&gt;Strange that matlab doesn't seem to complain about the fact that &lt;span style="font-style: italic;"&gt;blocks&lt;/span&gt; isn't defined&lt;/font&gt;&lt;/li&gt;&lt;li&gt;These and other adjustments kept creating new problems. I tried it otherwise:&lt;br&gt;I followed the original algorithm step-by-step to see what it did.&lt;br&gt;&lt;br&gt;Nx = n1 - n0 + 1 + R&lt;br&gt;%so it actually makes the chosen part longer&lt;br&gt;%in my case, as I want n0 to be 1 en n1 to be the length of the audio sample, it makes Nx greater than the total length of the wave file.&lt;br&gt;blocks = floor(Nx/K)&lt;br&gt;%As far is I understand this divides the total number of Nx samples in Nx/K blocks, each of length K (floored to the nearest smaller integer), and non-overlapping.&lt;br&gt;%so this must be something else than the blocks for the FFT who are overlapping in their length-R.&lt;br&gt;%anyone an idea what they're here for then? The algorithm talks about &lt;span style="font-style: italic;"&gt;hop size for time resolution for pitch estimation &lt;span style="color: rgb(255, 0, 0);"&gt;(see lower for an answer (remarks after the algorithm))&lt;/span&gt;&lt;/span&gt;&lt;br&gt;Nx = (blocks-1)*K + Nfft + R&lt;br&gt;    = ((floor(Nx/K))-1)*K + Nfft + R&lt;br&gt;    &amp;lt; ((Nx/K+1)-1)*K + Nfft + R&lt;br&gt;    = Nx + Nfft + R&lt;br&gt;    = n1 - n0 + 2*R + 1 + Nfft&lt;br&gt;%the new end index becomes&lt;br&gt;n1 = n0 + Nx&lt;br&gt;    &amp;lt; n0 + n1 - n0 + 2*R + 1 + Nfft&lt;br&gt;    = n1 &lt;span style="font-weight: bold;"&gt;+ 2R + 1 + Nfft&lt;br&gt;&lt;/span&gt;This is the maximum number of samples that are added to the original part of the audio sample, in my favored case this is the max number of samples added to the total audio sample.&lt;br&gt;This now gives us the choice:&lt;br&gt;&lt;ul&gt;&lt;li&gt;OR we do the wavread here. We must then care for the fact that the original n1 must be smaller than the total length of the audio sample minus 2*R + 1 + Nfft. Because now you will certainly not try to 'wavread' too many samples, samples that aren't there.&lt;/li&gt;&lt;li&gt;OR we can zero-pad the wave vector here until it has the new length n1-n0&lt;br&gt;This is what I'll do here. It might give an small mistake for the last blocks that comprise these zeros, but there will always be problems at the end of a sample. I think the zeros minimize thiese problems. (I can be wrong)&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;This brings us to the first part (that works generally):&lt;br&gt;&lt;blockquote&gt;% M-file 9.18&lt;br&gt;% pitch_tracker_fft_main.m&lt;br&gt;%&lt;br&gt;% main file for a pitch tracker based on FFT with phase vocoder approach&lt;br&gt;% (c) 2002 Florian Keiler&lt;br&gt;&lt;br&gt;fname='La.wav';&lt;br&gt;[X,Fs]=wavread(fname);&lt;br&gt;n0=1&lt;br&gt;n1=length(X)&lt;br&gt;&lt;br&gt;Nfft=1024;&lt;br&gt;R=1; % FFT hop size for pitch estimation&lt;br&gt;K=200; % hop size for time resolution of pitch estimation&lt;br&gt;thres=50; % threshold for FFT maxima&lt;br&gt;% checked pitch range in Hz:&lt;br&gt;fmin=50;&lt;br&gt;fmax=800;&lt;br&gt;p_fac_thres=1.05; % threshold for voiced detection&lt;br&gt;                  % deviation of pitch from mean value   &lt;br&gt;&lt;br&gt;win=hanning(Nfft)';    % window for FFT&lt;br&gt;&lt;br&gt;Nx=n1-n0+1+R %signal length&lt;br&gt;blocks=floor(Nx/K)&lt;br&gt;Nx=(blocks-1)*K+Nfft+R&lt;br&gt;n1=n0+Nx % new end index&lt;br&gt;X=X(:,1)';&lt;br&gt;length_afterCalculatingNewLength = length(X)&lt;br&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;for i=length(X):n1                                              this I changed to:&lt;/span&gt;&lt;br style="color: rgb(255, 0, 0);"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;    X(i)=0;                                                                 X = [X,zeros(1,n1-length(X))];&lt;/span&gt;&lt;br style="color: rgb(255, 0, 0);"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;end&lt;/span&gt;&lt;br&gt;new_length = length(X)&lt;br&gt;&lt;br&gt;pitches=zeros(1,blocks);&lt;br&gt;for b=1:blocks&lt;br&gt;  x=X((b-1)*K+1+(1:Nfft+R));&lt;br&gt;  [FFTidx, Fp_est, Fp_corr]=find_pitch_fft(x, win, Nfft, Fs, R, fmin, fmax, thres);  &lt;br&gt;  if ~isempty(Fp_corr)&lt;br&gt;    pitches(b)=Fp_corr(1); % take candidate with lowest pitch&lt;br&gt;  else&lt;br&gt;    pitches(b)=0;&lt;br&gt;  end  &lt;br&gt;end&lt;br&gt;&lt;/blockquote&gt;Remarks on parameters:&lt;br&gt;&lt;ul&gt;&lt;li&gt;If I enlarge K (1000) the algorithm works much faster, but, as you see, the time resolution is not so good.&lt;br&gt;&lt;img style="height: 420px; width: 560px;" src="http://docs.google.com/File?id=df7z8b86_28g7cxvq"&gt;&lt;/li&gt;&lt;li&gt;If I make K smaller, the calculations take very long and the pitch tracking is much more fluent. Sometimes it has short faulty tones. Maybe we can filter these out assuming that the voice cannot change that fast and short. But this would stop us from using the algorithm for instruments...&lt;br&gt;&lt;img style="height: 420px; width: 560px;" src="http://docs.google.com/File?id=df7z8b86_2927rw9t"&gt;&lt;br&gt;K thus sets the nuber of times that the main for-loop is run.&lt;/li&gt;&lt;li&gt;A very big (1000) value for R results in long calculations and technically seen a worse pitch estimation, see fig9.27, p337 in DAFX.&lt;br&gt;&lt;img style="height: 420px; width: 560px;" src="http://docs.google.com/File?id=df7z8b86_30fzq4n2"&gt;&lt;/li&gt;&lt;li&gt;For input x2.wav to give a meaningful result I set thres on 1 (which is very small compared to the preferred 30-50). This means that we leave the allowed deviation from zero for the phase error very small. &lt;span style="color: rgb(51, 204, 0); font-weight: bold;"&gt;I don't really understand why that gives better results here&lt;/span&gt;. If I let the thres value have its default value, then we get nothing but two low blobs of sound somewhere in time.&lt;br&gt;&lt;img style="height: 420px; width: 560px;" src="http://docs.google.com/File?id=df7z8b86_31jg4hx6"&gt;&lt;/li&gt;&lt;/ul&gt;Next time I'll try the time-domain based pitch tracking algorithm from DAFX. For now I'm stopping here.&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-408109843842878018?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/408109843842878018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=408109843842878018' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/408109843842878018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/408109843842878018'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/02/matlab-session-on-pitch-tracking-ctd.html' title=''/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-5320002578679731539</id><published>2007-02-22T16:45:00.000+01:00</published><updated>2007-02-22T16:46:21.512+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='esat'/><category scheme='http://www.blogger.com/atom/ns#' term='matlab'/><title type='text'>matlab session on pitch detection, but more about ring modulator etc.</title><content type='html'>&lt;span style="color: rgb(0, 104, 28);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Also today I do a little warming up:&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt; I'd like to give a it a shot and implement a &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;ring modulator&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; (DAFX p76). The ring modulator of my yamaha MO8 has the following parameters:&lt;/span&gt;&lt;br /&gt;&lt;/span&gt; &lt;ul&gt;   &lt;ul&gt;     &lt;li&gt;       oscillator frequency coarse (0.5 - 5 kHz)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;oscillator frequency fine (0 - 127)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;LFO wave (tri, sine)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;LFO depth (0 - 127)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;LFO speed (0.0 - 39.70 Hz)&lt;br /&gt;&lt;/li&gt;&lt;li style="font-style: italic;"&gt;HPF cutoff frequency&lt;/li&gt;&lt;li style="font-style: italic;"&gt;LPF cutoff frequency&lt;/li&gt;&lt;li style="font-style: italic;"&gt;dry/wet balance&lt;/li&gt;&lt;li style="font-style: italic;"&gt;EQ low frequency&lt;/li&gt;&lt;li style="font-style: italic;"&gt;EQ low gain&lt;/li&gt;&lt;li style="font-style: italic;"&gt;EQ high frequency&lt;/li&gt;&lt;li style="font-style: italic;"&gt;EQ high gain&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;Only the first five comprise the ring modulation, 6 and 7 are filter parameters, 8 is a mixer parameter and the rest are EQ parameters.&lt;br /&gt;Some remarks:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I used&lt;br /&gt;&lt;blockquote&gt;modSound = sin(2*pi*OSCfreq*[0:1/Fs:Nbits]);&lt;br /&gt;&lt;/blockquote&gt;but the Nbits indicates the quantization depth (16 bits when used with the wave file flute2.wav in my folder). Instead I have to use the length of the sound vector (as seen in the algorithm) when I want the modulating signal to be as long as the soundFile input.&lt;br /&gt;What I still don't get is why I have to divide the length of the vector &lt;span style="font-weight: bold;"&gt;sound&lt;/span&gt; with Fs. It is a kind of normalization, and if I don't do it, it wouldn't work. But I don't know why.&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;solution: Try it with a ridiculous 2Hz sampling frequency and 10 seconds music sample. You'll see that if you want as many samples on the sine wave as on the input sample you'll have to divide the length of your input minus 1 through 2 to get to the 10 seconds.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I spent a reasonable amount of time in generating different signals to be used as modulators; sine wave, triangular wave (special case of:), sawtooth, square wave. Everything works allright and the explanations are to be found in the m-file.&lt;/li&gt;&lt;li&gt;The algorithm:&lt;br /&gt;&lt;blockquote&gt;function [output] = ringmod(soundFile, OSCfreq, LFOwave, LFOdepth, LFOspeed)&lt;br /&gt;% ring modulator&lt;br /&gt;% y(n) = x(n).m(n)&lt;br /&gt;%   OSCfreq: oscillator frequency (best between )&lt;br /&gt;%   LFOwave: type of wave that modulates the audio signal (sine, triangle, square, sawtooth with standard width)&lt;br /&gt;&lt;br /&gt;[sound,Fs,Nbits] = wavread(soundFile);&lt;br /&gt;&lt;br /&gt;% defining the modulating wave type 'LFOwave'&lt;br /&gt;% SINE&lt;br /&gt;if (strcmp(LFOwave, 'sine')) % use strcmp instead of == to compare strings&lt;br /&gt;   % sampled taking steps of Ts or 1/Fs and this until length(sound)/Fs samples are&lt;br /&gt;   % calculated&lt;br /&gt;   % number of vector values 'length(sound)' must be normalized by Fs&lt;br /&gt;   % because ... (?)&lt;br /&gt;   modSound = sin(2*pi*OSCfreq*[0:1/Fs:(length(sound)-1)/Fs]);&lt;br /&gt;end&lt;br /&gt;% SAWTOOTH&lt;br /&gt;if (strcmp(LFOwave, 'sawtooth'))&lt;br /&gt;   width = 0.9 % this defines where the max of the wave is situated in the interval between 0 and 2*pi&lt;br /&gt;   modSound = sawtooth(2*pi*OSCfreq*[0:1/Fs:(length(sound)-1)/Fs],width);&lt;br /&gt;end&lt;br /&gt;% TRIANGLE&lt;br /&gt;if (strcmp(LFOwave, 'triangle'))&lt;br /&gt;   %triangle wave (width = 0.5)&lt;br /&gt;   modSound = sawtooth(2*pi*OSCfreq*[0:1/Fs:(length(sound)-1)/Fs],0.5);&lt;br /&gt;end&lt;br /&gt;% SQUARE&lt;br /&gt;if (strcmp(LFOwave, 'square'))&lt;br /&gt;   modSound = square(2*pi*OSCfreq*[0:1/Fs:(length(sound)-1)/Fs]);&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;%wavplay(modSound, Fs); %for testing&lt;br /&gt;%sound(1:100)&lt;br /&gt;%modSound(1:100)&lt;br /&gt;%length(sound)&lt;br /&gt;%length(modSound)&lt;br /&gt;output = sound .* modSound';&lt;br /&gt;&lt;br /&gt;wavplay(output, Fs);&lt;br /&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;This effect is perceived as nice eg. when using a voice as input, sine or other wave as modulation and low frequencies (~50Hz)&lt;/li&gt;&lt;li&gt;I had some problems with the multiplication, but after trying it with small matrices I saw why:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I had to use a dot-product for elementwise multiplication .*&lt;/li&gt;&lt;li&gt;I had to have two columnmatrices or vectors. The modSound waves are on the contrary row matrices, so I had to transpose them: modSound'&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;OK, a warmup during 3 hours, typical...&lt;br /&gt;So now a little bite and then: pitch extraction!&lt;br /&gt;&lt;br /&gt;Hm, another two hours spent on surfing the internet and finding sites we could use. Look at the posts involved: &lt;a title="Links, just links" href="http://idafx.blogspot.com/2007/02/links-just-links.html"&gt;Links, just links&lt;/a&gt; &lt;span style="font-style: italic;"&gt;&lt;/span&gt;, &lt;a title="some links for beat extraction" href="http://idafx.blogspot.com/2007/02/some-links-for-beat-extraction.html"&gt;some links for beat extraction&lt;/a&gt;.&lt;br /&gt;Also I started &lt;a title="a post that will contain ideas we have during our work" href="http://idafx.blogspot.com/2007/02/ideas-just-ideas.html"&gt;a post that will contain ideas we have during our work&lt;/a&gt;. This way we have a leading trail when experimenting later on.&lt;br /&gt;OK, another try towards pitch detection.&lt;br /&gt;&lt;span style="color: rgb(0, 104, 28);"&gt; &lt;/span&gt;&lt;br /&gt;I'll talk about pages 336 and further in DAFX.&lt;br /&gt;Pitch extraction is the same as estimating the fundamental frequency f0 and then possible postprocessing like pitch tracking and taking into account frequency relationships.&lt;br /&gt;I'll be reading the interesting things and tomorrow I'll try the matlab code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-5320002578679731539?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/5320002578679731539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=5320002578679731539' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/5320002578679731539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/5320002578679731539'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/02/also-today-i-do-little-warming-up-id.html' title='matlab session on pitch detection, but more about ring modulator etc.'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-6856821794070844605</id><published>2007-02-22T15:16:00.000+01:00</published><updated>2007-02-27T22:49:09.139+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='links'/><title type='text'>Links, just links</title><content type='html'>&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cs.uvic.ca/%7Egtzan/work/publications.html"&gt;http://www.cs.uvic.ca/~gtzan/work/publications.html&lt;/a&gt;&lt;br /&gt;homepage and publications of george tzanetakis, main interest field &lt;span style="font-style: italic;"&gt;retrieval sytems for audio&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://140.134.132.124:8080/dspace/bitstream/2377/1900/1/ce07ics002004000200.pdf"&gt;Representative music fragments extraction by using segmentation techniques&lt;/a&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Melody extraction on polyphonic music using 'four measure based segmentation' and 'LBDM concatenation'&lt;br /&gt;Is used for music classification, but mainly MIDI files. It uses the knwledge of different tracks, where we have one track without knowing the different tracks apartly.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www-scf.usc.edu/%7Eise575/a/students/zali/zali-4.4.pdf"&gt;Human perception and computer extraction of musical beat strength&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://recherche.ircam.fr/equipes/repmus/RMPapers/CMMR-meudic2003.pdf"&gt;Musical pattern extraction: from repetition to musical structure&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.csl.sony.fr/downloads/papers/2002/ZilsMusic.pdf"&gt;Automatic drum track extraction from polyphonic music signals&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ieeexplore.ieee.org/iel5/9248/29346/01326805.pdf"&gt;Extraction of characteristic music textures (eigentextures) via graph spectra and eigenclusters&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ismir2006.ismir.net/PAPERS/ISMIR0684_Paper.pdf"&gt;Independent Component Analysis for music similarity computation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ccrma.stanford.edu/%7Epdelac/research/MyPublishedPapers/icmc_2001-pitch_best.pdf"&gt;Efficient pitch detection techniques for interactive music&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.csis.ul.ie/dafx01/proceedings/papers/marchand.pdf"&gt;An efficient pitch tracking algorithm using a combination of fourier transforms&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://aubio.piem.org/articles/brossier04realtimesegmentation.pdf"&gt;Real-time temporal segmentation of note objects in music signals&lt;/a&gt;&lt;br /&gt;real-time/ onset/ offset&lt;/li&gt;&lt;li&gt;&lt;a href="http://silvertone.princeton.edu/%7Epark/thesis/dartmouth/dartmouthMAThesis.pdf"&gt;Salient Feature Extraction of Musical Instrument Signals&lt;br /&gt;&lt;/a&gt;Thesis of a student of the princeton department music&lt;/li&gt;&lt;li&gt;&lt;a href="http://mti.xidian.edu.cn/multimedia/2001/supp/icassp2001/MAIN/papers/pap1075.pdf"&gt;Robust Singing Detection in Speech/Music Discriminator Design&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://perso.ec-lyon.fr/hadi.harb/files/HARBdms2001.pdf"&gt;Speech/Music/Silence and Gender Detection Algorithm&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-6856821794070844605?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/6856821794070844605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=6856821794070844605' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/6856821794070844605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/6856821794070844605'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/02/links-just-links.html' title='Links, just links'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-7754476773202160904</id><published>2007-02-22T14:42:00.000+01:00</published><updated>2007-02-27T13:23:20.178+01:00</updated><title type='text'>Ideas, just ideas</title><content type='html'>&lt;ol&gt;&lt;li&gt;detect when a song is being played or not and use this information to turn on and off the reverb on the singers' voice.&lt;br /&gt;At first I thought using the singers' mic as an input, but that's not enough. Practically the algorithm must know the difference between someone talking and someone singing. Is it enough to do this by detecting when music is playing? No, because when singing (parts) in a capella the reverb must remain switched on!&lt;br /&gt;see &lt;a href="http://ieeexplore.ieee.org/iel5/9248/29346/01326825.pdf"&gt;http://ieeexplore.ieee.org/iel5/9248/29346/01326825.pdf&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;detect the tempo of a song and use it as the delay time parameter of a delay effect.&lt;/li&gt;&lt;li&gt;detect the pitch/tone at which a singer is singing and (when switched on) automatically pull the pitch to the closest existing note. Practically this might only be useful for specific notes, those notes that are difficult for the singer to reach. For the rest it must be turned off, because the importance of a singer as an instrumentalist is that he can form notes between existing ones, and not to forget glissandos too.&lt;br /&gt;Might already exist: autotune (DAFX p336)&lt;/li&gt;&lt;li&gt;Another one that is metioned also in DAFX p336: detect amplitude and use it as a parameter for compression&lt;/li&gt;&lt;li&gt;detect no silence and let the compressor with high output gain only work then. This way when there is silence the noise will not have such a high gain and disturb the sound.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;maybe a compressor that only compresses the track in the frequency bands (or even as detailed as the pitch itself) it's currently playing. Wait, I thought of this as means to not make the noise problems worse in silent passages, but this doesn't change. Better idea: same idea but with a noise gate.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-7754476773202160904?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/7754476773202160904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=7754476773202160904' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/7754476773202160904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/7754476773202160904'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/02/ideas-just-ideas.html' title='Ideas, just ideas'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-6041881975562060539</id><published>2007-02-22T13:52:00.000+01:00</published><updated>2007-02-22T15:31:23.303+01:00</updated><title type='text'>some links for beat extraction</title><content type='html'>&lt;a href="http://www.fxpal.com/publications/FXPAL-PR-01-152.pdf"&gt;http://www.fxpal.com/publications/FXPAL-PR-01-152.pdf&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.fxpal.com/publications/FXPAL-PR-01-022.pdf"&gt;http://www.fxpal.com/publications/FXPAL-PR-01-022.pdf&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.csl.sony.fr/downloads/papers/2002/ZilsMusic.pdf"&gt;http://www.csl.sony.fr/downloads/papers/2002/ZilsMusic.pdf&lt;/a&gt; automatic extraction of drum signals from polyphonic music signals&lt;br /&gt;&lt;br /&gt;In a little chat with toon we talked about the problems so far with beat detection.&lt;br /&gt;A possible part of the solution is to append weight factors to the frequency bands, so that the most important band has the biggest weight. The question is how to calculate these factors. The best idea is to let them be calculated automatically, by means of correlation values or something for every band.&lt;br /&gt;Also we talked about bigger time windows, as in why don't we look for repeating riffs or measures. This might work better with more difficult pieces of music. This brought us to googling on "measure detection" and other stuff. But this is a &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;TODO&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;measure extraction music&lt;/span&gt;&lt;br /&gt;This particular search term discovers loads of interesting websites. This is done in the post: &lt;a href="http://idafx.blogspot.com/2007/02/links-just-links.html"&gt;Links, just links&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;another idea:&lt;br /&gt;why not use &lt;a href="http://idafx.blogspot.com/2007/02/links-just-links.html"&gt;ICA but for audio then&lt;/a&gt;, to extract independent components like a drum line?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-6041881975562060539?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/6041881975562060539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=6041881975562060539' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/6041881975562060539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/6041881975562060539'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/02/some-links-for-beat-extraction.html' title='some links for beat extraction'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-1402067659241441971</id><published>2007-02-21T18:59:00.000+01:00</published><updated>2007-02-21T19:01:24.121+01:00</updated><title type='text'>matlab session on pitch extraction</title><content type='html'>+tony, ronny+&lt;br&gt;&lt;br&gt;&lt;ol&gt;&lt;li&gt;I wanted to try another effect before starting with pitch detection algorithms. The one I chose was guitar distortion effect.&lt;br&gt; I stumbled upon a very good link: &lt;a title="www.musicdsp.org" href="http://www.musicdsp.org/"&gt;www.musicdsp.org&lt;br&gt;     &lt;/a&gt;There you can find an archive on analysis, effects and some more. It seems that most of the coding is done in C or C#. The distortion effect I tried here is translated to Matlab code.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt; &lt;/p&gt;&lt;blockquote&gt;function [x]=gdist(a,x)&lt;br&gt;%[Y] = GDIST(A, X) Guitar Distortion&lt;br&gt;%&lt;br&gt;%   GDIST creates a distortion effect like that of&lt;br&gt;%   an overdriven guitar amplifier. This is a Matlab &lt;br&gt;%   implementation of an algorithm that was found on &lt;br&gt;%   www.musicdsp.org.&lt;br&gt;%&lt;br&gt;%   A = The amount of distortion.  A&lt;br&gt;%       should be chosen so that -1&amp;lt;A&amp;lt;1.&lt;br&gt;%   X = Input.  Should be a column vector &lt;br&gt;%       between -1 and 1.&lt;br&gt;%&lt;br&gt;%coded by: Steve McGovern, date: 09.29.04&lt;br&gt;%URL: http://www.steve-m.us&lt;br&gt;[x,fs] = wavread(x);&lt;br&gt;k = 2*a/(1-a);&lt;br&gt;x = (1+k)*(x)./(1+k*abs(x));&lt;br&gt;wavplay(x,fs);&lt;br&gt;&lt;/blockquote&gt;        I also tried another one:&lt;br&gt; &lt;blockquote&gt;function [output]=fuzzy(sound, amount)&lt;br&gt; [sound,fs] = wavread(sound);&lt;br&gt; norms = norm(sound);&lt;br&gt; output = sound/norms;&lt;br&gt; amount = (1- amount)/100;&lt;br&gt; for i = 1:length(output)&lt;br&gt;   if ( output(i) &amp;gt; amount )&lt;br&gt;     output(i) = amount;&lt;br&gt;   end&lt;br&gt;   if ( output(i) &amp;lt; -amount)&lt;br&gt;      output(i) = -amount;&lt;br&gt;   end&lt;br&gt; end&lt;br&gt; output = output*norms;&lt;br&gt; wavplay(output,fs);&lt;br&gt; &lt;/blockquote&gt;         Both algorithms are to be found in my folder on ESAT (gdist.m and dist.m)&lt;br&gt;&lt;br&gt;&lt;ol&gt;&lt;li&gt;see above &lt;/li&gt;&lt;li&gt;I tried to catch a book which was referenced from an article I read (sorry, forgot which one). The book from &lt;span style="font-style: italic;"&gt;Roads &lt;/span&gt;is called &lt;span style="font-style: italic;"&gt;'the computer music tutorial'&lt;/span&gt;. It became a real quest to find it. I didn't yet succeed. I'll keep trying.&lt;/li&gt;&lt;li&gt;Order of the day. I'll experiment with pitch extraction: see the rest of this post&lt;/li&gt;&lt;/ol&gt;&lt;br&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;NARGIN; this is used as an indicator of number of input arguments: '&lt;span style="font-weight: bold;"&gt;N&lt;/span&gt;&lt;font size="1"&gt;umber&lt;/font&gt; &lt;span style="font-weight: bold;"&gt;ARG&lt;/span&gt;&lt;font size="1"&gt;uments&lt;/font&gt; &lt;span style="font-weight: bold;"&gt;IN&lt;/span&gt;'&lt;/li&gt;&lt;li&gt;Different methods:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Pitch determination and voice quality analysis using subharmonic-to-harmonic ratio (&lt;a title="http://www.ling.northwestern.edu/~jbp/sun/sun02pitch.pdf" href="http://www.ling.northwestern.edu/%7Ejbp/sun/sun02pitch.pdf"&gt;http://www.ling.northwestern.edu/~jbp/sun/sun02pitch.pdf&lt;/a&gt; )&lt;/li&gt;&lt;li&gt;Zero crossings&lt;/li&gt;&lt;li&gt;Autocorrelation&lt;/li&gt;&lt;li&gt;Maximum likelihood (time or frequency)&lt;br&gt;&lt;/li&gt;&lt;li&gt;Adaptive filter (more than one)&lt;/li&gt;&lt;li&gt;Super resolution pitch determination&lt;/li&gt;&lt;li&gt;Harmonic product spectrum&lt;/li&gt;&lt;li&gt;Cepstrum&lt;/li&gt;&lt;li&gt;Perceptual pitch detector (&lt;a title="http://www-ccrma.stanford.edu/%7Epdelac/154/m154paper.htm" href="http://www-ccrma.stanford.edu/%7Epdelac/154/m154paper.htm"&gt;http://www-ccrma.stanford.edu/%7Epdelac/154/m154paper.htm&lt;/a&gt; )&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Worked awhile on the PDA described in &lt;a title="another post" href="http://idafx.blogspot.com/2006/12/matlab-exchange-server-examples.html"&gt;another post&lt;/a&gt;. I don't really understand how to interpret the resulting output.&lt;br&gt;&lt;img style="height: 420px; width: 560px;" src="http://docs.google.com/File?id=df7z8b86_23ft2f83"&gt;&lt;img style="height: 420px; width: 560px;" src="http://docs.google.com/File?id=df7z8b86_24d6tf6w"&gt;&lt;br&gt;This is two times the result f0_values (resp of x2.wav and x1.wav from my thesis folder on ESAT). I have no idea how to interpret it... &lt;span style="color: rgb(51, 204, 0); font-weight: bold;"&gt;help me&lt;/span&gt;?&lt;/li&gt;&lt;li&gt;Some other links on pitch detection:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a title="http://ccrma.stanford.edu/~eberdahl/Projects/Grundfrequenzanalyse/index.html" href="http://ccrma.stanford.edu/%7Eeberdahl/Projects/Grundfrequenzanalyse/index.html"&gt;http://ccrma.stanford.edu/~eberdahl/Projects/Grundfrequenzanalyse/index.html&lt;/a&gt; (contains on the first sight a &lt;a title="http://ccrma.stanford.edu/~eberdahl/Projects/Grundfrequenzanalyse/endbericht.pdf" href="http://ccrma.stanford.edu/%7Eeberdahl/Projects/Grundfrequenzanalyse/endbericht.pdf"&gt;very good tutorial in german&lt;/a&gt; )&lt;br&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="http://www.dsprelated.com/showmessage/35165/1.php" href="http://www.dsprelated.com/showmessage/35165/1.php"&gt;http://www.dsprelated.com/showmessage/35165/1.php&lt;/a&gt; (a discussion on pitch detection for singing voices)&lt;/li&gt;&lt;li&gt;&lt;a title="http://cnx.org/content/m11716/latest/" href="http://cnx.org/content/m11716/latest/"&gt;http://cnx.org/content/m11716/latest/&lt;/a&gt; (m-files on autocorrelation and HPS method)&lt;/li&gt;&lt;li&gt;&lt;a title="http://www.soundmathtech.com/pitch/download/terez_icassp02.pdf" href="http://www.soundmathtech.com/pitch/download/terez_icassp02.pdf"&gt;http://www.soundmathtech.com/pitch/download/terez_icassp02.pdf&lt;/a&gt; (robust pitch determination using non-linear state-space embedding)&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;I was hoping to be able to try out some m-files. I even did try the one called fastauto.m, but again I didn't understand the results. More on these tomorrow!&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-1402067659241441971?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/1402067659241441971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=1402067659241441971' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1402067659241441971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1402067659241441971'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/02/matlab-session-on-pitch-extraction.html' title='matlab session on pitch extraction'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-8092201909674081542</id><published>2007-02-21T18:24:00.000+01:00</published><updated>2007-02-21T19:02:05.710+01:00</updated><title type='text'>matlab session on beat detection</title><content type='html'>vandaag beat detection algorithm&lt;br&gt;&lt;br&gt;enkele interessante links:&lt;br&gt;http://www.owlnet.rice.edu/~elec301/Projects01/beat_sync/beatalgo.html&lt;br&gt;http://homes.esat.kuleuven.be/~tvanwate/alari/projects/beat_detection/scheirer98.pdf&lt;br&gt;&lt;br&gt;uitleg bij termen:&lt;br&gt;    - wave rectifyers&lt;br&gt;      http://en.wikipedia.org/wiki/Rectifier&lt;br&gt;&lt;br&gt;filterbank.m:&lt;br&gt;    - bl(i) = floor(bandlimits(i)/maxfreq*n/2)+1;&lt;br&gt;    hierin is bandlimit(i)/maxfreq schaalfactor voor uw samples van uw FT&lt;br&gt;    - nog eens nagaan wat juist nen DFT doet &lt;br&gt;    zet n samples om naar n samples (op welke manier stellen die laatste&lt;br&gt;    samples dan het frequentie domein voor ??---&amp;gt; avond lectuur)&lt;br&gt;&lt;br&gt;andere m-files gewoon uitgevoerd:&lt;br&gt;&lt;br&gt;de 4 stappen die worden toegepast zijn wel duidelijk &lt;br&gt;echter algoritme moet wat uitgediept worden...&lt;br&gt;&lt;br&gt;eens uitgetest op hiphop schijf, kwam niet echt iets deftig uit&lt;br&gt;volgende keer eens uittesten met verschillende house schijven&lt;br&gt;beat zou dan gemakkelijker moeten kunnen gedetecteerd worden&lt;br&gt;&lt;br&gt;conclusie: blijkt wel te werken &lt;br&gt;              algoritme nog niet volledig door  --&amp;gt; nog eens verdiepen&lt;br&gt;              volgende stap uittesten om te zien of hij relatieve verschillen goe vastlegt&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-8092201909674081542?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/8092201909674081542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=8092201909674081542' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/8092201909674081542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/8092201909674081542'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/02/vandaag-beat-detection-algorithm-enkele.html' title='matlab session on beat detection'/><author><name>tony</name><uri>http://www.blogger.com/profile/05311149308629939532</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-8726638732998059039</id><published>2007-02-20T15:44:00.000+01:00</published><updated>2007-02-20T17:20:54.108+01:00</updated><title type='text'>matlab session on feature extraction</title><content type='html'>A short list of several feature extraction methods for audio:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;pitch tracking (dafx p.477)&lt;br /&gt;(&lt;br /&gt;&lt;a onclick="return top.js.OpenExtLink(window,event,this)" href="http://cnx.org/content/m11714/latest/" target="_blank"&gt;http://cnx.org/content/m11714&lt;wbr&gt;/latest/&lt;/a&gt;&lt;br /&gt;&lt;a onclick="return top.js.OpenExtLink(window,event,this)" href="http://www-ccrma.stanford.edu/%7Epdelac/154/m154paper.htm" target="_blank"&gt;http://www-ccrma.stanford.edu/&lt;wbr&gt;~pdelac/154/m154paper.htm&lt;br /&gt;&lt;/a&gt;audio to midi convertion&lt;br /&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;amplitude tracking (dafx p.477)&lt;/li&gt;&lt;li&gt;centroid tracking (dafx p.477)&lt;/li&gt;&lt;li&gt;voice/silence tracking (dafx p.477)&lt;/li&gt;&lt;li&gt;voiced/unvoiced tracking (dafx p.477)&lt;/li&gt;&lt;li&gt;partial tracking (dafx p.477)&lt;/li&gt;&lt;li&gt;rhythm tracking (dafx p.477) / beat / tempo&lt;br /&gt;(&lt;br /&gt;&lt;a onclick="return top.js.OpenExtLink(window,event,this)" href="http://www.owlnet.rice.edu/%7Eelec301/Projects01/beat_sync/beatalgo.html" target="_blank"&gt;http://www.owlnet.rice.edu/&lt;wbr&gt;~elec301/Projects01/beat_sync&lt;wbr&gt;/beatalgo.html&lt;/a&gt;&lt;br /&gt;&lt;a onclick="return top.js.OpenExtLink(window,event,this)" href="http://homes.esat.kuleuven.be/%7Etvanwate/alari/projects/beat_detection/scheirer98.pdf" target="_blank"&gt;http://homes.esat.kuleuven.be/&lt;wbr&gt;~tvanwate/alari/projects/beat&lt;wbr&gt;_detection/scheirer98.pdf&lt;br /&gt;&lt;/a&gt;&lt;a href="http://www.cs.uvic.ca/%7Egtzan/work/talks/job/jobtalk.ppt"&gt;&lt;span style=""&gt;&lt;span class="a"&gt;http://www.cs.uvic.ca/~gtzan/work/talks/job/jobtalk.ppt&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;&lt;span class="a"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;timbral texture feature tracking (music genre recognition by tony)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-8726638732998059039?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/8726638732998059039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=8726638732998059039' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/8726638732998059039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/8726638732998059039'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/02/matlab-session-on-feature-extraction.html' title='matlab session on feature extraction'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-4552923420589951688</id><published>2007-02-20T15:20:00.000+01:00</published><updated>2007-02-20T15:39:06.553+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='esat'/><category scheme='http://www.blogger.com/atom/ns#' term='update'/><title type='text'>Weekly meeting</title><content type='html'>We agreed on many ideas: after experimenting with effects in matlab, we should now start doing matlab on extraction of features in audio. That is what we're going to do first. Then the next step would be to connect extraction features with effects. All this might be done in matlab first.&lt;br /&gt;Of course we really want this to be done in real time (not only to do easy testing, but also for client purposes) and modular.&lt;br /&gt;If we could make standard effect blocks and standard extraction blocks in simulink that would be nice. Simulink might indeed be the best next step after matlab, eg to test in realtime (although this might require some reprogramming of the m-functions).&lt;br /&gt;We also talked about the idea to turn everything in VST plugins or direct X plugins as a final step, but we might lack time for that.&lt;br /&gt;TODO: Our promotor M. Moonen would like us to do an intermediate presentation. Here we might explain some theoretical issues about effects and extraction algorithms we already tried and also we can explain our project status and the next steps towards our goal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-4552923420589951688?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/4552923420589951688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=4552923420589951688' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/4552923420589951688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/4552923420589951688'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/02/weekly-meeting.html' title='Weekly meeting'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-6507886522015196310</id><published>2007-02-13T15:35:00.000+01:00</published><updated>2007-02-20T15:44:15.563+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='esat'/><category scheme='http://www.blogger.com/atom/ns#' term='update'/><title type='text'>warming up session 2007</title><content type='html'>Exams finished, vacation finished. As for me, I'm almost healthy again.&lt;br /&gt;Today Tony and I met to set things straigth and restart our discovery.&lt;br /&gt;Our plan for the nearby future:&lt;br /&gt;This week we will finish the basic literaturestudy (as in, we will read the DAFX book and surf across the internet a lot)&lt;br /&gt;So next week we can start trying out some feature extraction methods (as we already did with effects)&lt;br /&gt;&lt;br /&gt;On monday 19 feb we hope to meet with our assistants.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-6507886522015196310?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/6507886522015196310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=6507886522015196310' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/6507886522015196310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/6507886522015196310'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2007/02/aanhaalsessie-2007.html' title='warming up session 2007'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-6524483425034039121</id><published>2006-12-13T11:11:00.000+01:00</published><updated>2006-12-13T12:01:29.258+01:00</updated><title type='text'>Matlab exchange server examples</title><content type='html'>&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;sound_acquisition.m&lt;/span&gt; It reads in a number of seconds of audio from your computers soundcard and it is easy to change the duration, samplefrequency and soundcard.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;pitch determination algorithm (.zip) &lt;/span&gt;This zip-file contains a few files: the algorithm itself and some post-processing things.&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;The input Y specified here is not a wave file but the vector. I wrote the wavread component inte the m-file.&lt;/li&gt;&lt;li&gt;If you specify the input and the samplefrequency, it's enough.&lt;/li&gt;&lt;li&gt;The algorithm works but &lt;span style="color: rgb(51, 204, 0);"&gt;I don't really understand the outcome&lt;/span&gt;.&lt;br /&gt;&lt;blockquote&gt;%   Input parameters (There are 9):&lt;br /&gt;%&lt;br /&gt;%       Y:              Input data&lt;br /&gt;%       Fs:             Sampling frequency (e.g., 16000 Hz)&lt;br /&gt;%       F0MinMax:       2-d array specifies the F0 range. [minf0 maxf0], default: [50 550]&lt;br /&gt;%                       Quick solutions:&lt;br /&gt;%                       For male speech: [50 250]&lt;br /&gt;%                       For female speech: [120 400]&lt;br /&gt;%       frame_length:   length of each frame in millisecond (default: 40 ms)&lt;br /&gt;%       TimeStep:       Interval for updating short-term analysis in millisecond (default: 10 ms)&lt;br /&gt;%       SHR_Threshold:  Subharmonic-to-harmonic ratio threshold in the range of [0,1] (default: 0.4).&lt;br /&gt;%                       If the estimated SHR is greater than the threshold, the subharmonic is regarded as F0 candidate,&lt;br /&gt;%                       Otherwise, the harmonic is favored.&lt;br /&gt;%       Ceiling:        Upper bound of the frequencies that are used for estimating pitch. (default: 1250 Hz)    &lt;br /&gt;%       med_smooth:     the order of the median smoothing (default: 0 - no smoothing);                    &lt;br /&gt;%       CHECK_VOICING:  check voicing. Current voicing determination algorithm is kind of crude.&lt;br /&gt;%                       0: no voicing checking (default)&lt;br /&gt;%                       1: voicing checking&lt;br /&gt;%   Output parameters:&lt;br /&gt;%    &lt;br /&gt;%       f0_time:        an array stores the times for the F0 points&lt;br /&gt;%       f0_value:       an array stores F0 values&lt;br /&gt;%       SHR:            an array stores subharmonic-to-harmonic ratio for each frame&lt;br /&gt;%        f0_candidates:  a matrix stores the f0 candidates for each frames, currently two f0 values generated for each frame.&lt;br /&gt;%                        Each row (a frame) contains two values in increasing order, i.e., [low_f0 higher_f0].&lt;br /&gt;%                        For SHR=0, the first f0 is 0. The purpose of this is that when you want to test different SHR&lt;br /&gt;%                        thresholds, you don't need to re-run the whole algorithm. You can choose to select the lower or higher&lt;br /&gt;%                        value based on the shr value of this frame.&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;I think some nice functions in our field are found in the m-file (bottom to top): &lt;span style="font-style: italic;"&gt;generate a window function, compute zero-crossing rate, post voicing checking, split signal into frames, determine the energy treshold of silence, determine whether the segment is voiced, unvoiced or silence, compute subharmonic-to-harmonic ratio, do FFT and get log spectrum&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;AGC.m &lt;/span&gt;An automatic gain control script, might be interesting for all the tests it does on the input signal and because it can process both mono and stereo inputs. If we ever need gain, power or energy commands, here's the place to look first for.&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-6524483425034039121?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/6524483425034039121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=6524483425034039121' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/6524483425034039121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/6524483425034039121'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2006/12/matlab-exchange-server-examples.html' title='Matlab exchange server examples'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-5059621993758258135</id><published>2006-12-09T12:39:00.000+01:00</published><updated>2006-12-14T12:48:27.040+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='matlab'/><category scheme='http://www.blogger.com/atom/ns#' term='home'/><title type='text'>unicomb, vibrato, wisperization</title><content type='html'>1) unicomb testing for toms_diner.wav&lt;br /&gt;&lt;ul&gt;&lt;li&gt;calculations much too long... must be done something about it.&lt;/li&gt;&lt;li&gt;after 20 minutes he did it...&lt;/li&gt;&lt;li&gt;works, but veeerrry slowly&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;2) trying to make vibrato work&lt;br /&gt;&lt;ul&gt;&lt;li&gt;too long in time&lt;/li&gt;&lt;li&gt;bad parameterchoice&lt;/li&gt;&lt;li&gt;now OK&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;3) testing of wisperization&lt;br /&gt;&lt;ul&gt;&lt;li&gt;book is not here, so I'm just fooling around a bit&lt;/li&gt;&lt;li&gt;effect is clearly audible, but somewhat too harsh&lt;/li&gt;&lt;li&gt;experiment a little with the parameters and turn the m-file in one where you can give the wav-file to.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-5059621993758258135?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/5059621993758258135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=5059621993758258135' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/5059621993758258135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/5059621993758258135'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2006/12/unicomb-vibrato-wisperization.html' title='unicomb, vibrato, wisperization'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-1606190733528005735</id><published>2006-12-06T14:24:00.000+01:00</published><updated>2006-12-13T10:54:39.934+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='matlab'/><title type='text'>matlabsession ronny and tony</title><content type='html'>Today we try to implement some effects. Some notes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Instead of wavplay() you can also use sound(vector,sampleFrequency), it does fairly the same. Also stereo if the matrix is Nx2. soundsc() even plays the sound at the maximum amplitude without clipping.&lt;br /&gt;With wavrecord() one can record wave audio from the windows wave input device.&lt;/li&gt;&lt;li&gt;When using wavread and wavplay and others, pay attention to play at the same sample frequency as read. Otherwise the sound will mostly play as if it passed through an lowpass filter, because the standard Fs = 11025Hz&lt;/li&gt;&lt;li&gt;Ctrl+C is used to terminate a calculation.&lt;/li&gt;&lt;li&gt;switch/case statement can be used in matlab too&lt;/li&gt;&lt;li&gt;m-files can make use of cells to make the overview clearer&lt;/li&gt;&lt;/ul&gt;I tried implementing a flanger effect I found on the mathworks exchange server. Herefore I made a function that I can use throughout our quest for cool effects:&lt;br /&gt;function[] = applyEffect(effectFile,soundFile)&lt;br /&gt;Example: applyEffect('flange','x1.wav');&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;&lt;&lt; soundfile =" 'redwheel.wav';" effectfile =" '';" variation =" .01;" rate =" .3;" outputsignal =" flange(inputSignal," outputsignal =" signal;"&gt;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;This works well. I tried it with flange and after experimenting with the parameters variation and rate it worked nice enough.&lt;br /&gt;Now I'm trying to understand every line of flange.m for future use... Some notes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;: Colon.&lt;br /&gt;J:K is the same as [J, J+1, ..., K]&lt;/li&gt;&lt;li&gt;CEIL(X) rounds the elements of X to the nearest integers&lt;br /&gt;towards infinity.&lt;/li&gt;&lt;li&gt;ROUND(X) rounds the elements of X to the nearest integers.&lt;/li&gt;&lt;li&gt;and thus:&lt;span style="font-style: italic; color: rgb(204, 204, 204);font-size:78%;" &gt; CEIL(X) &lt;= ROUND(X) &lt;/span&gt; &lt;span style="font-weight: bold;"&gt;CEIL(X) &gt;= ROUND(X) &gt;= FLOOR(X)&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&gt;&gt; abs([1 2 3;4 5 6;7 8 -9])&lt;br /&gt;ans = 1 2 3&lt;br /&gt;4 5 6&lt;br /&gt;7 8 9&lt;/li&gt;&lt;li&gt;.* Array multiply.&lt;br /&gt;X.*Y denotes element-by-element multiplication. X and Y&lt;br /&gt;must have the same dimensions unless one is a scalar.&lt;/li&gt;&lt;/ul&gt;I almost succeeded understanding the whole m-file about flange. Got stuck with this line:&lt;br /&gt;signal = signal(cosineSamples+modulation-lfo);&lt;br /&gt;signal is a column vector and between the brackets there is a row vector,&lt;span style="font-weight: bold; color: rgb(51, 204, 0);"&gt; what could this mean then&lt;/span&gt;?&lt;br /&gt;&lt;br /&gt;I include the flange.m file in the version of today:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;function [signal]=flange(signal, sampleFrequency, variation, rate)&lt;br /&gt;%[y] = flange(fs, v, x, r)&lt;br /&gt;%&lt;br /&gt;% This is a basic flanging effect.&lt;br /&gt;%&lt;br /&gt;% fs = Sample rate&lt;br /&gt;% v = Variation.&lt;br /&gt;% x = Input audio signal. This should be a column&lt;br /&gt;% vector.&lt;br /&gt;% r = Rate.&lt;br /&gt;%&lt;br /&gt;% Example:&lt;br /&gt;%&lt;br /&gt;% &gt;&gt;y = flange(fs,0.002,x,0.5);&lt;br /&gt;%&lt;br /&gt;%&lt;br /&gt;% See also WAVREAD and SOUND&lt;br /&gt;%&lt;br /&gt;%Version 1.0&lt;br /&gt;%Coded by: Stephen G. McGovern, date: 08.03.03&lt;br /&gt;&lt;br /&gt;modulation = ceil(variation*sampleFrequency);&lt;br /&gt;%a row containing a raising value per sample of the signal&lt;br /&gt;cosineSamples = 1:length(signal)+ modulation;&lt;br /&gt;variation = round(variation*sampleFrequency);&lt;br /&gt;padding = zeros(modulation,1);&lt;br /&gt;%maxSample is the biggest amplitude of the vector or matrix signal&lt;br /&gt;maxSample = max(abs(signal))&lt;br /&gt;signal = [padding;signal;padding];&lt;br /&gt;%period in seconds&lt;br /&gt;period = 2*pi/round(sampleFrequency*rate);&lt;br /&gt;%approximates a cosine which variates about variation/2 as an LFO&lt;br /&gt;lfo = round((variation/2)*(1-cos(period.*cosineSamples)));&lt;br /&gt;%chooses the samples indicated by the vector &lt;/span&gt;&lt;span style="font-size:85%;"&gt;cosineSamples+modulation-lfo, from signal&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;signal = signal(cosineSamples+modulation-lfo);&lt;br /&gt;maxSample = maxSample/max(abs(signal));&lt;br /&gt;signal = maxSample*signal;&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-1606190733528005735?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/1606190733528005735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=1606190733528005735' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1606190733528005735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1606190733528005735'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2006/12/matlabsession-toon-and-tony.html' title='matlabsession ronny and tony'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-2907962571379140491</id><published>2006-12-06T12:25:00.000+01:00</published><updated>2006-12-14T12:38:14.003+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='matlab'/><title type='text'>unicomb / delay / vibrato</title><content type='html'>1) unicomb filter 'all pass' mode implemented&lt;br /&gt;&lt;ul&gt;&lt;li&gt;calculations too long; &lt;span style="color: rgb(51, 204, 0);"&gt;why?&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;spectrogram plot: search/make something decent&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;watch out with commands &lt;span style="font-style: italic;"&gt;wavread &lt;/span&gt;and  &lt;span style="font-style: italic;"&gt;wavwrite&lt;/span&gt; --&gt; you have to give the right sampling frequency, otherwise your sound is totally distorted, while it's not the fault of your algorithm&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; we worked on a vibrato, nut didn't succeed; maybe just because previous point :( --&gt; we should try it again !!&lt;/li&gt;&lt;/ul&gt;2) to implement delay mode&lt;br /&gt;&lt;ul&gt;&lt;li&gt;problems with calculation time... not able to use it because of duration/ &lt;span style="color: rgb(51, 204, 0);"&gt;why?&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;a delay with parameters M=20000 so approx. 0.5 seconds results in no sound when using La.wav (it's own duration is also 0.5sec) This is because everything falls outside the window then. But do you have to sum the original signal with this one? Because it seems that this is already done in the figure (DAFX ch3). --&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;We must sum&lt;/span&gt;, it is NOT done in the picture&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;3) vibrato&lt;br /&gt;&lt;ul&gt;&lt;li&gt;same problem: too long ! frustrating !&lt;/li&gt;&lt;li&gt;ok, it was because of the parameterchoice... shorter, but still not short enough.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-2907962571379140491?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/2907962571379140491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=2907962571379140491' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/2907962571379140491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/2907962571379140491'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2006/12/unicomb-delay-vibrato.html' title='unicomb / delay / vibrato'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-7609375048229398974</id><published>2006-12-05T17:44:00.000+01:00</published><updated>2006-12-05T17:55:21.734+01:00</updated><title type='text'>spectrogram function by Evan Ruzanski</title><content type='html'>function spectrogram(x,fs,bw)&lt;br /&gt;% Plot grayscale spectrogram with variable sampling rate and bandwidth&lt;br /&gt;% Evan Ruzanski, ECE259, 2/26/2003&lt;br /&gt;&lt;br /&gt;% Set &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;minimum FFT length&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;fftmin&lt;/span&gt; = 256;&lt;br /&gt;&lt;br /&gt;% Set 2*fs/bw &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;variable window length&lt;/span&gt; for good resolution  with long block length&lt;br /&gt;% will provide higher frequency resolution as main-lobe of the window&lt;br /&gt;% function will be narrow and short block length will provide higher time&lt;br /&gt;% resolution as less averaging across samples is performed for each&lt;br /&gt;% STFT value&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;winlen&lt;/span&gt; = floor(2*fs/bw);&lt;br /&gt;&lt;br /&gt;% Get &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;FFT length&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;fftlen&lt;/span&gt; = max([winlen fftmin]);&lt;br /&gt;&lt;br /&gt;% Create &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;window&lt;/span&gt; (Hamming for favorable sidelobe attenuation) and zero pad accordingly&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;win&lt;/span&gt; = [hamming(winlen) ; zeros(fftlen-winlen,1)];&lt;br /&gt;win = win/sum(win); &lt;span style="color: rgb(51, 204, 0); font-style: italic;"&gt;%normalizing?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;windel&lt;/span&gt; =  (0:(length(win)-1)) * win;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;??&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;hmm from hereon I loose it... someone?&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;% Set overlap (Effects expansion of spectrogram display as no overlap plots&lt;br /&gt;% fftlen data points and maximum overlap gives 1 data point) &lt;span style="color: rgb(51, 204, 0); font-style: italic;"&gt;?? This I don't understand?&lt;/span&gt;&lt;br /&gt;ntime = 500; % Choose based on trial-and-error for best looking plot&lt;br /&gt;overlap = floor(max(fftlen/2, (ntime*fftlen-length(x))/(ntime-1)));&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;ntime &lt;/span&gt;= floor((length(x)-overlap)/(fftlen-overlap));&lt;br /&gt;&lt;br /&gt;% Create arrays&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;c1&lt;/span&gt;=(1:fftlen)';&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;r1&lt;/span&gt;=(0:ntime-1)*(fftlen-overlap);&lt;br /&gt;&lt;br /&gt;% Take FFT of real data&lt;br /&gt;b = fft(x(c1(:,ones(1,ntime))+r1(ones(fftlen,1),:)).*win(:,ones(1,ntime)));&lt;br /&gt;if size(b,1) == 1&lt;br /&gt;    m = length(b1);&lt;br /&gt;    b(floor((m+4)/2):m) = [];&lt;br /&gt;else&lt;br /&gt;    m=size(b,1);&lt;br /&gt;    b(floor((m+4)/2):m,:) = [];&lt;br /&gt;end&lt;br /&gt;b = b.*conj(b);&lt;br /&gt;&lt;br /&gt;% Setup pixel locations for plot on frequency axis and time axis&lt;br /&gt;f=(0:fftlen/2)*fs/fftlen; % Point spacing&lt;br /&gt;t = (r1+windel)/fs;&lt;br /&gt;&lt;br /&gt;% Set limit for dB scale&lt;br /&gt;lim = max(b(:))*0.0001;&lt;br /&gt;&lt;br /&gt;% Set dB scale&lt;br /&gt;b=2.5*log10(max(b,lim));&lt;br /&gt;&lt;br /&gt;% Plot&lt;br /&gt;imh = imagesc(t,f/1000,b);&lt;br /&gt;&lt;br /&gt;% Set up axis and labels for plot&lt;br /&gt;axis('xy');&lt;br /&gt;title('Spectrogram');&lt;br /&gt;xlabel('Time (s)');&lt;br /&gt;ylabel('Frequency (kHz)');&lt;br /&gt;&lt;br /&gt;% Set and apply grayscale levels&lt;br /&gt;colormap(gray);&lt;br /&gt;map2 = colormap;&lt;br /&gt;map2 = 1 - map2;&lt;br /&gt;colormap(map2);&lt;br /&gt;colorbar; % Applies color legend to plot&lt;br /&gt;orient landscape;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-7609375048229398974?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/7609375048229398974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=7609375048229398974' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/7609375048229398974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/7609375048229398974'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2006/12/spectrogram-function-by-evan-ruzanski.html' title='spectrogram function by Evan Ruzanski'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-6954180235923494192</id><published>2006-12-05T16:04:00.000+01:00</published><updated>2006-12-05T17:44:50.737+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='esat'/><category scheme='http://www.blogger.com/atom/ns#' term='matlab'/><title type='text'>matlab session on my own</title><content type='html'>To login to ESAT from a remote computer I use Filezilla:&lt;br /&gt;host: login.esat.kuleuven.be&lt;br /&gt;port: 22&lt;br /&gt;servertype: SFTP using SSH2&lt;br /&gt;user: rvandenb&lt;br /&gt;Here I hold the folder 'Thesis', where all the documents are placed.&lt;br /&gt;&lt;br /&gt;To give labels to axes:&lt;br /&gt;      xlabel('Time');&lt;br /&gt;      ylabel('Frequency (Hz)');&lt;br /&gt;I tried understanding the command spectrogram, but...&lt;br /&gt;Even the chirp example given by matlab I don't understand. I now try searching google on it.&lt;br /&gt;&lt;br /&gt;Found an at first sight, very exciting URL: &lt;a href="http://www.nd.edu/%7Enkottens/"&gt;http://www.nd.edu/~nkottens/&lt;/a&gt;&lt;br /&gt;Some other m-files about &lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a href="http://www.mathworks.com/matlabcentral/fileexchange/loadCategory.do?objectId=78&amp;objectType=category"&gt;&lt;/a&gt;audio on the &lt;a href="http://www.mathworks.com/matlabcentral/fileexchange/loadCategory.do?objectId=78&amp;amp;objectType=category"&gt;mathworks file-exchange&lt;/a&gt; also with some effects!&lt;br /&gt;&lt;br /&gt;There is a spectrogram function on this site with better visual effect.&lt;br /&gt;I'll study this one in another post&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-6954180235923494192?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/6954180235923494192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=6954180235923494192' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/6954180235923494192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/6954180235923494192'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2006/12/matlab-session-on-my-own.html' title='matlab session on my own'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-3351980253734375540</id><published>2006-12-05T15:51:00.000+01:00</published><updated>2006-12-06T15:47:14.013+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='update'/><title type='text'>weekly update and some matlab 5nov2006</title><content type='html'>Just before the first weekly update since like a month, I worked a little bit on matlab.&lt;br /&gt;I tried making a simple m-file which does all kinds of standard stuff for audio processing. Load a file, play a file, view the plot and spectrogram.&lt;br /&gt;Some points of attention:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;subplot(numberOfRows, numberOfColumns, indexOfPlot)&lt;br /&gt;after that, comma-separated, you specify the  plot (plot(), stem(),...)&lt;br /&gt;and then several things you like, like: title(''), ...&lt;br /&gt;indexOfPlot counts from left-to-right and top-to-bottom.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;wavread:&lt;br /&gt;[soundFile,sampleFrequency] = wavread('La.wav');&lt;br /&gt;soundFile is a vector with all the samples (values between -1 and 1). If you want to see only the first n bits, you add n after the filename at the RHS of the equation. To see the vector you omit the point comma.&lt;br /&gt;sampleFrequency in Hertz&lt;br /&gt;You also can specify the number of bits used to encode every sample (Quantisation), therefore you add 'NBits' after 'sampleFrequency'&lt;/li&gt;&lt;li&gt;Supports multi-channel data, with up to 32 bits per sample.&lt;/li&gt;&lt;li&gt;This file reader only supports Microsoft PCM data format.&lt;/li&gt;&lt;li&gt;Also auread is possible&lt;/li&gt;&lt;li&gt;To control the axes of the plot a website previously specified uses: axis('tight')&lt;br /&gt;This sets the limit of the axes to the range of data. I think that the y-axis is too tight then, so I put it on auto (still quite tight though). &lt;span style="color: rgb(51, 204, 0);"&gt;What I search for is a command to set only the y-axis (to -1, 1)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;I think it's best to always add 'clear all;' in the beginning of an m-file.&lt;/li&gt;&lt;li&gt;The website still used specgram, but matlab prefers spectrogram now.&lt;br /&gt;I will study this soon.&lt;/li&gt;&lt;/ul&gt;Then the update with toon and tony.&lt;br /&gt;We really should start implementing some effects in matlab. When encountering problems we don't have to bother disturbing toon.&lt;br /&gt;We talked a bit about simulink/matlab/...  According to toon best is to implement in matlab. He thinks there's no way to implement realtime functions in matlab (although he heard that in a newer version of matlab there'd be a possibility to do exactly so). The normal procedure would be to translate the matlab code to C or JAVA.&lt;br /&gt;More wasn't really said I think. Before the exams we must really try to implement some effects and get used to the matlab environment.&lt;br /&gt;We also can start searching for articles on audio feature extraction.&lt;br /&gt;That's all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-3351980253734375540?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/3351980253734375540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=3351980253734375540' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/3351980253734375540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/3351980253734375540'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2006/12/weekly-update-and-some-matlab.html' title='weekly update and some matlab 5nov2006'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-1888944865588578507</id><published>2006-12-01T13:12:00.000+01:00</published><updated>2006-12-01T13:36:47.313+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='matlab'/><title type='text'>Problems and questions encountered when working with matlab</title><content type='html'>I'm doing a matlab session today and it clearly needs a warm-up.&lt;br /&gt;In almost every m-file I try from the book DAFX, I either don't fully understand it, either it gives errors, either I don't see how it can be used with an audio fragment.&lt;br /&gt;A short google search on "matlab commands functions for digital audio" gives me a few interesting looking URL's:&lt;br /&gt;&lt;a href="http://ccrma.stanford.edu/%7Ejos/filters/Matlab_Utilities.html"&gt;http://ccrma.stanford.edu/~jos/filters/Matlab_Utilities.html&lt;/a&gt;&lt;br /&gt;and further on "audio in matlab":&lt;br /&gt;&lt;a href="http://labrosa.ee.columbia.edu/matlab/"&gt;matlab audio processing examples&lt;/a&gt;&lt;br /&gt;&lt;a href="http://vise.www.ecn.purdue.edu/VISE/ee438L/matlab/help/pdf/audio.pdf"&gt;http://vise.www.ecn.purdue.edu/VISE/ee438L/matlab/help/pdf/audio.pdf&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.aquaphoenix.com/lecture/matlab10/page4.html"&gt;audio processing&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Some questions I have:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;How do you allow figures to be in one window? And with a title...&lt;/li&gt;&lt;li&gt;What must you do when a function used in an example m-file of the book DAFX isn't recognized by matlab? (like CreateNewTrack)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-1888944865588578507?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/1888944865588578507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=1888944865588578507' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1888944865588578507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1888944865588578507'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2006/12/problems-and-questions-encountered-when.html' title='Problems and questions encountered when working with matlab'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-1093591905072163038</id><published>2006-11-09T10:26:00.000+01:00</published><updated>2006-11-09T10:30:58.594+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='update'/><title type='text'>weekly meeting thursday 9nov2006</title><content type='html'>I met Sam, the other two were not present.&lt;br /&gt;I read the chapter about nonlinear processing techniques and finally succeeded installing matlab (after download in hetdepot and problems with the image processing toolbar which I then didn't install)&lt;br /&gt;Next (this afternoon) we will start implementing a delay effect (or so) in matlab. Sam and me talked about simulink and matlab and we'll begin implementing in both languages. To see which one will fit best. For realtime simulink is easier, but maybe this must be a problem for later on.&lt;br /&gt;Next meeting on next thursday two o'clock PM.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-1093591905072163038?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/1093591905072163038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=1093591905072163038' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1093591905072163038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/1093591905072163038'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2006/11/weekly-meeting-thursday-9nov2006.html' title='weekly meeting thursday 9nov2006'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-5871298498233110412</id><published>2006-11-02T11:36:00.000+01:00</published><updated>2006-11-02T11:47:24.915+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='update'/><title type='text'>weekly meeting tuesday 31oct2006</title><content type='html'>I read through chapters 1 to 5 in DAFX.  I was also making a list of possible effects and their possible parameters.  This was an extensive job leading to the understanding that you can keep on inventing parameters for effects.&lt;br /&gt;We assume that an effect algorithm starts with the basic effect and its parameters and after that you can make it more complex and add parameters.  We thought that it might be better to start implementing effects right away starting with the basics and then experimenting with its parameters and adding parameters on the fly.  The same with extraction algorithms.  This instead of reading about them and then looking after the possibilities, because this might leave some possibilities unsought.&lt;br /&gt;Also we will start searching search engines looking for articles about our subject.&lt;br /&gt;&lt;br /&gt;http://scholar.google.com/&lt;br /&gt;Google Scholar (niet specifiek voor audio, maar&lt;br /&gt;wel zowat de beste zoekmachine die er is voor wetenschappelijke&lt;br /&gt;publicaties)&lt;br /&gt;&lt;br /&gt;http://www.aes.org/search/&lt;br /&gt;Journal of the Audio Engineering Society + AES Conventions&lt;br /&gt;&lt;br /&gt;http://scitation.aip.org/vsearch/servlet/VerityServlet?KEY=JASMAN&amp;ONLINE=YES&lt;br /&gt;The Journal of the Acoustical Society of America&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-5871298498233110412?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/5871298498233110412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=5871298498233110412' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/5871298498233110412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/5871298498233110412'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2006/11/weekly-meeting-tuesday-31oct2006.html' title='weekly meeting tuesday 31oct2006'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4128905459119116790.post-3390642164140076259</id><published>2006-10-18T19:04:00.000+02:00</published><updated>2007-02-20T19:06:11.927+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='links'/><title type='text'>digital effect parameters</title><content type='html'>Hier volgt een lijst met een hele hoop effectparameters. Zo gedetailleerd mogelijk, maar daarom zeker niet alles zal hier worden neergepend. Ik noteer ook de webpages die ik gelezen heb.&lt;br /&gt;&lt;p&gt;+ &lt;a title="Owner's manual Roland synthesizer SH-32" href="http://lib.roland.co.jp/manual/en/dl_06-10289/SH-32_e2.pdf" target="blank_"&gt;Owner's manual Roland synthesizer SH-32&lt;/a&gt; &lt;/p&gt; &lt;p&gt;+ &lt;a title="Data list Yamaha music production synthesizer MO8" href="http://www2.yamaha.co.jp/manual/pdf/emi/english/synth/mo6mo8_en_dl.pdf" target="blank_"&gt;Data list Yamaha music production synthesizer MO8&lt;/a&gt; &lt;/p&gt; &lt;p&gt;(+) &lt;a title="Owner's manual Korg synthesizer/vocoder microKorg" href="http://www.korg.com/downloads/pdf/microKORG_Manual.pdf" target="blank_"&gt;Owner's manual Korg synthesizer/vocoder microKorg&lt;/a&gt; &lt;/p&gt; &lt;p&gt;+ &lt;a title="User's manual t.c.electronic dual effects processor M one" href="http://www.tcelectronic.com/media/M1_us.pdf" target="blank_"&gt;User's manual t.c.electronic dual effects processor M ONE&lt;/a&gt; &lt;/p&gt; &lt;p&gt;+ &lt;a title="User guide Lexicon digital effects processor PCM80" target="blank_" href="http://www.lexiconpro.com/Product_Downloads/pcm80/PCM80_User_Guide_Rev1.pdf"&gt;User guide Lexicon digital effects processor PCM80&lt;/a&gt; en &lt;a title="quick reference guide" target="blank_" href="http://www.lexiconpro.com/Product_Downloads/pcm80/PCM80_QRG_Rev1.pdf"&gt;quick reference guide&lt;/a&gt;   &lt;/p&gt; &lt;p&gt;+ &lt;a title="Manual t.c.electronic multitap rhythm delay D TWO" target="blank_" href="http://www.tcelectronic.com/media/D2_US_rev_5.pdf"&gt;Manual t.c.electronic multitap rhythm delay D TWO&lt;/a&gt;  &lt;/p&gt; &lt;p&gt;+ &lt;a title="Authorized product manual Yamaha professional multi-effect processor SPX1000" href="http://www2.yamaha.co.jp/manual/pdf/pa/english/signal/SPX1000E.pdf" target="blank_"&gt;Authorized product manual Yamaha professional multi-effect processor SPX1000&lt;/a&gt; &lt;/p&gt; &lt;h2&gt;REVERB&lt;/h2&gt;&lt;a title="http://www.harmony-central.com/Effects/Articles/Reverb/" href="http://www.harmony-central.com/Effects/Articles/Reverb/" target="blank_"&gt;http://www.harmony-central.com/Effects/Articles/Reverb/&lt;/a&gt;&lt;br /&gt;&lt;a title="http://www.earlevel.com/Digital%20Audio/Reverb.html" href="http://www.earlevel.com/Digital%20Audio/Reverb.html" target="blank_"&gt;http://www.earlevel.com/Digital%20Audio/Reverb.html&lt;/a&gt;&lt;br /&gt;&lt;a title="http://en.wikipedia.org/wiki/Reverb" href="http://en.wikipedia.org/wiki/Reverb" target="blank_"&gt;http://en.wikipedia.org/wiki/Reverb&lt;/a&gt;&lt;br /&gt;&lt;a title="http://www.digit-life.com/articles2/theoryofreverb/index.html" href="http://www.digit-life.com/articles2/theoryofreverb/index.html" target="blank_"&gt;http://www.digit-life.com/articles2/theoryofreverb/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Onder reverb vallen oa:&lt;br /&gt;hall, room, stage, plate reverbs, stereo reverb, gated reverb (zie gate), reverse reverb&lt;br /&gt;&lt;br /&gt;Eerst heb je enkele early reflections die de eerste weerkaatsingen voorstellen (bv van de muren), daarna de late reflections of diffuse reflections (diffusion), die veel meer random zijn. Deze reflections beginnen na de respectievelijke &lt;span style="font-weight: bold;"&gt;predelay&lt;/span&gt;s [ms][initial delay].  Deze predelay kan verschillend zijn links en rechts voor stereo reverbs en stelt eigenlijk kamerafmetingen voor rekening houdend met de plaats van de luisteraar. De &lt;span style="font-weight: bold;"&gt;reverberation time&lt;/span&gt; [ms] stelt de tijdspanne voor waarop het geluid met 60dB van zijn originele amplitude verlaagd is.&lt;br /&gt;Nog parameters zijn:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;reverb decay&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; time&lt;/span&gt; [ms] stelt de tijdsduur voor dat de reverb te horen is na het stoppen van de input. Hoogstwaarschijnlijk bestaan analoog ook &lt;span style="font-weight: bold;"&gt;reverb attack time&lt;/span&gt; [ms], &lt;span style="font-weight: bold;"&gt;reverb sustain level&lt;/span&gt; [], &lt;span style="font-weight: bold;"&gt;reverb release time&lt;/span&gt; [ms]&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;dry/wet balance&lt;/span&gt; [D&gt;W - D=W - D&lt;w] style="font-style: italic;"&gt;Of dat natte signaal enkel de reverb is of de reverb + inputsignaal weet ik niet, hangt mss af van de fabrikant.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;high/low frequency damp gain&lt;/span&gt; [] vertelt hoe sterk het reverbsignaal is boven/onder de hieronder aangegeven frequentie. Als de gain gelijk is aan nul, krijg je de HPF/LPF cutoff frequency [Hz]. Maakt de reverb softer. Simuleert in zekere zin het materiaal dat geluiden absorbeert.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;high/low frequency damp frequency&lt;/span&gt; [Hz]&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;diffusion&lt;/span&gt; [] &lt;span style="font-style: italic;"&gt;??? randomness van de late reflecties in amplitude en/of tijd ??? &lt;/span&gt;als deze parameter laag is, wordt het signaal discreet en lijkt het dus meer op een echo&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;reverb delay &lt;/span&gt;[ms] &lt;span style="font-style: italic;"&gt;???&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;density &lt;/span&gt;[]&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ER/reverb balance&lt;/span&gt; [E&gt;R - E=R - E&lt; R] is de verhouding tussen de early reflectionsen de reverb&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ER level&lt;/span&gt; []&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;feedback level&lt;/span&gt; [] geeft aan hoeveel van het effectsignaal terug in de reverb gestuurd wordt&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;feedback high damp&lt;/span&gt; [] is waarschijnlijk weer op te splitsen in een gain parameter [] en een frequentie treshold parameter [Hz] waarboven het feedbacksignaal verzwakt tot gecut wordt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4128905459119116790-3390642164140076259?l=idafx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://idafx.blogspot.com/feeds/3390642164140076259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4128905459119116790&amp;postID=3390642164140076259' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/3390642164140076259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4128905459119116790/posts/default/3390642164140076259'/><link rel='alternate' type='text/html' href='http://idafx.blogspot.com/2006/10/digital-effect-parameters.html' title='digital effect parameters'/><author><name>ronny</name><uri>http://www.blogger.com/profile/03628635277850202316</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
