SoundGrid 3.2

October 19, 2010
SoundGrid 3.2 has been released. Not so many changes in this new version:
  • Layers scrolling in different device orientations fixed
  • Notes now played on touch even if the song itself is stopped
  • Support for copying recorded audio tracks to clipboard to use in other apps
SoundGrid on the AppStore

Browse and listen to Shared Grids in web browser

September 22, 2010

Great news! Now everybody can browse SoundGrid shared Grids and listen to them right in web browser! No iDevice required.

Just navigate to Sortable by date or user rating. Only Grids created in Song Mode are available.

Note: encoding process is taking place now, not all grids are available on the site yet, be patient. 


Duplicate shared Grids in SoundGrid

September 18, 2010
While SoundGrid users are free to download shared Grids, modify them to create their own Grids and share back, sometimes users publish Grids that exactly duplicate Grids shared by other users, either by mistake or intentionally. Sometimes even duplicate Grid gets better rating that the original one. This is obviously unacceptable. 

From now on there are two rules when sharing Grids:
  1. When publishing Grid that duplicate another Grid published before by another user, the new Grid won’t be published.
  2. When publishing Grid that duplicate another Grid published before by the same user but with different name, the old grid will be renamed without publishing the new Grid.
All already shared duplicate grids will be removed leaving only originals.

32/64 bit problems on osx

May 26, 2010

By default gcc on mac builds 64bit binaries. My app depends on Urbi and Player/Stage. Urbi depends on Boost, Player depends on Boost, Stage depends on Player and on FLTK. FLTK is 32 bit only!

Spent all the day trying to get all this shit to work.


What’s new in SoundGrid 3 – part 2

April 21, 2010
In the first part we talked about new features accessible from main application screen, so now I’ll tell you what’s new in the menu and about Web Console.

Actually besides the new design there are not so many changes. One of them is possibility to export recorded tracks in uncompressed WAV format (previously only AAC compressed files could be exported). List of additional downloadable instruments now has special button to automatically download all missing instruments for the current project. Sort by rating in Shared Grids now works better taking into account number of ratings too. And finally most awaited new feature in this version in Web Console. It currently has three functions. First, it allows users to send crash reports in case of application crash. This will help me to diagnose and fix problem. Second, it’s possible to download recorded tracks from Web Console. This is especially useful for downloading uncomressed WAV files because it’s usually not possible to send so large files via email. And lastly (and actually what it was created for), Web Console allows you to manage instruments, including uploading of your own samples to create new instruments. Not so much to comment here. You can upload your samples to newly created instrument (uploading of many files at once in ZIP archive is supported), specify MIDI note name and/or sample name…  …And then assign these samples to grid rows. Now creation of new instruments is very easy. If you want your instrument to be publicly available, click Download button and then send me archived instrument. 

What’s new in SoundGrid 3 – part 1

April 16, 2010
While SoundGrid 3 is being reviewed by Apple it’s time to tell you what’s new in this version.

First of all it has greatly optimized sound engine for even better sound quality and lower latency. And of course many bugfixes and other improvements. But sound engine is inside. What’s most of all visible for users is surely completely redesigned UI. It now has landscape orientation which allowed to place more controls on the main screen to quickly access most important options. Middle part of the screen is occupied by the matrix itself (not surprising) and on both sides from it various buttons are located, most of which show additional panels instead of the matrix in the middle part. No need to explain Play/Pause/Record buttons so lets move to others. On the left side there are buttons for switching current layer and pattern, and for showing panels related to current layer. On the right buttons related to entire project or system are located. Following image shows Instrument Selector panel overlaid over the grid. These buttons are smart - if you touch them briefly, panel will show and stay but if you hold them longer it will close when you release it. So you can quickly activate panel with one hand, make changes with another and it will automatically hide when you remove finger from the button. Next new thing is the Mixer panel. It allows you to see levels for all layers at once and change any of them (multitouch supported). Next, Amplitude Envelope control. You see, some panels may have different modes of operation switchable by buttons located on the opposite side from the panel activation button, controls themselves are always located in the middle part of the screen. Play button always stays on top so you can stop/resume at any time. I hope you will like these interface changes! By the way, on the above picture there’s current sequencer mode indicator just above Pause button. Modes now switched by touching and holding Play/Pause button. In addition to sequencer modes there are now two used input modes - usual Normal Mode and Draw Mode in which notes will play as you touch the matrix or draw over it, of course multitouch is supported too. Current mode indicator/switch is located in top-right corner of the screen. Normal mode slightly upgraded too, now if you touch the matrix briefly, note will play; touch hold longer to activate note (this can be switched off in settings). If you touch and move slightly over the grid (preventing note activation), translucent hint with note/sample names will slide from the left to help you find the one you need. Next, new pattern menu with clear and randomize pattern buttons and new function - copy/paste pattern between layers or projects. One more completely new mode of operations - Live Play mode. It gives you overview of all layers and patterns on the one screen and allows to quickly switch pattern for any layer. If you touch any pattern, it will be activated, if you touch twice, the same pattern (by number of course) will be activate for all layers. But if you touch and hold longer, pattern will be queued and activated after the current one! I hope this mode will make live performances and recording much more comfortable. That’s all for now, in the next part I’ll tell you what’s new in the Menu and about powerful Web Console.

Web Console in SoundGrid 3

April 13, 2010
…allows to quickly add your own samples to the app (and download recorded tracks too).

Live Play mode in SoundGrid 3

April 3, 2010
New Live Play mode in SoundGrid 3 shows overview of all layers and patterns on one screen. It allows to quickly switch pattern for any layer and (new!) to select next pattern that will be automatically activated after the current one. This will make SoundGrid better suited for live performance/recording.

SoundGrid 3 screenshots

March 29, 2010
As I promised on Twitter, here are screenshots of the upcoming SoundGrid 3. No comments at this moment, only pictures. And some things still need to be done, mostly related to web-based management console. Planning to finish and release next week.

iPhone VFP and memory performance

March 18, 2010

I have array of floats for output buffer and array of shorts for input. I need to add values from input buffer to values in output buffer. Using VFP unit the code looks as follows:

int temp[8];
while (numVectors--)
  temp[0] = bin[0];
  temp[1] = bin[1];
  temp[2] = bin[2];
  temp[3] = bin[3];
  temp[4] = bin[4];
  temp[5] = bin[5];
  temp[6] = bin[6];
  temp[7] = bin[7];
  ASM ("fldmias  %0, {s8-s15} \n\t"
       "fldmias  %2, {s16-s23} \n\t"
       "fsitos s16,s16 \n\t"
       "fsitos s17,s17 \n\t"
       "fsitos s18,s18 \n\t"
       "fsitos s19,s19 \n\t"
       "fsitos s20,s20 \n\t"
       "fsitos s21,s21 \n\t"
       "fsitos s22,s22 \n\t"
       "fsitos s23,s23 \n\t"
       "fadds s8, s8, s16 \n\t"
       "fstmias  %0!, {s8-s15} \n\t" 
       : "=r" (bout)
       : "0" (bout), "r" (temp)
       : (long reg list was here);

So shorts first converted to ints (pair of ldrsh/str operations), then loaded into VFP vector, converted to floats and added to existing values in output buffer eight-at-once. This works without problems and is fast.

Then I tried to preconvert shorts to floats and use array of floats as input to get rid of extra short->int->float conversion:

while (numVectors--)
  ASM ("fldmias  %0, {s8-s15} \n\t"
       "fldmias  %1!, {s16-s23} \n\t"
       "fadds s8, s8, s16 \n\t"
       "fstmias  %0!, {s8-s15} \n\t" 
       : "=r" (bout), "=r" (fbin)
       : "0" (bout), "1" (fbin)
       : (long reg list was here);

Imaging how was I surprised when measurements showed this code is actually much slower then previous. I’m not quite sure why but I think this is because array of floats takes twice more memory than array of shorts of the same length. It seems because of some caching access to large regions of memory is much slower than extra copy operations and VFP conversion together but accessing lesser memory range.

You should never "optimize" anything without doublechecking that things are really optimized, even if it looks obvious.