Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 3b2036b

Browse files
Version 2.2.0
- Completely updated API with full support for module-less operation. - Decoder! Loading and decoding audio in any Worker, independently from the web browser. - AdvancedAudioPlayer! Playing audio with all features available in the native Superpowered version, including time-stretching and pitch-shifting, looping, slip mode, etc.
1 parent 2f5cb42 commit 3b2036b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+6284
-453
lines changed

‎docs.html‎

Lines changed: 679 additions & 65 deletions
Large diffs are not rendered by default.

‎docs_js_css/main.css‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ p + p { margin-top: 1rem; }
5757
main ol, main ul { margin: 1rem 0; }
5858
main ol { list-style-type: decimal; }
5959
main li { margin-left: 4rem; }
60+
ul { list-style-type: disc; }
61+
dt { font-weight: 600; margin-left: 1rem; margin-top: 0.5rem; }
62+
dd { margin-left: 2rem; }
6063

6164
ul#toc { list-style-type: none; }
6265
ul#toc li { margin-bottom: 3px; }

‎example_effects/main.js‎

Lines changed: 43 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import SuperpoweredModulefrom '../superpowered.js'
1+
import {SuperpoweredGlue,SuperpoweredWebAudio}from './superpowered/SuperpoweredWebAudio.js';
22

33
const states = { NOTRUNNING: 'START', INITIALIZING: 'INITIALIZING', RUNNING: 'STOP' }
44

55
var state = states.NOTRUNNING;
6-
var audioContext = null; // Reference to the audio context.
7-
var audioNode = null; // This example uses one audio node only.
6+
var webaudioManager = null; // The SuperpoweredWebAudio helper class managing Web Audio for us.
87
var Superpowered = null; // Reference to the Superpowered module.
8+
var audioNode = null; // This example uses one audio node only.
99

1010
function setState(newState) {
1111
state = newState;
@@ -20,9 +20,9 @@ function onMessageFromAudioScope(message) {
2020
async function toggleAudio() {
2121
if (state == states.NOTRUNNING) {
2222
setState(states.INITIALIZING);
23-
audioContext = Superpowered.getAudioContext(44100);
23+
webaudioManager = newSuperpoweredWebAudio(44100,Superpowered);
2424

25-
let micStream = await Superpowered.getUserMediaForAudioAsync({ 'fastAndTransparentAudio': true })
25+
let micStream = await webaudioManager.getUserMediaForAudioAsync({ 'fastAndTransparentAudio': true })
2626
.catch((error) => {
2727
// called when the user refused microphone permission
2828
console.log(error);
@@ -31,44 +31,52 @@ async function toggleAudio() {
3131
if (!micStream) return;
3232

3333
let currentPath = window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/'));
34-
audioNode = await Superpowered.createAudioNodeAsync(audioContext,currentPath + '/processor.js', 'MyProcessor', onMessageFromAudioScope);
35-
let audioInput = audioContext.createMediaStreamSource(micStream);
34+
audioNode = await webaudioManager.createAudioNodeAsync(currentPath + '/processor.js', 'MyProcessor', onMessageFromAudioScope);
35+
let audioInput = webaudioManager.audioContext.createMediaStreamSource(micStream);
3636
audioInput.connect(audioNode);
37-
audioNode.connect(audioContext.destination);
37+
audioNode.connect(webaudioManager.audioContext.destination);
3838
setState(states.RUNNING);
3939
} else if (state == states.RUNNING) {
4040
// stop everything
41-
audioContext.close();
42-
audioContext = audioNode = null;
41+
webaudioManager.audioContext.close();
42+
webaudioManager = audioNode = null;
4343
setState(states.NOTRUNNING);
4444
}
4545
}
4646

47-
SuperpoweredModule({
48-
licenseKey: 'ExampleLicenseKey-WillExpire-OnNextUpdate',
49-
enableAudioEffects: true,
50-
enableAudioAnalysis: true,
47+
async function loadJS() {
48+
// download and instantiate Superpowered
49+
Superpowered = await SuperpoweredGlue.fetch('./superpowered/superpowered.wasm');
50+
Superpowered.Initialize({
51+
licenseKey: 'ExampleLicenseKey-WillExpire-OnNextUpdate',
52+
enableAudioAnalysis: true,
53+
enableFFTAndFrequencyDomain: false,
54+
enableAudioTimeStretching: false,
55+
enableAudioEffects: true,
56+
enableAudioPlayerAndDecoder: false,
57+
enableCryptographics: false,
58+
enableNetworking: false
59+
});
5160

52-
onReady: function(SuperpoweredInstance) {
53-
Superpowered = SuperpoweredInstance;
54-
// UI: innerHTML may be ugly but keeps this example small
55-
document.getElementById('content').innerHTML = '\
56-
<p>Put on your headphones first, you\'ll be deaf due audio feedback otherwise.</p>\
57-
<p id="audioStack" style="font-style: italic"></p>\
58-
<p><button id="btn">-</button></p>\
59-
<p>Reverb wet: <input type="range" min="0" max="100" value="50" class="reverbslider" id="wet"></p>\
60-
<p>Filter frequency: <input type="range" min="0" max="100" value="50" class="filterslider" id="freq"></p>\
61-
';
61+
// UI: innerHTML may be ugly but keeps this example small
62+
document.getElementById('content').innerHTML = '\
63+
<p>Put on your headphones first, you\'ll be deaf due audio feedback otherwise.</p>\
64+
<p id="audioStack" style="font-style: italic"></p>\
65+
<p><button id="btn">-</button></p>\
66+
<p>Reverb wet: <input type="range" min="0" max="100" value="50" class="reverbslider" id="wet"></p>\
67+
<p>Filter frequency: <input type="range" min="0" max="100" value="50" class="filterslider" id="freq"></p>\
68+
';
6269

63-
document.getElementById('audioStack').innerText = window.AudioWorkletNode ? 'worklet' : 'legacy';
64-
document.getElementById('btn').onclick = toggleAudio;
65-
document.getElementById('wet').oninput = function() {
66-
if (audioNode != null) audioNode.sendMessageToAudioScope({ 'wet': this.value });
67-
}
68-
document.getElementById('freq').oninput = function() {
69-
if (audioNode != null) audioNode.sendMessageToAudioScope({ 'freq': this.value });
70-
}
71-
72-
setState(states.NOTRUNNING);
70+
document.getElementById('audioStack').innerText = window.AudioWorkletNode ? 'worklet' : 'legacy';
71+
document.getElementById('btn').onclick = toggleAudio;
72+
document.getElementById('wet').oninput = function() {
73+
if (audioNode != null) audioNode.sendMessageToAudioScope({ 'wet': this.value });
7374
}
74-
});
75+
document.getElementById('freq').oninput = function() {
76+
if (audioNode != null) audioNode.sendMessageToAudioScope({ 'freq': this.value });
77+
}
78+
79+
setState(states.NOTRUNNING);
80+
}
81+
82+
loadJS();

‎example_effects/processor.js‎

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,18 @@
1-
import SuperpoweredModule from '../superpowered.js'
2-
3-
var Superpowered = null;
1+
import { SuperpoweredWebAudio } from './superpowered/SuperpoweredWebAudio.js';
42

53
function calculateFrequency(value, minFreq, maxFreq) {
64
if (value > 0.97) return maxFreq;
75
if (value < 0.03) return minFreq;
86
return Math.min(maxFreq, Math.pow(10.0, (value + ((0.4 - Math.abs(value - 0.4)) * 0.3)) * Math.log10(maxFreq - minFreq)) + minFreq);
97
}
108

11-
class MyProcessor extends SuperpoweredModule.AudioWorkletProcessor {
9+
class MyProcessor extends SuperpoweredWebAudio.AudioWorkletProcessor {
1210
// runs after the constructor
1311
onReady() {
14-
Superpowered = this.Superpowered;
15-
16-
this.reverb = Superpowered.new('Reverb', Superpowered.samplerate, Superpowered.samplerate);
12+
this.reverb = new this.Superpowered.Reverb(this.samplerate, this.samplerate);
1713
this.reverb.enabled = true;
1814

19-
this.filter = Superpowered.new('Filter',Superpowered.FilterType.Resonant_Lowpass, Superpowered.samplerate);
15+
this.filter = newthis.Superpowered.Filter(this.Superpowered.Filter.Resonant_Lowpass, this.samplerate);
2016
this.filter.resonance = 0.2;
2117
this.filter.enabled = true;
2218
}
@@ -35,7 +31,6 @@ class MyProcessor extends SuperpoweredModule.AudioWorkletProcessor {
3531
processAudio(inputBuffer, outputBuffer, buffersize, parameters) {
3632
this.reverb.process(inputBuffer.pointer, inputBuffer.pointer, buffersize);
3733
this.filter.process(inputBuffer.pointer, outputBuffer.pointer, buffersize);
38-
return true;
3934
}
4035
}
4136

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /