To develop the Impulse firmware, we first wrote a software simulation of the hardware in Cocoa. Using this, we could rapidly redesign the UI and test out the button layout, and we could also write almost all of the device’s application level firmware before the hardware was even built.
We could turn around design changes very rapidly and distribute the simulator to the team, long before there was a firmware update process for the hardware.
On top of this, we had the full benefit of the Xcode tool chain (static analyser, unit test harness, debugger etc.) applied to the embedded firmware, which helped enormously to improve the quality and stability of the device.
Once the hardware arrived, we would regression test any bugs found against the simulator – this helped to pin down hardware / low level firmware issues quickly, for example if the bug did not appear in the simulator.
This was all very useful, and we are already using this technique for new products – this time on iPads and iPhones for a more accurate user experience (one problem with the Impulse simulator was button combinations – we had to make the “shift” button sticky, which made it confusing to operate).
What should we do with the simulators once the hardware has been released? We still use them for debugging and testing, and I put a simple synth into the Impulse simulator one hackday… but could they become products in their own right?
What else could we do to make simulators more powerful?