tag:blogger.com,1999:blog-74791978512981703022024-03-13T10:28:43.448-07:00Meandering of a Linux Audio DeveloperDevinhttp://www.blogger.com/profile/06852684074220765655noreply@blogger.comBlogger15125tag:blogger.com,1999:blog-7479197851298170302.post-36622422453617133772016-02-28T03:24:00.000-08:002016-02-28T03:31:20.463-08:00Some updatesI've moved my Linux Audio projects from <a href="http://code.google.com/">Google Code</a> to <a href="https://www.github.com/">GitHub</a>. You can find midisnoop at <a href="https://github.com/surfacepatterns/midisnoop">https://github.com/surfacepatterns/midisnoop</a> and synthclone at <a href="https://github.com/surfacepatterns/synthclone">https://github.com/surfacepatterns/synthclone</a>.<br />
<br />
I haven't made any real changes to either project in about two years, and I don't anticipate making any changes in the near future. There are a few reasons for this:<br />
<br />
<ol>
<li>I get my coding fix at work these days. No, really. I love working for <a href="http://www.akamai.com/">Akamai</a>.</li>
<li>I have a Mac now, and am spoiled by the music production tools that are available to me. I no longer constantly ask myself whether I should tolerate the limitations of my tools, or spend months or years writing code so that I can write a tool to do the job I need done.</li>
<li>I've rediscovered my love for video games. Well, that's not quite true. I've actually found that I dislike most video games released these days. Fortunately, there are some notable exceptions, which take up a lot of my time. I'm looking at you, <a href="http://www.fromsoftware.jp/pc_en/">From Software</a>.</li>
</ol>
I know there are still people using midisnoop and synthclone (thank you!), and I don't want to let my lack of interest keep either application from evolving. If you or someone you know wants to make changes to the codebase, please let me know. I'll work with you in some capacity to make sure that changes get merged into the "official" branch, and that releases get made. Alternatively, if you want to take over maintenance of the codebase, we can discuss that too.<br />
<br />
It's possible I may choose to port midisnoop and/or synthclone to Mac OSX at some point. If that happens, I'll make sure that the code still works on Linux.Devinhttp://www.blogger.com/profile/06852684074220765655noreply@blogger.com0tag:blogger.com,1999:blog-7479197851298170302.post-68117688957580623632013-12-20T08:47:00.000-08:002013-12-20T08:47:53.488-08:00Interview with zthmusicGabbe Nord does a weekly interview series that he calls, "<a href="http://www.zthmusic.com/friday-interview/">The Friday Interview</a>". Each Friday, he interviews someone in the Linux Audio community. This week, I had the good fortune of being interviewed by Gabbe. <a href="http://www.zthmusic.com/devin-anderson/">Check it out</a>.<br />
<br />
Thanks to Gabbe for taking the time to interview me.Devinhttp://www.blogger.com/profile/06852684074220765655noreply@blogger.com0tag:blogger.com,1999:blog-7479197851298170302.post-30467035416443950322013-08-25T11:39:00.003-07:002013-08-25T12:38:13.647-07:00Video Tutorial on `synthclone`Glen MacArthur, the creator of <a href="http://www.bandshed.net/AVLinux.html">AVLinux</a>, recorded a <a href="http://vimeo.com/73053302"><b>video tutorial about `synthclone`</b></a>, and how he used `synthclone` to create a <a href="http://www.hydrogen-music.org/hcms/">Hydrogen</a> drum kit using the sounds from <a href="http://www.xlnaudio.com/productline/1">Addictive Drums</a>.<br />
<div>
<br /></div>
<iframe src="//player.vimeo.com/video/73053302" width="500" height="281" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe> <p><a href="http://vimeo.com/73053302">Addicted to Hydrogen with Synthclone!</a> from <a href="http://vimeo.com/glenmacarthur">Glen MacArthur</a> on <a href="https://vimeo.com">Vimeo</a>.</p>
<div><br /></div>
<div>
Glen did a fantastic job of addressing the different parts of the `synthclone` workflow. I highly recommend this tutorial to anyone attempting to get up to speed on using `synthclone`.</div>
<div>
<br /></div>
<div>
Thanks, Glen!</div>Devinhttp://www.blogger.com/profile/06852684074220765655noreply@blogger.com0tag:blogger.com,1999:blog-7479197851298170302.post-80567565372032221332013-02-06T23:22:00.000-08:002013-02-06T23:22:11.322-08:00Announcing midisnoop-0.1.2!I'm happy to announce the release of midisnoop-0.1.2!<br />
<br />
<a href="http://midisnoop.googlecode.com/files/midisnoop-blofeld.png"><img border="0" height="502" src="http://midisnoop.googlecode.com/files/midisnoop-blofeld.png" width="640" /></a><br />
<br />
midisnoop is a simple MIDI monitor and prober. You can use it to monitor a MIDI device and/or software, and to send MIDI messages to a MIDI port to see how the device/software responds. midisnoop supports both ALSA and JACK MIDI ports via the RtMidi library.<br />
<br />
Changes Since 0.1.0:<br />
<div>
<ul>
<li>UI improvements</li>
<li>Fixed a configure bug (reported by Robin Gareus)</li>
</ul>
`midisnoop` is available at:<br />
<br />
<div style="margin-left: 20px;">
<a href="http://midisnoop.googlecode.com/">http://midisnoop.googlecode.com/</a></div>
<br />
Please report bugs using the issue tracker:<br />
<br />
<div style="margin-left: 20px;">
<a href="http://code.google.com/p/midisnoop/issues/list">http://code.google.com/p/midisnoop/issues/list</a></div>
<br />
If you like `midisnoop` and have ideas that can make it better and/or want to keep up with its progress, join the users group:<br />
<br />
<div style="margin-left: 20px;">
<a href="http://groups.google.com/group/midisnoop-users">http://groups.google.com/group/midisnoop-users</a></div>
<br />
If you're a developer and want to contribute to `midisnoop`, join the development group:<br />
<br />
<div style="margin-left: 20px;">
<a href="http://groups.google.com/group/midisnoop-development">http://groups.google.com/group/midisnoop-development</a></div>
<br /></div>
Devinhttp://www.blogger.com/profile/06852684074220765655noreply@blogger.com0tag:blogger.com,1999:blog-7479197851298170302.post-5312740887201712962012-12-31T19:08:00.000-08:002012-12-31T19:08:17.905-08:00Dissecting the Multitimbral Patch Format of the Waldorf Blofeld Using midisnoopLately, I've been interested in writing a software editor for my <a href="http://www.waldorf-music.info/en/blofeld.html">Waldorf Blofeld</a>. In particular, I wanted to be able to edit multi-timbral patches on my Blofeld. Unfortunately, while Waldorf has released a <a href="http://www.waldorf-music.info/en/downloads-blofeld/tools/424-blofeldsysexv104/download.html">system exclusive message specification</a> that contains the format for mono-timbral patches, they have not released information on the format for multi-timbral patches.<br />
<br />
A couple days ago, I released a program called <a href="http://midisnoop.googlecode.com/">midisnoop</a> that allows a user to send custom messages to a MIDI port and to monitor the messages that come out of another MIDI port. I wrote this program with the intention of probing my MIDI-enabled hardware, and the first hardware I decided to probe was my Blofeld.<br />
<br />
I started by doing a little research. The Blofeld system exclusive specification contain data regarding the format of system exclusive messages that can be used to communicate with the Blofeld. Here's the basic format:<br />
<br />
<div style="margin-left: 20px;">
<table>
<tbody>
<tr><th>Hex</th><th>Description</th></tr>
<tr><td>f0</td><td>Start of sysex message</td></tr>
<tr><td>3e</td><td>Waldorf Music manufacturer ID</td></tr>
<tr><td>13</td><td>Blofeld ID</td></tr>
<tr><td>(DD)</td><td>Device ID</td></tr>
<tr><td>(MM)</td><td>Message Type ID</td></tr>
<tr><td>(HH)</td><td>Location High Byte</td></tr>
<tr><td>(LL)</td><td>Location Low Byte</td></tr>
<tr><td>(Data Bytes)</td><td>Data Bytes pertaining to the type of message (not always necessary)</td>
</tr>
<tr><td>(CS)</td><td>Checksum byte (not always necessary)</td></tr>
<tr><td>f7</td><td>End of sysex message</td></tr>
</tbody></table>
</div>
<br />
The document also defines some message types:<br />
<br />
<div style="margin-left: 20px;">
<table>
<tbody>
<tr><th>Hex</th><th>Description</th></tr>
<tr><td>00</td><td>Sound Data Request</td></tr>
<tr><td>10</td><td>Sound Data Dump</td></tr>
<tr><td>20</td><td>Sound Parameter Change</td></tr>
<tr><td>04</td><td>Global Data Request</td></tr>
<tr><td>14</td><td>Global Data Dump</td></tr>
</tbody></table>
</div>
<br />
The sound data types above are for monotimbral patches. The document also goes into how you can access sound parameters from each part of the currently loaded multitimbral patch, but doesn't go into how to access the actual parameters of a multitimbral patch.<br />
<br />
There's more data in the document too, on the format of monotimbral patches, the exact format of the above message types, the format of global data, and how a Blofeld responds to device inquiry messages. I'm not going into that here.<br />
<br />
This data is helpful, but it didn't solve my problem. I started looking for documentation on other multitimbral synths made by Waldorf, and came across <a href="http://synth.stromeko.net/docs/Waldorf.pdf">this fantastic document</a> on Waldorf synthesizers. This document contained information on the MIDI implementations of the Waldorf <a href="http://www.waldorf-music.info/en/q.html">Q, Q+</a>, and <a href="http://www.waldorf-music.info/en/archiv/micro-q-series.html">microQ</a>. In particular, all three of the synths used the same general message format as the Waldorf Blofeld, <b>and</b> used the same message type byte to request multitimbral patch data, which is:<br />
<br />
<div style="margin-left: 20px;">
<table>
<tbody>
<tr><th>Hex</th><th>Description</th></tr>
<tr><td>f0</td><td>Start of sysex message</td></tr>
<tr><td>3e</td><td>Waldorf Music manufacturer ID</td></tr>
<tr><td>13</td><td>Blofeld ID</td></tr>
<tr><td>(DD)</td><td>Device ID</td></tr>
<tr><td>01</td><td>Multitimbral Patch Request ID</td></tr>
<tr><td>(BB)</td><td>Location High Byte</td></tr>
<tr><td>(LL)</td><td>Location Low Byte</td></tr>
<tr><td>f7</td><td>End of sysex message</td></tr>
</tbody></table>
</div>
<br />
Cool! I fired up my Blofeld, and started midisnoop. I connected midisnoop to my Blofeld, making sure that system exclusive events won't be ignored:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-8emdrJOIm0s/UOJKo1IB-dI/AAAAAAAAAPg/QWCDDV4OWuY/s1600/midisnoop-configure.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="http://3.bp.blogspot.com/-8emdrJOIm0s/UOJKo1IB-dI/AAAAAAAAAPg/QWCDDV4OWuY/s400/midisnoop-configure.png" width="400" /></a></div>
<br />
... composed my MIDI message:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-MqDxmartS2Y/UOJK3iRexyI/AAAAAAAAAPo/yenpoKHo3JM/s1600/midisnoop-send.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="291" src="http://3.bp.blogspot.com/-MqDxmartS2Y/UOJK3iRexyI/AAAAAAAAAPo/yenpoKHo3JM/s400/midisnoop-send.png" width="400" /></a></div>
<br />
... and sent it off:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-TLe0mgk2UuE/UOJLErxb-YI/AAAAAAAAAPw/VnjoyWdWh2M/s1600/midisnoop-reply.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="500" src="http://1.bp.blogspot.com/-TLe0mgk2UuE/UOJLErxb-YI/AAAAAAAAAPw/VnjoyWdWh2M/s640/midisnoop-reply.png" width="640" /></a></div>
<br />
The Blofeld sent me back something! Let's disect the data. Here's the data contained in the system exclusive message:<br />
<br />
<div style="margin-left: 20px;">
<pre>3e 13 00 11 00 00 49 6e 69 74 20 4d 75 6c 74 69 20 20 20 20 20 20 00 7f
37 01 00 02 04 0b 0c 00 00 00 00 00 00 00 00 00 64 40 00 40 40 02 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 03 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 04 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 05 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 06 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 07 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 08 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 09 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0a 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0b 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0c 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0d 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0e 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0f 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 10 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 11 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 7b</pre>
</div>
<br />
This might seem overwhelming at first, but there are patterns here. See the row of '7f' at the end there? And there's another row of '00' next to it. There's a method to this madness.<br />
<br />
Let's start by eliminating the bytes that belong to the message and not the multitimbral patch itself. Using the basic Blofeld message format I referenced above, I can see that the first 6 bytes belong to the MIDI message:<br />
<br />
<div style="margin-left: 20px;">
<table>
<tbody>
<tr><th>Hex</th><th>Description</th></tr>
<tr><td>3e</td><td>Waldorf Music manufacturer ID</td></tr>
<tr><td>13</td><td>Blofeld ID</td></tr>
<tr><td>(DD)</td><td>Device ID</td></tr>
<tr><td>11</td><td>Multitimbral Patch Dump ID</td></tr>
<tr><td>(HH)</td><td>Location High Byte</td></tr>
<tr><td>(LL)</td><td>Location Low Byte</td></tr>
</tbody></table>
</div>
<br />
... and the last byte also belongs to the MIDI message:<br />
<br />
<div style="margin-left: 20px;">
<table>
<tbody>
<tr><th>Hex</th><th>Description</th></tr>
<tr><td>CS</td><td>Checksum byte</td></tr>
</tbody></table>
</div>
<br />
So, let's eliminate those bytes and see what we have left:<br />
<br />
<div style="margin-left: 20px;">
<pre>49 6e 69 74 20 4d 75 6c 74 69 20 20 20 20 20 20 00 7f
37 01 00 02 04 0b 0c 00 00 00 00 00 00 00 00 00 64 40 00 40 40 02 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 03 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 04 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 05 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 06 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 07 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 08 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 09 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0a 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0b 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0c 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0d 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0e 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0f 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 10 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 11 00 7f
01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00</pre>
</div>
<br />
Now, let's look in the <a href="http://www.waldorf-music.info/en/downloads-blofeld/documentation/552-manual/download.html">Blofeld manual</a>. There's a section on multis, and their parameters. A multi has the following parameters:<br />
<br />
<ul>
<li>Name</li>
<li>Tempo</li>
<li>16 parts</li>
</ul>
<br />
Each of the 16 parts has the following parameters:<br />
<br />
<ul>
<li>Sound Bank (A ... H)</li>
<li>Sound Number (0 ... 127)</li>
<li>Mixer Volume (0 ... 127)</li>
<li>Pan (L64 - R63)</li>
<li>Transpose (-48 - +48)</li>
<li>Detune (-64 - +63)</li>
<li>Channel (Global, Omni, 1 - 16)</li>
<li>Low Key (0 ... 127)</li>
<li>High Key (0 ... 127)</li>
<li>Low Velocity (1 ... 127)</li>
<li>High Velocity (1 ... 127)</li>
<li>Status (play/mute)</li>
<li>MIDI (ignore/receive)</li>
<li>USB (ignore/receive)</li>
<li>Local (ignore/receive)</li>
<li>Pitch Bend (ignore/receive)</li>
<li>Mod Wheel (ignore/receive)</li>
<li>Pressure (ignore/receive)</li>
<li>Sustain (ignore/receive)</li>
<li>Edits (ignore/receive)</li>
<li>Prg Change (ignore/receive)</li>
</ul>
<br />
Let's start by finding the name. Names of Blofeld patches are 16 letters long. We'll change the name of the first multi using the Blofeld to "ABCDEFGHIJKLMNOP", save the multi, fetch the data again using midisnoop, and look for a series of 16 ascending hex bytes:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-luhN5_kg8G0/UOJOhnSD1BI/AAAAAAAAAQA/W4W9tWrV2QQ/s1600/midisnoop-name.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="502" src="http://1.bp.blogspot.com/-luhN5_kg8G0/UOJOhnSD1BI/AAAAAAAAAQA/W4W9tWrV2QQ/s640/midisnoop-name.png" width="640" /></a></div>
<br />
Here's the next mass of hex bytes, sans message data:<br />
<br />
<div style="margin-left: 20px;">
<pre>41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 00 7f 37 01 00 02 04 0b
0c 00 00 00 00 00 00 00 00 00 64 7f 00 70 7f 02 00 7f 01 7f 07 3f 01 3f
00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 03 00 7f 01 7f 07 3f 01 3f
00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 04 00 7f 01 7f 07 3f 01 3f
00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 05 00 7f 01 7f 07 3f 01 3f
00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 06 00 7f 01 7f 07 3f 01 3f
00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 07 00 7f 01 7f 07 3f 01 3f
00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 08 00 7f 01 7f 07 3f 01 3f
00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 09 00 7f 01 7f 07 3f 01 3f
00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0a 00 7f 01 7f 07 3f 01 3f
00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0b 00 7f 01 7f 07 3f 01 3f
00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0c 00 7f 01 7f 07 3f 01 3f
00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0d 00 7f 01 7f 07 3f 01 3f
00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0e 00 7f 01 7f 07 3f 01 3f
00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0f 00 7f 01 7f 07 3f 01 3f
00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 10 00 7f 01 7f 07 3f 01 3f
00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 11 00 7f 01 7f 07 3f 01 3f
00 00 00 00 00 00 00 00 32</pre>
</div>
<br />
Right at the beginning, there are 16 hex bytes in ascending order. We now know where the name is stored!<br />
<br />
We can do this with the rest of the parameters, changing them one at a time to figure out the Blofeld's multitimbral patch format. I'm not going to go into detail about how to find every parameter in this post. Suffice to say that I meticulously went through the parameters, and used midisnoop to check the Blofeld's data for each parameter.<br />
<br />
Here are the results:<br />
<br />
<u>Multi Format</u><br />
<br />
<div style="margin-left: 20px;">
<table>
<tbody>
<tr><th>Bytes</th><th>Description</th></tr>
<tr><td>0-15</td><td>Name</td></tr>
<tr><td>16</td><td>?</td></tr>
<tr><td>17</td><td>Multi Volume</td></tr>
<tr><td>18</td><td>Tempo</td></tr>
<tr><td>19-24</td><td>?</td></tr>
<tr><td>25-31</td><td>(Reserved?)</td></tr>
<tr><td>32-55</td><td>Part 1</td></tr>
<tr><td>56-79</td><td>Part 2</td></tr>
<tr><td>80-103</td><td>Part 3</td></tr>
<tr><td>104-127</td><td>Part 4</td></tr>
<tr><td>128-151</td><td>Part 5</td></tr>
<tr><td>152-175</td><td>Part 6</td></tr>
<tr><td>176-199</td><td>Part 7</td></tr>
<tr><td>200-223</td><td>Part 8</td></tr>
<tr><td>224-247</td><td>Part 9</td></tr>
<tr><td>248-271</td><td>Part 10</td></tr>
<tr><td>272-295</td><td>Part 11</td></tr>
<tr><td>296-319</td><td>Part 12</td></tr>
<tr><td>320-343</td><td>Part 13</td></tr>
<tr><td>344-367</td><td>Part 14</td></tr>
<tr><td>368-391</td><td>Part 15</td></tr>
<tr><td>392-415</td><td>Part 16</td></tr>
</tbody></table>
</div>
<br />
<u>Multi Part Format</u><br />
<br />
<div style="margin-left: 20px;">
<table>
<tbody>
<tr><th>Bytes</th><th>Description</th></tr>
<tr><td>0</td><td>Sound Bank</td></tr>
<tr><td>1</td><td>Sound Number</td></tr>
<tr><td>2</td><td>Mixer Volume</td></tr>
<tr><td>3</td><td>Pan</td></tr>
<tr><td>4</td><td>(Reserved?)</td></tr>
<tr><td>5</td><td>Transpose</td></tr>
<tr><td>6</td><td>Detune</td></tr>
<tr><td>7</td><td>Channel - Global (0), Omni (1), 1 - 16 (2-17)</td></tr>
<tr><td>8</td><td>Low Key</td></tr>
<tr><td>9</td><td>High Key</td></tr>
<tr><td>10</td><td>Low Velocity</td></tr>
<tr><td>11</td><td>High Velocity</td></tr>
<tr><td valign="top">12</td><td>Bitfield: XS???LUM<br />
<ul>
<li>S - Status: play/mute</li>
<li>?</li>
<li>?</li>
<li>?</li>
<li>L - Local ignore/receive</li>
<li>U - USB ignore/receive</li>
<li>M - MIDI ignore/receive</li>
</ul>
</td></tr>
<tr><td valign="top">13</td><td>Bitfield: X?RESpMP<br />
<ul>
<li>?</li>
<li>R - Prg Change ignore/receive</li>
<li>E - Edits ignore/receive</li>
<li>S - Sustain ignore/receive</li>
<li>p - Pressure ignore/receive</li>
<li>M - Mod Wheel ignore/receive</li>
<li>P - Pitch Bend ignore/receive</li>
</ul>
</td></tr>
<tr><td>14 - 15</td><td>?</td></tr>
<tr><td>16 - 23</td><td>(Reserved?)</td></tr>
</tbody></table>
</div>
<br />
As you can see, there are some bytes that I'm still not sure about. I suspect that bytes 14 and 15 in the part above are the send equivalents of bytes 12 and 13 respectively, and that they only pertain to the Blofeld Keyboard (I own a Blofeld Desktop).<br />
<div>
<br /></div>
<div>
</div>
Devinhttp://www.blogger.com/profile/06852684074220765655noreply@blogger.com2tag:blogger.com,1999:blog-7479197851298170302.post-82726468023500494752012-12-30T02:04:00.000-08:002012-12-31T18:11:10.351-08:00Announcing midisnoop-0.1.0!I'm happy to announce the first release of midisnoop!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://midisnoop.googlecode.com/files/midisnoop-blofeld.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="502" src="http://midisnoop.googlecode.com/files/midisnoop-blofeld.png" width="640" /></a></div>
<br />
<br />
midisnoop is a simple MIDI monitor and prober. You can use it to monitor a MIDI device and/or software, and to send MIDI messages to a MIDI port to see how the device/software responds. midisnoop supports both ALSA and JACK MIDI ports using the RtMidi library.<br />
<br />
`midisnoop` is available at:<br />
<br />
<a href="http://midisnoop.googlecode.com/">http://midisnoop.googlecode.com/</a><br />
<br />
Please report bugs using the issue tracker:<br />
<br />
<a href="http://code.google.com/p/midisnoop/issues/list">http://code.google.com/p/midisnoop/issues/list</a><br />
<br />
If you like `midisnoop` and have ideas that can make it better and/or want to keep up with its progress, join the users group:<br />
<br />
<div>
<a href="http://groups.google.com/group/midisnoop-users">http://groups.google.com/group/midisnoop-users</a><br />
<br />
If you're a developer and want to contribute to `midisnoop`, join the development group:<br />
<br />
<a href="http://groups.google.com/group/midisnoop-development">http://groups.google.com/group/midisnoop-development</a></div>
<div>
<br /></div>
Devinhttp://www.blogger.com/profile/06852684074220765655noreply@blogger.com0tag:blogger.com,1999:blog-7479197851298170302.post-84496595087999286102012-12-21T21:37:00.000-08:002012-12-31T18:11:23.878-08:00Announcing synthclone-0.3.0!I'm happy to announce the release of synthclone-0.3.0!<br />
<br />
synthclone is a tool that allows you to create sample-based instruments. You can create sample-based instruments by sending MIDI messages to your MIDI-capable gear or software that instructs an instrument to emit sounds for a series of notes, velocities, controls, and aftertouch values, or by recording your own samples. After the sampling is done, you can apply effects to your samples, and finally save this data as a sample-based instrument that can be loaded by sampler software.<br />
<br />
Features:<br />
<ul>
<li>Supports user-configurable per-zone sample time, release time, MIDI note, MIDI velocity, MIDI aftertouch, MIDI channel pressure, MIDI control changes, etc. via a table interface.</li>
<li>Audition samples and change zone parameters until you're happy with the data you're acquiring from your MIDI device.</li>
<li>Save and restore sessions.</li>
<li>Distributed with plugins that support the<a href="http://jackaudio.org/"> JACK Audio Connection Kit</a> (with JACK Session support), <a href="http://www.portaudio.com/">PortAudio</a> and <a href="http://portmedia.sourceforge.net/portmidi/">PortMidi</a>, trimming of samples, reversing samples, <a href="http://lv2plug.in/">LV2</a> effects, the creation of <a href="http://www.hydrogen-music.org/">Hydrogen</a>, <a href="http://www.cakewalk.com/Download/sfz.aspx">SFZ</a>, and <a href="http://www.renoise.com/">Renoise</a> instruments, automated zone generation, and loading samples from your local filesystem!</li>
<li>Can create multiple targets in one session (i.e. a Renoise patch and an SFZ patch) from the same set of samples.</li>
<li>A <a href="http://wiki.synthclone.googlecode.com/git/doxygen/index.html">well-documented plugin API</a> is available for developers to write their own plugins to extend synthclone.</li>
</ul>
Important Changes Since 0.2.0:<br />
<ul>
<li>Lots of bug fixes.</li>
<li>The new LV2 plugin allows you to use LV2 effects within synthclone</li>
<li>The new Renoise plugin allows you to save your instruments as Renoise instruments</li>
<li>The new Reverser plugin allows you to reverse the samples you load into synthclone</li>
<li>The new Sample Loader plugin allows you to load samples into synthclone from your local filesystem</li>
<li>Internal architecture changes for future expansion of the plugin API to handle main view manipulation</li>
</ul>
Future Development:<br />
<ul>
<li>Consider capturing release of samples.</li>
<li>Figure out a good packaging scheme for Mac OSX.</li>
<li>Support the Non-Session Manager protocol.</li>
<li>Consider different ways to support the detection and/or creation of loops.</li>
<li>Get someone to design an icon that isn't ugly.</li>
<li>Extend the LV2 plugin to support more features so that it can load more LV2 plugins.</li>
</ul>
The new version of `synthclone` is available at:<br />
<br />
<a href="http://synthclone.googlecode.com/" target="_blank">http://synthclone.googlecode.<wbr></wbr>com/</a><br />
<br />
Please report bugs using the issue tracker:<br />
<br />
<a href="http://code.google.com/p/synthclone/issues/list" target="_blank">http://code.google.com/p/<wbr></wbr>synthclone/issues/list</a><br />
<br />
If you like `synthclone` and have ideas that can make it better and/or want to keep up with its progress, join the users group:<br />
<br />
<a href="http://groups.google.com/group/synthclone-users" target="_blank">http://groups.google.com/<wbr></wbr>group/synthclone-users</a><br />
<br />
If you're a developer and want to write plugins for `synthclone` or contribute to the application itself, join the development group:<br />
<br />
<a href="http://groups.google.com/group/synthclone-development" target="_blank">http://groups.google.com/<wbr></wbr>group/synthclone-development</a>Devinhttp://www.blogger.com/profile/06852684074220765655noreply@blogger.com0tag:blogger.com,1999:blog-7479197851298170302.post-20138209215738561232012-04-07T02:44:00.001-07:002012-04-07T10:56:45.277-07:00Announcing synthclone-0.2.0! Now in beta!I'm happy to announce the <a href="http://code.google.com/p/synthclone/downloads/detail?name=synthclone-0.2.0.tar.gz">first beta release of `synthclone`</a>!<br />
<br />
`synthclone` is a <a href="http://qt.nokia.com/">Qt</a>-based application that can "clone" your MIDI-capable instruments. It does this by sending out MIDI data that instructs an instrument to emit sounds for a series of notes, velocities, controls, and aftertouch values. It then saves this data as a sample-based instrument that can be loaded by sampler software.<br />
<br />
Features:<br />
<br />
<ul><li>Supports user-configurable per-zone sample time, release time, MIDI note, MIDI velocity, MIDI aftertouch, MIDI channel pressure, MIDI control changes, etc. via a table interface.</li>
<li>Audition samples and change zone parameters until you're happy with the data you're acquiring from your MIDI device/software.</li>
<li>Save and restore sessions.</li>
<li>Distributed with plugins that support the <a href="http://www.jackaudio.org/">JACK Audio Connection Kit</a> (with JACK Session support), <a href="http://www.portaudio.com/">PortAudio</a> and <a href="http://portmedia.sourceforge.net/portmidi/">PortMidi</a>, trimming of samples, the creation of patches for <a href="http://www.hydrogen-music.org/">Hydrogen</a> and <a href="http://www.cakewalk.com/Download/sfz.aspx">SFZ</a>, and automated zone generation.</li>
<li>Can create multiple targets in one session (i.e. a Hydrogen patch and an SFZ patch) from the same set of samples.</li>
<li>A <a href="http://wiki.synthclone.googlecode.com/git/doxygen/index.html">well-documented plugin API</a> is available for developers to write their own plugins to extend synthclone.</li>
</ul><br />
Important Changes Since 0.1.0:<br />
<br />
<ul><li>Lots of bug fixes.</li>
<li>Added a "portable" semaphore implementation to the plugin API.</li>
<li>Added the new PortMedia plugin, which supports sampling via PortAudio and PortMidi.</li>
<li>Get `synthclone` to compile on Mac OSX.</li>
<li>Change build system to use traditional `./configure`, `make`, `make install` scheme.</li>
<li>Add new 'debian' target for building <a href="http://www.debian.org/">Debian</a> packages (`./configure --prefix=/usr`, `make debian`).</li>
</ul><br />
Future Development:<br />
<br />
<ul><li>Figure out a good packaging scheme for Mac OSX.</li>
<li>Support the <a href="http://non.tuxfamily.org/nsm/">Non-Session Manager</a> protocol.</li>
<li>Write a plugin that creates <a href="http://www.renoise.com/">Renoise</a> instruments.</li>
<li>Write a plugin that loads <a href="http://www.ladspa.org/">LADSPA</a> effects.</li>
<li>Write a plugin that loads <a href="http://lv2plug.in/">LV2</a> effects.</li>
<li>Write a plugin that loads samples from the filesystem (expanding on the plugin created in <a href="http://code.google.com/p/synthclone/wiki/TutorialWritingASimplePluginPart1">this tutorial</a>)</li>
<li>Consider different ways to support the detection and/or creation of loops.</li>
</ul>Devinhttp://www.blogger.com/profile/06852684074220765655noreply@blogger.com2tag:blogger.com,1999:blog-7479197851298170302.post-78807811110707944032012-03-11T22:48:00.000-07:002012-12-31T18:11:38.485-08:00<a href="http://code.google.com/p/synthclone/downloads/detail?name=synthclone-0.1.10.tar.gz">synthclone-0.1.10</a> is available for download! This release includes sampling support via <a href="http://www.portaudio.com/">PortAudio</a> and <a href="http://portmedia.sourceforge.net/portmidi/">PortMidi</a>, which brings synthclone one step closer to supporting non-UNIX platforms.<br />
<br />
If you're interested in assisting me in porting synthclone to other platforms, please join the <a href="http://groups.google.com/group/synthclone-development">synthclone-development group</a> and let me know.Devinhttp://www.blogger.com/profile/06852684074220765655noreply@blogger.com0tag:blogger.com,1999:blog-7479197851298170302.post-61060341949066299752011-12-20T00:13:00.000-08:002011-12-20T00:13:15.849-08:00jack-1.9.8 released<a href="http://jackaudio.org/download">JACK 1.9.8 is available for download</a>! I'm proud to have contributed a significant amount of code to this release of the JACK Audio Connection Kit, including:<br />
<br />
<ul><li>A new MIDI queue system and driver model</li>
<li>A rewrite of the MIDI drivers for Windows (WinMME) and MacOSX (CoreMIDI)</li>
<li>A rewrite of the MIDI capabilities for the firewire driver on Linux (FFADO)</li>
<li>A new ALSA-based MIDI slave driver (alsarawmidi) for Linux, with a reported peak jitter as low as 60 microseconds</li>
</ul>Check the <a href="http://jackaudio.org/node/61">release announcement</a> for more details.Devinhttp://www.blogger.com/profile/06852684074220765655noreply@blogger.com0tag:blogger.com,1999:blog-7479197851298170302.post-26616916825814140222011-12-09T10:08:00.000-08:002011-12-09T10:08:55.813-08:00synthclone-0.1.9 released<a href="http://code.google.com/p/synthclone/downloads/detail?name=synthclone-0.1.9.tar.gz">synthclone-0.1.9</a> is available for download! This release includes a sanity check for samples added to a session, and minor fixes to project files, including a fix from <a href="https://aur.archlinux.org/account.php?Action=AccountInfo&ID=12299">speps</a> over at <a href="https://aur.archlinux.org/">AUR</a> that makes sure that `synthclone` builds against the correct version of `libsynthclone`.Devinhttp://www.blogger.com/profile/06852684074220765655noreply@blogger.com0tag:blogger.com,1999:blog-7479197851298170302.post-188152114553531342011-11-22T01:07:00.000-08:002011-11-22T01:07:24.891-08:00synthclone-0.1.8 released<a href="http://code.google.com/p/synthclone/downloads/detail?name=synthclone-0.1.8.tar.gz">synthclone-0.1.8</a> is available for download. This release fixes a couple bugs, including <a href="http://code.google.com/p/synthclone/issues/detail?id=8&can=1">a bug that caused synthclone to crash</a> when building a Hydrogen target with one or more empty samples.Devinhttp://www.blogger.com/profile/06852684074220765655noreply@blogger.com0tag:blogger.com,1999:blog-7479197851298170302.post-26136348937384303582011-11-16T11:05:00.000-08:002011-11-16T11:05:43.475-08:00Second Part of TutorialI've written the <a href="http://code.google.com/p/synthclone/wiki/TutorialWritingASimplePluginPart2">second (final) part of the tutorial on synthclone plugin development</a>. I mentioned the <a href="http://code.google.com/p/synthclone/wiki/TutorialWritingASimplePluginPart1">first part of the tutorial</a> in my <a href="http://surfacepatterns.blogspot.com/2011/11/synthclone-016-released-new-tutorial.html">last blog post</a>.<br />
<br />
Let me know what you think.Devinhttp://www.blogger.com/profile/06852684074220765655noreply@blogger.com0tag:blogger.com,1999:blog-7479197851298170302.post-50674987894301430752011-11-14T21:14:00.000-08:002011-11-16T11:06:04.073-08:00synthclone-0.1.6 released + new tutorial for plugin developersA <a href="http://code.google.com/p/synthclone/downloads/detail?name=synthclone-0.1.6.tar.gz">new version of `synthclone`</a> is available for download! This release includes changes in the way `synthclone` is packaged and installed, including options to choose which components to install, a location change for API documentation, a `pkgconfig` file for plugin developers to retrieve compiler flags, and recommendations for packagers on how to best package `synthclone`.<br />
<br />
Also, <a href="http://code.google.com/p/synthclone/wiki/TutorialWritingASimplePluginPart1">the first part of a tutorial on `synthclone` plugin development</a> has been added to the wiki. If you're interested in developing plugins for `synthclone`, then check it out and let me know what you think.Devinhttp://www.blogger.com/profile/06852684074220765655noreply@blogger.com0tag:blogger.com,1999:blog-7479197851298170302.post-8885670044204517662011-11-05T23:48:00.000-07:002011-11-05T23:48:11.504-07:00SummaryI've created this blog mostly to post releases and changes for open source projects I work on. Right now, my focus is on <a href="http://synthclone.googlecode.com/">synthclone</a>, a program I wrote that captures audio from MIDI capable instruments and creates sample-based instruments that can be loaded by sampler software.<br />
<br />
As I get more time, I also intend to post music that I work on, and show the parts of my Linux-based workflow that help me to make my music.<br />
<br />
Stay tuned.Devinhttp://www.blogger.com/profile/06852684074220765655noreply@blogger.com0