Today I released my first sound making app for iPad!
WaveShaper is an app for iPad that allows you to load up any audio file and make crazy cool sounds with it. It’s a lot like record scratching, but totally maxed out. This video will do a much better job of explaining it than words ever will:
I’ve been working on an iOS app for a little while called Body Heat. It was designed by Heather Kelley, with art by Amanda Williams. It is essentially a touch controller for audio-driven vibrators like the OhMiBod. However, even if you don’t have the hardware, the visuals for the app are quite pretty and it can be a fun little interactive experience. You can buy Body Heat from the App Store right now! Also worth mentioning is that the audio for the app is generated by a barebones port of Minim to C++, which I hope to eventually complete and release.
This is a beta build of the next release, which contains the new UGen framework developed by myself and Anderson Mills through his project at Numediart. There are still a few loose ends to clean up, primarily documentation related, but we expect to have everything wrapped by the end of June. Until then, feel free to give this build a whirl and see how you like the new real-time synthesis capabilities made possible by the UGen framework.
At this time, all of the documentation is in the form of Javadocs, which are included with the download. I hope that you find the docs for the UGen framework clear enough to get started. If not, there are also quite a few new examples included in the download that demonstrate how to use many of the UGens and how to programmatically sequence sound.
To install this release, you will simply unzip the archive into a folder named libraries in your sketch folder. This folder may already exist if you’ve installed other libraries not included with the Processing download; create the folder if it doesn’t exist. By installing this release in your sketchbook’s libraries folder, you will make Processing use this release instead of the release included with Processing. All of your existing sketches should still work. If you find one that doesn’t, please create an Issue on Github.
I am happy to announce the release of Minim 2.0.2! Download and installation instructions are available on the project page. Here’s what’s fixed and new, which you will also find in the changelog.txt file included with the distribution:
filenames were being parsed incorrectly by createRecorder.
fixed audio processing routines for AudioPlayer and AudioSnippet so that they don’t spend cycles doing nothing while not in the “play” state.
fixed the zombie thread bug, which kept audio processing Threads from exiting when close() was called.
fixed out-of-memory problems that could occur when large files were played. this does come at the cost of slower seek times.
fixed the isEnabled(AudioEffect) function, which, uh, wasn’t working.
fixed the pan() function, which was returning the BALANCE control.
added functions to FFT for doing forward transforms with an offset: forward(float samples, offset) and forward(AudioBuffer samples, offset)
added a freqToIndex(float freq) method to FFT for finding out the index of the spectrum band that contains the passed in frequency.
added a stop() method to AudioSample, so that playing samples can be immediately silenced.
added setPanNoGlide(float pan) to Controller, which will snap the panning setting of a sound to the provided value.
added setInputMixer(Mixer) and setOutputMixer(Mixer), which allow you to specify which Java Mixer object should be used when obtaining inputs (AudioInput) and outputs (AudioOuput, AudioPlayer, AudioSnippet, AudioSample).
While writing the example that I just posted, I discovered a couple nasty bugs that would have made a lot of people unhappy. For the curious, they were that the getChannel method was not returning the correct channel when using BufferedAudio.LEFT and BufferedAudio.RIGHT, and that stereo AudioSamples were only playing the left channel. All my tests thus far have used mono files, so that one just slipped past me. I’ve packed up a new release and updated the download page.
Egged on by the Processing 1.0 team, I spent today putting together a new release of Minim, which had been languishing on my computer. The lion’s share of the work was simply updating the examples and then uploading them. I really need to automate that process, it’s a big pain. Still not done: updating the manual.
A very important change to be aware of if you are upgrading, is that the Minim class is now instantiable. All of the load and get methods have been changed to regular old member functions, rather than static on the class. The static start(PApplet) method has been removed, you must now pass your sketch into the constructor, like so:
Minim minim = new Minim(this);
AudioPlayer player = minim.loadFile("blah.wav");
A very cool addition is getMetaData() for AudioPlayer, AudioSnippet, and AudioSample. The ability to read the ID3 tags from mp3 files was always there in the package I use for playing those, but I didn’t hook it up initially. Now all the tags you probably care about get stuffed into an AudioMetaData object when you load a file. Check out the online example.
An interesting implementation change is that I’ve broken out the Javasound specific code from the generic audio abstraction layer code. This means that there is now a package called ddf.minim.spi, which defines a bunch of interfaces that Minim uses to load files and acquire inputs and outputs. The key interface is MinimServiceProvider, which looks a lot like a slimmed down version of Minim’s interface. It is now possible for you implement MinimServiceProvider and then pass an instance of your implementation into the Minim constructor. Minim will use your implementation for all audio resource acquisition. This means that the default implementation, which uses Javasound, does exactly that and lives in jsminim.jar, which is included with the distro. One of the reasons that I did this was so that I could easily write an implementation of Minim that uses an FModEx Java binding. Work has begun on that, but it is not yet finished. Still, something to look forward to!
Additionally, the methods of AudioRecorder are ever so slightly different than those of AudioFileIn.
Another major change from 1.0 is the inclusion of a bunch of Interfaces that define library functionality. Essentially what I’ve done is defined how everything in the library should behave and then written an implementation of that spec. This is why createRecorder takes Recordable as the first argument and not an AudioInput or other concrete class. The use of Interfaces shouldn’t break any of your existing code because I used the existing methods of Minim as the starting point for the Interfaces.
I fixed a host of bugs relating to mp3 playback for this release. They should behave exactly like WAV and AU files now. There are many more examples now, one for each method of each Interface that defines the functionality of Minim classes. Examples are organized by Interface, rather than by concrete class, hopefully this isn’t too confusing for people.
Please let me know if you have any problems or questions!