PageSourceSearch

https://bitcoinaudio.github.io/js/listen.js

js bitcoinaudio.github.io collected 2026-10-03 08:43:01 UTC 4,144 bytes, 174 lines download raw bytes

1// *  PRESET CHOOSING
2 
3function chooseRandomInstrument(){
4	var keys = Object.keys(PresetList);
5	var randomInst = keys[Math.floor(Math.random() * keys.length)];
6	return randomInst;
7}
8
9function chooseRandomPreset(instrument){
10	var keys = PresetList[instrument];
11	var randomInst = keys[Math.floor(Math.random() * keys.length)];
12	return randomInst;	
13}
14
15function loadPreset(inst, preset){
16	var xhr = new XMLHttpRequest();
17	var url = "./instrument/" + inst + "/" + preset;
18	xhr.onreadystatechange = function() {
19		if (xhr.readyState === 4 && xhr.status === 200) {
20			codemirror.setValue(xhr.responseText);
21			setCurrentPreset(xhr.responseText);
22		}
23	};
24	xhr.open("GET", url, true);
25	xhr.send();
26	document.querySelector("#Names select").value = inst;
27	document.querySelector("#Preset select").value = preset;
28}
29
30function setCurrentPreset(preset){
31	try {
32		instrument.set(JSON.parse(preset));
33	} catch(e){
34		// indicate the error
35		codemirror.getWrapperElement().classList.add("Error");
36		document.querySelector("#ErrorText").textContent = e.message;
37	}
38}
39
40/**
41 *  EVENTS
42 */
43function setupEvents(){
44	var listenButton = document.querySelector("button");
45	listenButton.addEventListener("click", function(e){
46		//get the apply the preset
47		setCurrentPreset(codemirror.getValue());
48	}, true);
49}
50
51/**
52 *  Tone.js
53 */
54var instrument;
55function makeInstrument(inst){
56	if (instrument){
57		instrument.dispose();
58	}
59	instrument = new Tone[inst]().toMaster();
60	
61}
62
63var keyboard = new AudioKeys({
64	polyphony: 1,
65	rows: 1,
66	priority: "last"
67});
68
69
70keyboard.down(function (note) {
71	if (instrument.toString() === "NoiseSynth") {
72		instrument.triggerAttack();
73	} else {
74		instrument.triggerAttack(note.frequency);
75	}
76});
77
78keyboard.up(function (note) {
79    instrument.triggerRelease();
80});
81
82/**
83 *  Dropdown
84 */
85function makeInstrumentDropDown(){
86	var keys = Object.keys(PresetList);
87	var container = document.querySelector("#Names select");
88	for (var i = 0; i < keys.length; i++){
89		var option = document.createElement("option");
90		container.appendChild(option);
91		option.value = keys[i];
92		option.textContent = keys[i];
93	}
94}
95
96function makePresetDropDown(instrument){
97	var presets = PresetList[instrument];
98	var container = document.querySelector("#Preset select");
99	//clear the previous one
100	container.innerHTML = "";
101	for (var i = 0; i < presets.length; i++){
102		var option = document.createElement("option");
103		container.appendChild(option);
104		var file = presets[i];
105		option.value = file;
106		option.textContent = file.substring(0, file.length - 5);
107	}
108
109	var randomPreset = chooseRandomPreset(instrument);
110	container.value = randomPreset;
111	loadPreset(instrument, randomPreset);
112}
113
114function dropDownEvents(){
115
116	var presets = document.querySelector("#Preset select");
117	presets.addEventListener("input", function(e){
118		makeInstrument(instruments.value);
119		loadPreset(instruments.value, presets.value);
120	}, false);
121
122	var instruments = document.querySelector("#Names select");
123	instruments.addEventListener("input", function(e){
124		makeInstrument(instruments.value);
125		makePresetDropDown(instruments.value);
126	}, false);
127}
128
129/**
130 *  EDITOR
131 */
132
133var codemirror;
134
135//document loaded
136document.addEventListener("DOMContentLoaded", function(event) {
137	//choose a random instrument and preset
138	var randomInst = chooseRandomInstrument();
139	makeInstrument(randomInst);
140	// loadPreset(randomInst, randomPreset);
141	//setup the events
142	setupEvents();
143	codemirror = new CodeMirror(document.querySelector("#JSON"), {
144		mode : {name: "javascript", json: true},
145	});
146
147	codemirror.addKeyMap({
148		"Cmd-Enter": function(){
149			setCurrentPreset(codemirror.getValue());
150			document.querySelector("button").focus();
151		}
152	});
153
154	codemirror.on("keydown", function(c, e){
155		codemirror.getWrapperElement().classList.remove("Error");
156		document.querySelector("#ErrorText").textContent = "";
157		e.stopPropagation();
158	});
159	codemirror.on("keyup", function(c, e){
160		e.stopPropagation();
161	});
162
163	//make the drop downs
164	makeInstrumentDropDown();
165	makePresetDropDown(randomInst);
166	dropDownEvents();
167
168	// make the logo in the corner
169	//Logo({
170	//	"container" : "#Topbar",
171	//	"height" : 28,
172	//	"width" : 140
173	//});
174});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.