Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Split logic of NoiseModule into different files #14

Merged
merged 60 commits into from
Jun 1, 2024
Merged
Changes from 1 commit
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
639ed11
Created new noise-module.js for changes
Nov 5, 2019
c42d89b
Added .editorconfig
Nov 5, 2019
dd12b55
Moved NoiseModuleNode into different file
Nov 5, 2019
05af350
Moved OscilatorModuleNode into different file
Nov 5, 2019
a318e73
Moved LiveInputModuleNode into different file
Nov 5, 2019
d048445
Moved RadioModuleNode into different file
Nov 5, 2019
0015ea2
Moved SoundCloud and BiquadFilter into different files
Nov 5, 2019
07685b1
Moved EqualizerModuleNode into different file
Nov 5, 2019
090b0df
Moved DelayModuleNode into different file
Nov 5, 2019
1325b5d
Moved KingTubbyModuleNode into different file
Nov 5, 2019
3909fca
Moved Convolver and MoogFilter into different file
Nov 5, 2019
6040ca6
Moved DynamicsCompressor into different file
Nov 5, 2019
db147a8
Moved Gain into different file
Nov 5, 2019
639fa1a
Moved Gain into different file
Nov 5, 2019
44931d6
Moved stereopanner into different file
Nov 5, 2019
ef7d1f6
Moved WaveShapper into different file
Nov 5, 2019
5a2ca3a
Moved PeriodWave into different file
Nov 5, 2019
0b02a64
Moved Analyser into different file
Nov 5, 2019
2b8d3cb
Moved Recorder into different file
Nov 5, 2019
e66d860
Code reformat
Nov 5, 2019
c38fdc4
Created NoiseModuleBuilder file
Nov 5, 2019
b33b49d
Moved registration on nodes in module builder
Nov 5, 2019
121011c
Moved all default settings for each node respectivly
Nov 6, 2019
ff02303
Move generic methods to correct node impl
Nov 6, 2019
19add45
Code reformat
Nov 6, 2019
90a3327
Moved all node impl to folder nodes/
Nov 6, 2019
9467f74
Changes in module node registration
Nov 6, 2019
22506cd
Code reformat
Nov 6, 2019
e5e2e63
Changes and comments in main lib
Nov 8, 2019
e67ddc9
Split UI from code
Nov 8, 2019
328643a
More in ui
stolosapo Nov 8, 2019
b4b7fdf
Refactor module nodes to have factory methods
Nov 11, 2019
0a3c1fc
More in refactoring register logic
Nov 11, 2019
fd438c9
Clean un needed methods
Nov 11, 2019
550c02a
More in UI
Nov 11, 2019
49b5256
Change the module ui creation way
stolosapo Nov 11, 2019
33bba0d
More in cleaning implementations
stolosapo Nov 11, 2019
edead41
More in cleaning implementations
stolosapo Nov 11, 2019
763ec9c
More in cleaning implementations
stolosapo Nov 11, 2019
ec7cbe8
Fix suspented problem for chrome browser
Nov 12, 2019
b53b670
Minimum ui changes
Nov 12, 2019
bc8ca0f
Make modules draggable
Nov 12, 2019
386b404
First connection draw
Nov 12, 2019
cc8b339
Fix king tubby module and some in lines
Nov 12, 2019
37fbdba
Created logic for export settings
Nov 13, 2019
20a87c5
Move some default settings into modules
Nov 14, 2019
8b2f848
More in export options from module
Nov 14, 2019
4d066ca
More in export module settings
Nov 14, 2019
f13ad13
Added exportSettings in analyser, biquadfilter modules
Nov 20, 2019
3321f57
Changes in export analyser module
Nov 21, 2019
a11bd5b
Added export methods for all modules
Nov 21, 2019
a9539f6
Css changes
Nov 22, 2019
18dd2c2
Some ui changes
Nov 22, 2019
6ec8773
Seperate modules from UI (#15)
Apr 13, 2022
7ae4935
Clean up comments
Apr 18, 2022
7de45b7
Extracted buildUI public method
Apr 18, 2022
34d2c15
Removed unneeded files and updated readme
Apr 18, 2022
f9adfec
Fixed noise-radio
Dec 29, 2022
56100a0
Start AudioContext uppon click
stolosapo May 24, 2024
a7a9612
Fixed bypass functionality
stolosapo Jun 1, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Start AudioContext uppon click
stolosapo committed Jun 1, 2024
commit 56100a0a9b251362bfd15aa96d80f18df2b368c4
10 changes: 10 additions & 0 deletions css/noise-module.css
Original file line number Diff line number Diff line change
@@ -104,6 +104,16 @@ body {
background-image: url("../img/pause_48.png");
}

.noise-module-node header img.nm-bypass-button {
background: url("../img/bypass_16.png") 0 0 no-repeat;
height: 16px;
width: 16px;
position: relative;
left: 8px;
top: 8px;
cursor: pointer;
}

.noise-module-node section canvas {
background-image: url("../img/blueprint-dark.png");
display: inline-block;
Binary file added img/bypass_16.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
@@ -28,8 +28,14 @@

<body>
<main>
<audio id="thefirstkube" crossorigin="anonymous" controls controlslist autoplay="false">
<source src="https://stream.thefirstkube.net/stream.mp3" type="audio/mpeg" />
</audio>

<section id="noise-module-container" class="noise-module-container">
</section>

<button id="start">Start it!!</button>
</main>

<script type="text/javascript">
38 changes: 25 additions & 13 deletions js/example.js
Original file line number Diff line number Diff line change
@@ -5,42 +5,54 @@ let noiseModuleInit = function(containerElId) {

config.modules = [
{ name: "WhiteNoise", nodeType: "noise" },
{ name: "NoiseRadio", nodeType: "noiseradio" },
{ name: "NoiseRadio", nodeType: "noiseradio", options: { audioIdSelector: "thefirstkube" } },
{ name: "LiveInput", nodeType: "liveinput" },
{ name: "KingTubby", nodeType: "kingtubby" },
{ name: "SineWave", nodeType: "oscillator" },
{ name: "KingTubby", nodeType: "kingtubby" },
{ name: "BiquadFilter", nodeType: "biquadfilter" },
{ name: "Delay", nodeType: "delay" },
{ name: "DynamicsCompressor", nodeType: "dynamicscompressor" },
{ name: "WaveShaper", nodeType: "waveshaper" },
{ name: "Panner", nodeType: "stereopanner" },
// { name: "Convolver", nodeType: "convolver" },
{ name: "Convolver", nodeType: "convolver" },
{ name: "Eq", nodeType: "equalizer" },
{ name: "Panner", nodeType: "stereopanner" },
{ name: "Gain", nodeType: "gain" },
{ name: "Recorder", nodeType: "recorder" },
{ name: "Analyser", nodeType: "analyser" },
];

config.connections = [
{ srcNode: "WhiteNoise", destNode: "BiquadFilter", connected: true },
{ srcNode: "NoiseRadio", destNode: "BiquadFilter", connected: true },
{ srcNode: "SineWave", destNode: "BiquadFilter", connected: true },
{ srcNode: "LiveInput", destNode: "BiquadFilter", connected: true },

{ srcNode: "BiquadFilter", destNode: "Delay", connected: true },

{ srcNode: "Delay", destNode: "DynamicsCompressor", connected: true },

{ srcNode: "DynamicsCompressor", destNode: "WaveShaper", connected: true },
{ srcNode: "WaveShaper", destNode: "Panner", connected: true },
{ srcNode: "Panner", destNode: "Eq", connected: true },
// { srcNode: "Convolver", destNode: "Eq", connected: true },
// { srcNode: "NoiseRadio", destNode: "KingTubby", connected: true },
// { srcNode: "KingTubby", destNode: "Eq", connected: true },
{ srcNode: "Eq", destNode: "Gain", connected: true },

{ srcNode: "WaveShaper", destNode: "Eq", connected: true },
{ srcNode: "Convolver", destNode: "Eq", connected: true },
{ srcNode: "KingTubby", destNode: "Eq", connected: true },

{ srcNode: "Eq", destNode: "Panner", connected: true },

{ srcNode: "Panner", destNode: "Gain", connected: true },

{ srcNode: "Gain", destNode: "Recorder", connected: true },

{ srcNode: "Gain", destNode: "Analyser", connected: true },

{ srcNode: "Gain", destNode: "output", connected: true },
];

let noiseModule = new NoiseModule(config);
noiseModule.start();
noiseModule.buildUI();
console.log(noiseModule);

document.getElementById("start").addEventListener('click', function(el, e) {
noiseModule.start();
noiseModule.buildUI();
console.log(noiseModule);
});
}
3 changes: 3 additions & 0 deletions js/nodes/analyser-module-node.js
Original file line number Diff line number Diff line change
@@ -68,10 +68,13 @@ AnalyserModuleNodeUI.prototype = {
},

$_header: function() {
const $byPassButton = createByPassButton(this.noiseModule, this.moduleItem);

let $name = document.createElement("h6");
$name.innerText = this.moduleItem.module.name;

let $header = document.createElement("header");
appendElementToTarget($byPassButton, $header);
appendElementToTarget($name, $header);
return $header;
},
3 changes: 3 additions & 0 deletions js/nodes/biquadfilter-module-node.js
Original file line number Diff line number Diff line change
@@ -77,10 +77,13 @@ BiquadFilterModuleNodeUI.prototype = {
},

$_header: function() {
const $byPassButton = createByPassButton(this.noiseModule, this.moduleItem);

let $name = document.createElement("h6");
$name.innerText = this.moduleItem.module.name;

let $header = document.createElement("header");
appendElementToTarget($byPassButton, $header);
appendElementToTarget($name, $header);
return $header;
},
3 changes: 3 additions & 0 deletions js/nodes/convolver-module-node.js
Original file line number Diff line number Diff line change
@@ -54,10 +54,13 @@ ConvolverModuleNodeUI.prototype = {
},

$_header: function() {
const $byPassButton = createByPassButton(this.noiseModule, this.moduleItem);

let $name = document.createElement("h6");
$name.innerText = this.moduleItem.module.name;

let $header = document.createElement("header");
appendElementToTarget($byPassButton, $header);
appendElementToTarget($name, $header);
return $header;
},
3 changes: 3 additions & 0 deletions js/nodes/delay-module-node.js
Original file line number Diff line number Diff line change
@@ -58,10 +58,13 @@ DelayModuleNodeUI.prototype = {
},

$_header: function() {
const $byPassButton = createByPassButton(this.noiseModule, this.moduleItem);

let $name = document.createElement("h6");
$name.innerText = this.moduleItem.module.name;

let $header = document.createElement("header");
appendElementToTarget($byPassButton, $header);
appendElementToTarget($name, $header);
return $header;
},
3 changes: 3 additions & 0 deletions js/nodes/dynamicscompressor-module-node.js
Original file line number Diff line number Diff line change
@@ -68,10 +68,13 @@ DynamicsCompressorModuleNodeUI.prototype = {
},

$_header: function() {
const $byPassButton = createByPassButton(this.noiseModule, this.moduleItem);

let $name = document.createElement("h6");
$name.innerText = this.moduleItem.module.name;

let $header = document.createElement("header");
appendElementToTarget($byPassButton, $header);
appendElementToTarget($name, $header);
return $header;
},
3 changes: 3 additions & 0 deletions js/nodes/equalizer-module-node.js
Original file line number Diff line number Diff line change
@@ -117,10 +117,13 @@ EqualizerModuleNodeUI.prototype = {
},

$_header: function() {
const $byPassButton = createByPassButton(this.noiseModule, this.moduleItem);

let $name = document.createElement("h6");
$name.innerText = this.moduleItem.module.name;

let $header = document.createElement("header");
appendElementToTarget($byPassButton, $header);
appendElementToTarget($name, $header);
return $header;
},
3 changes: 3 additions & 0 deletions js/nodes/gain-module-node.js
Original file line number Diff line number Diff line change
@@ -62,10 +62,13 @@ GainModuleNodeUI.prototype = {
},

$_header: function() {
const $byPassButton = createByPassButton(this.noiseModule, this.moduleItem);

let $name = document.createElement("h6");
$name.innerText = this.moduleItem.module.name;

let $header = document.createElement("header");
appendElementToTarget($byPassButton, $header);
appendElementToTarget($name, $header);
return $header;
},
3 changes: 3 additions & 0 deletions js/nodes/kingtubby-module-node.js
Original file line number Diff line number Diff line change
@@ -94,10 +94,13 @@ KingTubbyModuleNodeUI.prototype = {
},

$_header: function() {
const $byPassButton = createByPassButton(this.noiseModule, this.moduleItem);

let $name = document.createElement("h6");
$name.innerText = this.moduleItem.module.name;

let $header = document.createElement("header");
appendElementToTarget($byPassButton, $header);
appendElementToTarget($name, $header);
return $header;
},
3 changes: 3 additions & 0 deletions js/nodes/liveinput-module-node.js
Original file line number Diff line number Diff line change
@@ -87,10 +87,13 @@ LiveInputModuleNodeUI.prototype = {
},

$_header: function() {
const $byPassButton = createByPassButton(this.noiseModule, this.moduleItem);

let $name = document.createElement("h6");
$name.innerText = this.moduleItem.module.name;

let $header = document.createElement("header");
appendElementToTarget($byPassButton, $header);
appendElementToTarget($name, $header);
return $header;
},
3 changes: 3 additions & 0 deletions js/nodes/noise-module-node.js
Original file line number Diff line number Diff line change
@@ -134,10 +134,13 @@ NoiseModuleNodeUI.prototype = {
},

$_header: function() {
const $byPassButton = createByPassButton(this.noiseModule, this.moduleItem);

let $name = document.createElement("h6");
$name.innerText = this.moduleItem.module.name;

let $header = document.createElement("header");
appendElementToTarget($byPassButton, $header);
appendElementToTarget($name, $header);
return $header;
},
3 changes: 3 additions & 0 deletions js/nodes/noise-radio-module-node.js
Original file line number Diff line number Diff line change
@@ -71,10 +71,13 @@ NoiseRadioModuleNodeUI.prototype = {
},

$_header: function() {
const $byPassButton = createByPassButton(this.noiseModule, this.moduleItem);

let $name = document.createElement("h6");
$name.innerText = this.moduleItem.module.name;

let $header = document.createElement("header");
appendElementToTarget($byPassButton, $header);
appendElementToTarget($name, $header);
return $header;
},
3 changes: 3 additions & 0 deletions js/nodes/oscilator-module-node.js
Original file line number Diff line number Diff line change
@@ -66,10 +66,13 @@ OscilatorModuleNodeUI.prototype = {
},

$_header: function() {
const $byPassButton = createByPassButton(this.noiseModule, this.moduleItem);

let $name = document.createElement("h6");
$name.innerText = this.moduleItem.module.name;

let $header = document.createElement("header");
appendElementToTarget($byPassButton, $header);
appendElementToTarget($name, $header);
return $header;
},
3 changes: 3 additions & 0 deletions js/nodes/recorder-module-node.js
Original file line number Diff line number Diff line change
@@ -82,10 +82,13 @@ RecorderModuleNodeUI.prototype = {
},

$_header: function() {
const $byPassButton = createByPassButton(this.noiseModule, this.moduleItem);

let $name = document.createElement("h6");
$name.innerText = this.moduleItem.module.name;

let $header = document.createElement("header");
appendElementToTarget($byPassButton, $header);
appendElementToTarget($name, $header);
return $header;
},
3 changes: 3 additions & 0 deletions js/nodes/stereopanner-module-node.js
Original file line number Diff line number Diff line change
@@ -58,10 +58,13 @@ StereoPannerModuleNodeUI.prototype = {
},

$_header: function() {
const $byPassButton = createByPassButton(this.noiseModule, this.moduleItem);

let $name = document.createElement("h6");
$name.innerText = this.moduleItem.module.name;

let $header = document.createElement("header");
appendElementToTarget($byPassButton, $header);
appendElementToTarget($name, $header);
return $header;
},
3 changes: 3 additions & 0 deletions js/nodes/waveshaper-module-node.js
Original file line number Diff line number Diff line change
@@ -79,10 +79,13 @@ WaveShaperModuleNodeUI.prototype = {
},

$_header: function() {
const $byPassButton = createByPassButton(this.noiseModule, this.moduleItem);

let $name = document.createElement("h6");
$name.innerText = this.moduleItem.module.name;

let $header = document.createElement("header");
appendElementToTarget($byPassButton, $header);
appendElementToTarget($name, $header);
return $header;
},
114 changes: 113 additions & 1 deletion js/noise-module.js
Original file line number Diff line number Diff line change
@@ -87,6 +87,7 @@ NoiseModule.prototype = {
// initialize members
this.moduleCounter = 0;
this.moduleInstaces = [];
this.currentConnections = [];
this.registeredFactories = this.options.nodesFactories();
},

@@ -178,6 +179,7 @@ NoiseModule.prototype = {
audioNode: audioNode,
moduleImpl: moduleImpl,
factory: factory,
bypassConnections: [],
};

return moduleItem;
@@ -196,12 +198,20 @@ NoiseModule.prototype = {
}

let _self = this;
let lastRect;

this.moduleInstaces
.forEach(i => {
let uiBuilder = i.factory.createUI(_self, i);
let $moduleEl = uiBuilder.create();
// dragElement($moduleEl);
appendElementToTarget($moduleEl, $containerEl);

if (lastRect) {
$moduleEl.style.left = (lastRect.left + lastRect.width + 10) + "px";
}

lastRect = $moduleEl.getBoundingClientRect();
});
},

@@ -224,7 +234,7 @@ NoiseModule.prototype = {
}

if (connection.destNode === "output") {
this.connectNodes(srcAudio.outNode, this.audioContext.destination);
this.connectNodes(srcAudio.outNode, this._outputNode());
return;
}

@@ -265,13 +275,40 @@ NoiseModule.prototype = {
};
},

_outputNode: function() {
return this.audioContext.destination;
},

_findModuleElementPositions: function() {
return this.moduleInstaces
.map(i => {
const $el = document.getElementById("module" + i.id);
const rect = $el.getBoundingClientRect();

return {
$el,
rect
};
});
},

_connectionExists: function(srcNode, destNode) {
return this.currentConnections.filter(c => c.srcNode === srcNode && c.destNode === destNode).length > 0;
},

connectNodes: function(srcNode, destNode) {
if (!srcNode || !destNode) {
console.error( "Could not create connection. Source and Destination should exist.", srcNode, destNode);
return;
}

if (this._connectionExists(srcNode, destNode)) {
console.warn("Connection already exists", srcNode, destNode);
return;
}

srcNode.connect(destNode);
this.currentConnections.push({srcNode, destNode});
},

_disconnectNodes: function(srcNode, destNode) {
@@ -280,7 +317,13 @@ NoiseModule.prototype = {
return;
}

if (!this._connectionExists(srcNode, destNode)) {
console.warn("Connection doesn't exists", srcNode, destNode);
return;
}

srcNode.disconnect(destNode);
this.currentConnections = this.currentConnections.filter(c => !(c.srcNode === srcNode && c.destNode === destNode));
},

updateAudioNode: function(moduleName, audioInNode, audioOutNode) {
@@ -318,6 +361,75 @@ NoiseModule.prototype = {
_self._disconnectNodes(srcNode.outNode, destNode.inNode);
});
},

_clearBypassConnections: function(module) {
if (!module.bypassConnections) {
return;
}

let _self = this;

// First disconnect connections
module.bypassConnections.forEach(c => {
_self._disconnectNodes(c.srcNode, c.destNode);
});

// Clear collection
module.bypassConnections = [];
},

byPassModule: function(module) {
let _self = this;

// Clear already existed bypass connections
this._clearBypassConnections(module);

// Find the sources of this module
const srcNodes = this.currentConnections
.filter(c => c.destNode === module.inNode)
.map(c => c.srcNode);

// Find the destinations of this module
const destNodes = this.currentConnections
.filter(c => c.srcNode === module.outNode)
.map(c => c.destNode);

// Disconnect all source nodes of the module
srcNodes.forEach(srcNode => _self._disconnectNodes(srcNode, module.inNode));

// Disconnect all target nodes from module
destNodes.forEach(destNode => _self._disconnectNodes(module.outNode, destNode));

// Connect all combinations of sources and targets
srcNodes.forEach(srcNode => {
destNodes.forEach(destNode => {
_self.connectNodes(srcNode, destNode);
module.bypassConnections.push({srcNode, destNode});
});
});

console.log("By passs", module, this.currentConnections);
},

reAttachModule: function(module) {
let _self = this;

// Clear already existed bypass connections
this._clearBypassConnections(module);

// Connect the sources of this module
const srcNodes = this.options.connections
.filter(c => c.destNode === module.inNode)
.forEach(c => _self.connectNodes(c.srcNode, c.destNode));

// Connect the targets of this module
const destNodes = this.options.connections
.filter(c => c.srcNode === module.outNode)
.map(c => _self.connectNodes(c.srcNode, c.destNode));


console.log("Re-Attach", module, this.currentConnections);
}
};

let extend = function() {
62 changes: 61 additions & 1 deletion js/ui-helper.js
Original file line number Diff line number Diff line change
@@ -66,6 +66,25 @@ let createPlayPauseButton = function(noiseModule, module, clickEvent) {
return $button;
}

let createByPassButton = function(noiseModule, module) {
const byPassedClass = 'bypassed';

let $button = document.createElement("img");
$button.classList.add("nm-bypass-button");

$button.addEventListener('click', function(e) {
if (this.classList.contains(byPassedClass)) {
noiseModule.reAttachModule(module);
this.classList.remove(byPassedClass);
} else {
noiseModule.byPassModule(module);
this.classList.add(byPassedClass);
}
});

return $button;
}

let createSliderWrapper = function($input, property, description, units) {
let value = function(v) {
return v + " " + units;
@@ -106,4 +125,45 @@ let createSliderControl = function(initialValue, min, max, step, changeEvent) {
$input.value = initialValue;
$input.addEventListener('input', changeEvent);
return $input;
}
}

let dragElement = function($elem) {
var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
if (document.getElementById($elem.id + "header")) {
// if present, the header is where you move the DIV from:
document.getElementById($elem.id + "header").onmousedown = dragMouseDown;
} else {
// otherwise, move the DIV from anywhere inside the DIV:
$elem.onmousedown = dragMouseDown;
}

function dragMouseDown(e) {
e = e || window.event;
e.preventDefault();
// get the mouse cursor position at startup:
pos3 = e.clientX;
pos4 = e.clientY;
document.onmouseup = closeDragElement;
// call a function whenever the cursor moves:
document.onmousemove = elementDrag;
}

function elementDrag(e) {
e = e || window.event;
e.preventDefault();
// calculate the new cursor position:
pos1 = pos3 - e.clientX;
pos2 = pos4 - e.clientY;
pos3 = e.clientX;
pos4 = e.clientY;
// set the element's new position:
$elem.style.top = ($elem.offsetTop - pos2) + "px";
$elem.style.left = ($elem.offsetLeft - pos1) + "px";
}

function closeDragElement() {
// stop moving when mouse button is released:
document.onmouseup = null;
document.onmousemove = null;
}
}