I’m hard at work on Loopy 2.0.1, which will include a few improvements:
- A much bigger bottom display, with paged clock manipulation controls for easier access to the most-used functions
- A play/restart button on the main loops screen
- Clearer distinction between muted and unmuted tracks
- The option to automatically begin overdubbing after first record
- Import loops from Mail and other applications straight into a Loopy 2 session
- Single sign-on for SoundCloud, including Facebook link support
Look out for it soon.Read More
I’m very pleased to announce the launch of our new app, Loopy 2! It’s a pretty, easy-to-use but feature-packed looper for making music by layering looped recordings of singing, beatboxing or playing an instrument (or banging cutlery together).
It’s currently on sale for launch, so take a look! We’re very proud of it.Read More
I’m very happy to announce The Cartographer version 1.4!
This version brings new features from Google Maps to the iPhone: Routes and shapes. Now you can plot hiking routes, cycle paths or road trips on your computer using Google Maps, then sync them to your iPhone and take them with you.
Combined with The Cartographer’s existing offline mapping features, we think this is a really exciting feature for outdoorsy types and travellers.
So, we hope you enjoy 1.4! It’s available right now from the App Store.Read More
There are a hundred and one proposed solutions out there for how to move
UITextView out of the way of the keyboard during editing — usually, it comes down to observing
UIKeyboardWillHideNotification, or implementing
UITextFieldDelegate delegate methods, and adjusting the frame of the superview, or using
scrollToRowAtIndexPath:atScrollPosition:animated:, but all the proposed solutions I’ve found tend to be quite DIY, and have to be implemented for each view controller that needs it.
I thought I’d put together a relatively universal, drop-in solution:
UITableView subclasses that handle everything.
When the keyboard is about to appear, the subclass will find the subview that’s about to be edited, and adjust its frame and content offset to make sure that view is visible, with an animation to match the keyboard pop-up. When the keyboard disappears, it restores its prior size.
It should work with basically any setup, either a UITableView-based interface, or one consisting of views placed manually.Read More
From the iPhone 3Gs up, it’s possible to encode compressed AAC audio from PCM audio data. That means great things for apps that deal with audio sharing and transmission, as the audio can be sent in compressed form, rather than sending huge PCM audio files over the network.
Apple’s produced some sample code (iPhoneExtAudioFileConvertTest), which demonstrates how it’s done, but their implementation isn’t particularly easy to use in existing projects, as it requires some wrapping to make it play nice.
For my upcoming looper app Loopy, I’ve put together a simple Objective-C class that performs the conversion of any audio file to an AAC-encoded m4a, asynchronously with a delegate, or converts any audio provided by a data source class (which provides for recording straight to AAC) and I thought I’d share it.Read More
Circular buffers are pretty much what they sound like – arrays that wrap around. They’re fantastically useful as scratch space for audio processing, and generally passing audio around efficiently.
They’re designed for FIFO (first-in-first-out) use, like storing audio coming in the microphone for later playback or processing.
Consider a naive alternative: You copy the incoming audio into an NSData you allocate, and then pass that NSData off. This means you’re allocating memory each time, and deallocating the memory later once you’re done processing. That allocation incurs a penalty, which can be a show-stopper when part of an audio pipeline – The Core Audio documentation advises against any allocations when within a render callback, for example.
Alternatively, you can allocate space in advance, and write to that, but that has problems too: Either you have a synchronisation nightmare, or you spend lots of time moving bytes around so that the unprocessed audio is always at the beginning of the array.
A better solution is to use a circular buffer, where data goes in at the head, and is read from the tail. When you produce data at the head, the head moves up the array, and wraps around at the end. When you consume at the tail, the tail moves up too, so the tail chases the head around the circle.
Here’s a simple C implementation I recently put together for my app Loopy: TPCircularBufferRead More