← strona główna

Losowe akordy

aby wylosować nowy akord odśwież stronę lub kliknij nazwę akordu



kod html + javascript:


<div id="rezultat">
	<p>
		aby wylosować nowy akord odśwież stronę lub kliknij nazwę akordu<br/>
	</p>
	<div>
		<label for="delay">Do ilu sekund odczekać zanim próbka będzie zagrana ponownie
		<br/>(wartość będzie losowana,
		<br/>to jest maksymalna wartość w sekundach):</label>	
		<input type="number" id="delay" name="delay"
		min="0" max="1000" value="1">
	</div>
</div>
<script type="text/javascript">
rezultat = window.document.getElementById('rezultat');
// nazwy moll
let labelsMinor = ["c", "cis", "d", "es", "e", "f", "fis", "g", "gis", "a", "b", "h"];
let labelsMajor = ["C", "Des", "D", "Es", "E", "F", "Ges", "G", "As", "A", "B", "H"];
// wzorce interwalowe (akordy)
// możemy dodać lub zmienić listę interwałów, 
// np. aby dodać czterodźwięk zmniejszony dodajemy wiersz [3, 3, 3]
// (nowy wiersz oddzielamy od poprzeniego przecinkiem)
let patterns = [
	[4, 3, 4],
	[3, 4, 3]
];
let patternIndex = Math.random() > .5 ? 0 : 1;
let pattern = patterns[patternIndex];
let mode = patternIndex == 0 ? "dur7<" : "moll7";
console.log (patternIndex + " " + mode);
// losujemy podstawe akordu
// to określa ambitus, jeśli zmienimy te liczby - zmienimy losowany rejestr
let pointMini = 24;
let pointMaxi = 108 - 12;
let point = Math.floor(Math.random() * (pointMaxi-pointMini) + pointMini);
// etykieta
let labels = patternIndex == 0 ? labelsMajor : labelsMinor;
let pitchClass = point % 12;
let key = labels[pitchClass];
// obliczamy numery midi
// do podstawy akordu dodajemy interwaly
let midis = [point, 0, 0, 0];
let k = 1;
pattern.forEach ((interval) => {
	midis[k] = midis[k-1] + interval;
	k++;
})
// tworzymy przycisk
var aktualnieGramy = false;
var button = document.createElement('button');
button.innerHTML = 'graj';
button.style.fontSize = "5rem"
button.onclick = function(){	
	if (aktualnieGramy) {
		aktualnieGramy = false;
		audios.forEach((audio) => {
    		audio.pause();
		})
		button.innerHTML = 'graj';
	} else {
		aktualnieGramy = true;
		let audioNumber = 0;
		audios.forEach((audio) => {
			let delayMs = audioNumber == 0 ? 0 : Math.round (Math.random() * 2000) + 300;
			setTimeout(() => { 
				audio.play();
				// console.log(delayMs + ' ' + audio.src);
			}, delayMs);
			audioNumber++;
		})
		button.innerHTML = 'pauza';
	}

};
rezultat.appendChild(button);	
// tworzymy elementy audio i etykiety
let audios = [];
for (k=0; k<4; k++) {
	let midi = midis[k];
	var path = '_assets/piano_mp3/'+midi+'.mp3'
	var id = 'audio'+midi;
	audios[k] = window.document.createElement("audio");
	audios[k].setAttribute('id', id);
	audios[k].setAttribute('controls', 'true');
	audios[k].setAttribute('preload', 'true');
//	audios[k].setAttribute('loop', 'true'); // NIEPOTRZEBNE
	audios[k].setAttribute('src', path);
//	audios[k].setAttribute('autoplay', "true"); // OPCJONALNIE
// autoPlay afetr delay
	audios[k].onended = function(ev) {
		let el =ev.srcElement;
    	// console.log("The audio has ended");
		// console.log (el); 
		let maxDelay = document.getElementById("delay").value;
		let minDelay = 0;
		let delayMs = Math.round (Math.random() * maxDelay * 1000) + minDelay * 1000;
		console.log ("start delay: " + delayMs)
		setTimeout(() => { 
			// console.log ("play")
			el.play();
			// console.log(delayMs + ' ' + el.src);
		}, delayMs);
	};	
	var label = window.document.createElement("div");
	label.innerHTML = midi;
	label.classList.add("label");
	label.appendChild(audios[k]);
	rezultat.appendChild(label);

}
// tworzymy przycisk 2
var button2 = document.createElement('button');
button2.innerHTML = key + "-" + mode;
button2.style.fontSize = "5rem"
button2.onclick = function(){	
	window.location.reload();
};
rezultat.appendChild(button2);
</script>

                

Autorstwo kodu: Marcin Strzelecki