04.04.2013 Views

Real-time Music Synthesis in Java - bomers.de

Real-time Music Synthesis in Java - bomers.de

Real-time Music Synthesis in Java - bomers.de

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Real</strong>-<strong>time</strong> <strong>Music</strong> <strong>Synthesis</strong> <strong>in</strong><br />

<strong>Java</strong> with the Metronome<br />

Garbage Collector<br />

Joshua Auerbach David F. Bacon<br />

IBM Research IBM Research<br />

Florian Bomers Perry Cheng<br />

Bome Software IBM Research<br />

International Computer <strong>Music</strong> Conference Copenhagen 30 August 2007


2<br />

<strong>Real</strong>-<strong>time</strong> <strong>Music</strong> <strong>Synthesis</strong> <strong>in</strong> <strong>Java</strong> us<strong>in</strong>g the Metronome Garbage Collector<br />

It’s a <strong>Real</strong>-<strong>time</strong> World<br />

30 MLOC<br />

1ms<br />

50 MLOC<br />

5ms<br />

80 MLOC<br />

10us - 100ms<br />

60 MLOC<br />

10ms<br />

100 MLOC<br />

10us - 10ms<br />

Bacon/Bomers ICMC’07 - Copenhagen 30 August 2007


3<br />

<strong>Real</strong>-<strong>time</strong> <strong>Music</strong> <strong>Synthesis</strong> <strong>in</strong> <strong>Java</strong> us<strong>in</strong>g the Metronome Garbage Collector<br />

Why <strong>Real</strong>-Time <strong>Java</strong>??<br />

Traditional methodologies<br />

• Highly restricted programm<strong>in</strong>g mo<strong>de</strong>ls with verifiable properties<br />

• And/Or low-level languages for explicit control<br />

• “ad-hoc low-level methods with validation by simulation and prototyp<strong>in</strong>g”<br />

But: these methodologies do not scale<br />

• Halt<strong>in</strong>g problem<br />

• Low productivity (low-level languages, hand-optimization)<br />

And: complexity of real-<strong>time</strong> systems are grow<strong>in</strong>g extremely fast<br />

• From isolated <strong>de</strong>vices to <strong>in</strong>tegrated multi-level networked systems<br />

• Traditional methodologies break down<br />

Bacon/Bomers ICMC’07 - Copenhagen 30 August 2007


4<br />

<strong>Real</strong>-<strong>time</strong> <strong>Music</strong> <strong>Synthesis</strong> <strong>in</strong> <strong>Java</strong> us<strong>in</strong>g the Metronome Garbage Collector<br />

Why Not <strong>Real</strong>-<strong>time</strong> <strong>Java</strong>?<br />

Garbage Collection<br />

• Non-<strong>de</strong>term<strong>in</strong>istic pauses from 100 ms to 1 second<br />

• Requirement for real-<strong>time</strong> behavior is 100 us to 10 ms<br />

Dynamic (JIT) Compilation<br />

• Unpredictable <strong>in</strong>terruptions<br />

• Large variation <strong>in</strong> speed (10x)<br />

Dynamic Load<strong>in</strong>g and Resolution<br />

• Semantics <strong>de</strong>term<strong>in</strong>ed by run-<strong>time</strong> or<strong>de</strong>r<strong>in</strong>g<br />

Optimization technology optimizes average case<br />

• Th<strong>in</strong> locks, speculative <strong>in</strong>-l<strong>in</strong><strong>in</strong>g, value prediction, etc.<br />

• Some<strong>time</strong>s cause non-<strong>de</strong>term<strong>in</strong>istic slowdowns<br />

…<br />

Bacon/Bomers ICMC’07 - Copenhagen 30 August 2007


5<br />

<strong>Real</strong>-<strong>time</strong> <strong>Music</strong> <strong>Synthesis</strong> <strong>in</strong> <strong>Java</strong> us<strong>in</strong>g the Metronome Garbage Collector<br />

Demo: Synthesizer on Non-RT <strong>Java</strong><br />

Bacon/Bomers ICMC’07 - Copenhagen 30 August 2007


6<br />

<strong>Real</strong>-<strong>time</strong> <strong>Music</strong> <strong>Synthesis</strong> <strong>in</strong> <strong>Java</strong> us<strong>in</strong>g the Metronome Garbage Collector<br />

Garbage Collection: Motivation & History<br />

Invented <strong>in</strong> 1960 by McCarthy for Lisp<br />

• Objects are reclaimed automatically when no longer <strong>in</strong> use<br />

Huge advantages:<br />

• No bugs due to free<strong>in</strong>g of memory still <strong>in</strong> use<br />

• Simpler <strong>in</strong>terfaces s<strong>in</strong>ce life<strong>time</strong> management not required<br />

• Type safety<br />

• Security<br />

Used <strong>in</strong>:<br />

• Lisp, Smalltalk, ML, <strong>Java</strong>, C#, Lua, Python, …<br />

But not <strong>in</strong>:<br />

• C, C++, Pascal, Ada, Fortran, …<br />

Bacon/Bomers ICMC’07 - Copenhagen 30 August 2007


7<br />

<strong>Real</strong>-<strong>time</strong> <strong>Music</strong> <strong>Synthesis</strong> <strong>in</strong> <strong>Java</strong> us<strong>in</strong>g the Metronome Garbage Collector<br />

Previous Partial Solutions to GC Problems<br />

Two ma<strong>in</strong> types<br />

• Generational Collection (Ungar)<br />

• Incremental Collection (Dijkstra, Yuasa)<br />

Many pathologies:<br />

• High nursery survival rate (1ms -> 40ms collection)<br />

• Atomic root snapshot (no thread scal<strong>in</strong>g)<br />

• Unpredictable term<strong>in</strong>ation (“last” po<strong>in</strong>ter problem, 100s of ms)<br />

• Inability to handle large objects <strong>in</strong> real-<strong>time</strong><br />

• Uneven utilization (driven by allocation or po<strong>in</strong>ter access)<br />

• Subject to fragmentation<br />

• High (some<strong>time</strong>s unboun<strong>de</strong>d) memory overhead<br />

• Failure to <strong>in</strong>crementalize weak reference, f<strong>in</strong>alizers, str<strong>in</strong>gs, …<br />

Bacon/Bomers ICMC’07 - Copenhagen 30 August 2007


8<br />

<strong>Real</strong>-<strong>time</strong> <strong>Music</strong> <strong>Synthesis</strong> <strong>in</strong> <strong>Java</strong> us<strong>in</strong>g the Metronome Garbage Collector<br />

<strong>Java</strong> for <strong>Real</strong>-<strong>time</strong>: Current Practice<br />

Avoid allocation after setup<br />

• Low-level programm<strong>in</strong>g, vulnerable to allocation by libraries<br />

Allocate from object pools<br />

• Only works for homogeneous objects, suffers from “free” bugs<br />

Use Scoped memory constructs of RTSJ<br />

• Manual, suffers from unpredictable run-<strong>time</strong> exceptions<br />

Use a generational collector<br />

• Puts off the <strong>in</strong>evitable, slow when survival rate is high<br />

Use an <strong>in</strong>cremental collector<br />

• Often works but subject to numerous failure mo<strong>de</strong>s<br />

Use reference count<strong>in</strong>g (automatic or manual)<br />

• Does not collect cycles (at least not predictably)<br />

Bacon/Bomers ICMC’07 - Copenhagen 30 August 2007


9<br />

<strong>Real</strong>-<strong>time</strong> <strong>Music</strong> <strong>Synthesis</strong> <strong>in</strong> <strong>Java</strong> us<strong>in</strong>g the Metronome Garbage Collector<br />

Metronome: RT GC without Pathologies<br />

All phases of collection <strong>in</strong>crementalized<br />

All collector work <strong>de</strong>ferrable to next <strong>de</strong>sired quantum<br />

Schedul<strong>in</strong>g regular and guaranteed by metric (MMU)<br />

Threads processed <strong>in</strong><strong>de</strong>pen<strong>de</strong>ntly<br />

Internal fragmentation boun<strong>de</strong>d (parameter, use 1/8)<br />

External fragmentation prevented (on-<strong>de</strong>mand compact)<br />

Large objects broken <strong>in</strong>to pieces (“arraylets”)<br />

Constant-<strong>time</strong> allocation<br />

S<strong>in</strong>gle-quantum term<strong>in</strong>ation<br />

Simple and provable feasibility: live memory, allocation rate<br />

Result: application allocat<strong>in</strong>g 10 MB/s, with 1000 threads, 1 GB<br />

heap, 10 MB objects, and many phase changes can run for weeks<br />

with zero violations, 2ms worst-case latency<br />

Bacon/Bomers ICMC’07 - Copenhagen 30 August 2007


10<br />

<strong>Real</strong>-<strong>time</strong> <strong>Music</strong> <strong>Synthesis</strong> <strong>in</strong> <strong>Java</strong> us<strong>in</strong>g the Metronome Garbage Collector<br />

IBM <strong>Real</strong>-Time <strong>Java</strong> (J9 Virtual Mach<strong>in</strong>e)<br />

Metronome <strong>Real</strong>-<strong>time</strong> Garbage Collection<br />

• Provi<strong>de</strong>s real-<strong>time</strong> without chang<strong>in</strong>g the programm<strong>in</strong>g mo<strong>de</strong>l<br />

RTSJ (<strong>Real</strong>-Time Specification for <strong>Java</strong>) – exist<strong>in</strong>g standard<br />

• Schedul<strong>in</strong>g<br />

• Scopes<br />

Ahead-of-Time Compilation<br />

• Ahead-of-<strong>time</strong> (AOT) compilation and JXE L<strong>in</strong>k<strong>in</strong>g<br />

• Removes JIT non-<strong>de</strong>term<strong>in</strong>ism, allows co<strong>de</strong> to be moved <strong>in</strong>to ROM<br />

• Class pre-load<strong>in</strong>g<br />

<strong>Real</strong>-<strong>time</strong> L<strong>in</strong>ux<br />

• Maximize use of exist<strong>in</strong>g patches; stabilize; add nee<strong>de</strong>d features<br />

• Contribute to open-source community<br />

Status<br />

• Shipp<strong>in</strong>g product s<strong>in</strong>ce 8/06, over $100M contract revenue<br />

• In use <strong>in</strong> telecom, military, and f<strong>in</strong>ancial <strong>in</strong>dustries<br />

Bacon/Bomers ICMC’07 - Copenhagen 30 August 2007


11<br />

<strong>Real</strong>-<strong>time</strong> <strong>Music</strong> <strong>Synthesis</strong> <strong>in</strong> <strong>Java</strong> us<strong>in</strong>g the Metronome Garbage Collector<br />

Harmonicon <strong>Java</strong> Synthesizer<br />

Bacon/Bomers ICMC’07 - Copenhagen 30 August 2007


12<br />

<strong>Real</strong>-<strong>time</strong> <strong>Music</strong> <strong>Synthesis</strong> <strong>in</strong> <strong>Java</strong> us<strong>in</strong>g the Metronome Garbage Collector<br />

<strong>Java</strong> for <strong>Real</strong>-<strong>time</strong> MIDI <strong>Synthesis</strong><br />

Typical real-<strong>time</strong> music application<br />

Requires max 5-10ms latency, 1-2ms jitter<br />

Harmonicon: all-<strong>Java</strong> synthesizer<br />

• SoundFont-2 wavetable synthesizer<br />

• 64-bit sample precision<br />

• Arbitrary polyphony (500 voices on current hardware)<br />

• Concurrent (multiprocessor) ren<strong>de</strong>r<strong>in</strong>g<br />

• Modular, flexible, high-level <strong>de</strong>sign<br />

• Extensive use of object-orientation and dynamic allocation<br />

Bacon/Bomers ICMC’07 - Copenhagen 30 August 2007


13<br />

<strong>Real</strong>-<strong>time</strong> <strong>Music</strong> <strong>Synthesis</strong> <strong>in</strong> <strong>Java</strong> us<strong>in</strong>g the Metronome Garbage Collector<br />

Harmonicon Synthesizer Architecture<br />

Bacon/Bomers ICMC’07 - Copenhagen 30 August 2007


14<br />

<strong>Real</strong>-<strong>time</strong> <strong>Music</strong> <strong>Synthesis</strong> <strong>in</strong> <strong>Java</strong> us<strong>in</strong>g the Metronome Garbage Collector<br />

Experimental Evaluation<br />

Experimental Environment<br />

• Dual Opteron 250 CPUs (2.4 GHz, 1MB L2 cache)<br />

• M-Audio 2496 sound card (MIDI <strong>in</strong>, RCA out)<br />

• IBM <strong>Real</strong>-<strong>time</strong> L<strong>in</strong>ux (RHEL 4 U2, 2.6.16 based)<br />

• IBM Websphere <strong>Real</strong>-<strong>time</strong> <strong>Java</strong> V1 SR1<br />

• Debussy’s Doctor Gradus, Piano 1 <strong>in</strong>strument, max polyphony 13<br />

• 44.1 KHz 32-bit stereo<br />

• Additional 8 MB/s memory load thread execut<strong>in</strong>g at all <strong>time</strong>s<br />

Measurements<br />

• Evaluation of base MIDI latency/jitter<br />

• Absolute measurements vs. Kurzweil K2000R<br />

• Comparison of 4 garbage collectors<br />

Bacon/Bomers ICMC’07 - Copenhagen 30 August 2007


15<br />

<strong>Real</strong>-<strong>time</strong> <strong>Music</strong> <strong>Synthesis</strong> <strong>in</strong> <strong>Java</strong> us<strong>in</strong>g the Metronome Garbage Collector<br />

Demo: <strong>Synthesis</strong> with RT <strong>Java</strong><br />

1ms buffer,<br />

AOT compilation,<br />

class preload<strong>in</strong>g<br />

Bacon/Bomers ICMC’07 - Copenhagen 30 August 2007


16<br />

<strong>Real</strong>-<strong>time</strong> <strong>Music</strong> <strong>Synthesis</strong> <strong>in</strong> <strong>Java</strong> us<strong>in</strong>g the Metronome Garbage Collector<br />

Absolute Latency Measurements<br />

Bacon/Bomers ICMC’07 - Copenhagen 30 August 2007


17<br />

<strong>Real</strong>-<strong>time</strong> <strong>Music</strong> <strong>Synthesis</strong> <strong>in</strong> <strong>Java</strong> us<strong>in</strong>g the Metronome Garbage Collector<br />

Base MIDI Latency (milliseconds)<br />

M<strong>in</strong> Mean Max StDev<br />

ALSA via C 0.340 0.347 0.362 0.011<br />

<strong>Java</strong> Sound 0.385 1.455 3.197 0.701<br />

ALSA via<br />

<strong>Java</strong>/JNI<br />

0.385 0.406 0.430 0.011<br />

Bacon/Bomers ICMC’07 - Copenhagen 30 August 2007


18<br />

<strong>Real</strong>-<strong>time</strong> <strong>Music</strong> <strong>Synthesis</strong> <strong>in</strong> <strong>Java</strong> us<strong>in</strong>g the Metronome Garbage Collector<br />

Harmonicon vs Kurzweil K2000R<br />

Kurzweil<br />

K2000R<br />

Harmonicon<br />

(1ms buffer)<br />

Harmonicon<br />

(365us buffer,<br />

no GC)<br />

M<strong>in</strong> Mean Max StDev<br />

2.925 3.909 4.897 0.570<br />

4.240 4.959 5.736 0.317<br />

2.947 3.120 3.310 0.109<br />

Bacon/Bomers ICMC’07 - Copenhagen 30 August 2007


19<br />

<strong>Real</strong>-<strong>time</strong> <strong>Music</strong> <strong>Synthesis</strong> <strong>in</strong> <strong>Java</strong> us<strong>in</strong>g the Metronome Garbage Collector<br />

GC Comparisons: ALSA Un<strong>de</strong>rruns<br />

Bacon/Bomers ICMC’07 - Copenhagen 30 August 2007


20<br />

<strong>Real</strong>-<strong>time</strong> <strong>Music</strong> <strong>Synthesis</strong> <strong>in</strong> <strong>Java</strong> us<strong>in</strong>g the Metronome Garbage Collector<br />

GC Comparisons: Audio Discont<strong>in</strong>uities<br />

Bacon/Bomers ICMC’07 - Copenhagen 30 August 2007


21<br />

<strong>Real</strong>-<strong>time</strong> <strong>Music</strong> <strong>Synthesis</strong> <strong>in</strong> <strong>Java</strong> us<strong>in</strong>g the Metronome Garbage Collector<br />

http://www.research.ibm.com/metronome<br />

Bacon/Bomers ICMC’07 - Copenhagen 30 August 2007


22<br />

<strong>Real</strong>-<strong>time</strong> <strong>Music</strong> <strong>Synthesis</strong> <strong>in</strong> <strong>Java</strong> us<strong>in</strong>g the Metronome Garbage Collector<br />

Metronome:Transparent <strong>Real</strong>-<strong>time</strong> <strong>Java</strong><br />

C++ Application<br />

C++ Run<strong>time</strong> System<br />

Manual, Unsafe<br />

Predictable<br />

<strong>Java</strong> Application<br />

Garbage<br />

Collection<br />

<strong>Java</strong> Run<strong>time</strong> System<br />

(JVM)<br />

Automatic, Safe<br />

Unpredictable<br />

<strong>Java</strong> Application<br />

Metronome<br />

<strong>Java</strong> Run<strong>time</strong> System<br />

Automatic, Safe<br />

Predictable<br />

Bacon/Bomers ICMC’07 - Copenhagen 30 August 2007


23<br />

<strong>Real</strong>-<strong>time</strong> <strong>Music</strong> <strong>Synthesis</strong> <strong>in</strong> <strong>Java</strong> us<strong>in</strong>g the Metronome Garbage Collector<br />

Testbed 1: Autonomous Quad-rotor Helicopter<br />

S<strong>in</strong>gle-helicopter control<br />

• Fully custom <strong>de</strong>sign<br />

• Completely <strong>Java</strong>-based<br />

• 3 ms control loop period<br />

[with Christoph Kirsch, University of Salzburg]<br />

Key Goals<br />

• Validate with most critical<br />

physical control systems<br />

• Time-portable real-<strong>time</strong><br />

software<br />

• Compositional real-<strong>time</strong> 1 m<br />

–Dynamic upload of other RT systems<br />

Bacon/Bomers ICMC’07 - Copenhagen 30 August 2007

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!