/z-music.js

Z-MUSIC v1.10 and v2.08 for the web

Primary LanguageCBSD 3-Clause "New" or "Revised" LicenseBSD-3-Clause

z-music.js

Z-MUSIC v1.10 and v2.08 for the web

How to build

emcc should be installed via emsdk (Emscripten) beforehand.

% git clone https://github.com/toyoshim/z-music.js.git
% cd z-music.js
% git submodule update --init --recursive
% make

How to use

<html>
<head>
<script src="dist/zmusic.js"></script>
<script>
// Make XHR to support Promise.
function xhr (url) {
  return new Promise(function (resolve, reject) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.responseType = 'arraybuffer';
    xhr.addEventListener('load', e => {
      resolve(xhr.response);
      xhr.abort();
    }, false);
    xhr.send();
  });
}

Promise.all([
    ZMUSIC.install(),
    xhr('data/bgm1.zmd'),
    xhr('data/bgm.zpd')]).then(results => {
  ZMUSIC.play(results[1], results[2]);
});
</script>
</head>
<body><button onclick="ZMUSIC.resume()">Unmute</button></body>
</html>

WebAssembly

Now, z-music.js relies on WebAssembly by default. dist/zmusic.asm.js is still available for users who are not ready for WebAssembly, but not maintained well.

Initialize with detailed parameters

Use Z-MUSIC v1.10

ZMUSIC.install(['ZMUSIC110.X']);

Use Z-MUSIC v2.08 (default)

ZMUSIC.install(['ZMUSIC208.X']);

With Z-MUSIC options

ZMUSIC.install(['ZMUSIC110.X', '-n', '-u', -'t0', '-w0']);

With specified audio buffer size

ZMUSIC.install(null, { buffer: 8192 });

Redirect output to another AudioNode

ZMUSIC.install(null, { context: myAudioContext });
ZMUSIC.connect(myAudioNodeCreatedFromMyAudioContext);

Compile ZMS and play

Promise.all([
    ZMUSIC.install(),
    xhr('data/bgm1.zms')]).then(results => {
  ZMUSIC.compileAndPlay(results[1]);
});

.adpcm_block_data

If .adpcm_block_data command is used in ZMS and ZMD, play() or compileAndPlay() call will be asynchronously done. It returns Pomise to notify its completion.

The filename for the ZPD would be converted to a name in capitals. Since this is performed inside ZMUSIC.X, I have no plan to fix this problem. E.g., FooBar.zpd will be accessed by FOOBAR.ZPD and /FOOBAR.ZPD.

If someone request, I would add an asynchronous interface to handle ZPD file reads in a customized way.

Requires a user initiated interaction.

mobile Safari

Since mobile Safari does not allow us to playback any audio without user actions, you need to call the first play() or compileAndPlay() call inside an event handler for user actions.

Others

Today, other browsers have the same restriction with mobile Safari. You can resume audio playback at anytime after you call ZMUSIC.install() by calling ZMUSIC.resume() in an event handler for user actions.

<button onclick="ZMUSIC.resume()">Unmute</button>

ZMUSIC.js API

See src/prolog.js