|
|
<!DOCTYPE html> |
|
|
<html lang="en"> |
|
|
|
|
|
<head> |
|
|
<meta charset="utf-8"> |
|
|
<meta http-equiv="x-ua-compatible" content="ie=edge"> |
|
|
<meta name="viewport" content="width=device-width, initial-scale=1"> |
|
|
<link rel="icon" href="favicon.ico" type="image/x-icon" /> |
|
|
<link rel="stylesheet" href="examples-styles.css" /> |
|
|
|
|
|
<title>abcjs: Accompaniment Demo</title> |
|
|
|
|
|
<link rel="stylesheet" type="text/css" href="../abcjs-audio.css"> |
|
|
<style> |
|
|
label { |
|
|
font-weight: bold; |
|
|
} |
|
|
.options { |
|
|
margin-bottom: 10px; |
|
|
} |
|
|
h2 { |
|
|
display: inline; |
|
|
font-size: 1em; |
|
|
} |
|
|
.code { |
|
|
color: white; |
|
|
background-color: black; |
|
|
padding: 10px; |
|
|
display: inline-block; |
|
|
border-radius: 4px; |
|
|
} |
|
|
</style> |
|
|
|
|
|
<script src="../dist/abcjs-basic.js" type="text/javascript"></script> |
|
|
<script type="text/javascript"> |
|
|
var abcCooley = "T: Cooley's\n" + |
|
|
"M: 4/4\n" + |
|
|
"L: 1/8\n" + |
|
|
"R: reel\n" + |
|
|
"K: Emin\n" + |
|
|
"|:D2|EB{c}BA B2 EB|~B2 AB dBAG|FDAD BDAD|FDAD dAFD|\n" + |
|
|
"EBBA B2 EB|B2 AB defg|afe^c dBAF|DEFD E2:|\n" + |
|
|
"|:gf|eB B2 efge|eB B2 gedB|A2 FA DAFA|A2 FA defg|\n" + |
|
|
"eB B2 eBgB|eB B2 defg|afe^c dBAF|DEFD E2:|"; |
|
|
|
|
|
var abcArpeggio = |
|
|
'X:9\n' + |
|
|
'T:Nocturne \n' + |
|
|
'C:Avetik Topchyan\n' + |
|
|
'C:upd 11 June 2024\n' + |
|
|
'M:4/4\n' + |
|
|
'L:1/16\n' + |
|
|
'Q:1/4=80\n' + |
|
|
'K:Em\n' + |
|
|
'P:A\n' + |
|
|
'"Em" B8 g3e3B2 | \\n' + |
|
|
'"Am" c8 f3e3c2 | \\n' + |
|
|
'"Em" B8 "C" c4 A2G2 | \\n' + |
|
|
'"Am" F4A2G2 "B7" G2^F2G2A2 :| \n' |
|
|
|
|
|
var abcJazz = |
|
|
'X:1\n' + |
|
|
'T:At the Jazz Band Ball\n' + |
|
|
'C:1918 Original Dixieland Jazz Band\n' + |
|
|
'M:4/4\n' + |
|
|
'L:1/8\n' + |
|
|
'Q:1/4=160\n' + |
|
|
'K:Bb\n' + |
|
|
'P:Verse\n' + |
|
|
'"Gm"GG2D GG2G|GBG2G4|z2^c2d3=c|BGB2G4|\n' + |
|
|
'"F7"z2FFG2AB-|"Bb"BBA2"G7"G3F|"C7"=E2G2B2dc-|"F7"c4z=EF^F|\n' + |
|
|
'"Gm"GG2D GG2G|GBG2G4|z2d^c d=cBG|BG2G-G4|\n' + |
|
|
'"C7"z2cd cBG2|z2cd cBG2|c2^c2dc2=c-|"F7"c4z=EF^F||\n' + |
|
|
'P:Chorus\n' + |
|
|
'"G7"G2=B2dB2G-|G4zG_GF|"C7"=E2G2BG2d-|d8|\n' + |
|
|
'"F7"z2d2dcAF|cdc2AFGF|"Bb"B2DF A2GF-|F4z=EF^F|\n' + |
|
|
'"G7"GG=B2d2BG-|G4zG_GF|"C7"=EEG2BG2d-|d4zB2G|\n' + |
|
|
'"Eb"B2BB "E°7"AG2G|"Bb"FF^F2"G7"G4|"C7"GB2G"F7"A2dB-|"Bb"B6z2|]\n' |
|
|
|
|
|
var abcFleur = |
|
|
'X: 1\n' + |
|
|
'T: Petite Fleur\n' + |
|
|
'M: 4/4\n' + |
|
|
'L: 1/4\n' + |
|
|
'Q: 1/4=120\n' + |
|
|
'C: Sidney Bechet 1959\n' + |
|
|
'K: Bb\n' + |
|
|
'E3/2E/|: [P:A]"D7"D4-|D^F/A/ (3ced|"Gm"B4-|BD/G/ A/B/A/G/|\n' + |
|
|
'"A7"A4-|"D7"A =E/^F/ (3GAF|"Gm"D4-|D"^break"zE3/2E/|\n' |
|
|
|
|
|
var synthControl; |
|
|
var accompanimentStyle = 'boom-chick' |
|
|
var stressStyle = 'even' |
|
|
var durationStyle = 'even' |
|
|
var mute = false |
|
|
var swing = false |
|
|
|
|
|
var tunes = { |
|
|
'boom-chick': abcCooley, |
|
|
jazz: abcJazz, |
|
|
arpeggio: abcArpeggio, |
|
|
tango: abcFleur, |
|
|
} |
|
|
|
|
|
var accompaniments = { |
|
|
'boom-chick': '', |
|
|
jazz: '%%MIDI gchord bzczbzcz\n', |
|
|
arpeggio: '%%MIDI gchord GHIJghij\n', |
|
|
tango: '%%MIDI gchord bzzcbzbz\n', |
|
|
} |
|
|
|
|
|
var stresses = { |
|
|
'even': '', |
|
|
bass: '%%MIDI gchordstress 2 1 0.25 1 2 1 0.25 1\n', |
|
|
chord: '%%MIDI gchordstress 0.25 1 2 1 0.25 1 2 1\n', |
|
|
} |
|
|
|
|
|
var durations = { |
|
|
'even': '', |
|
|
bass: '%%MIDI gchordduration 2 1 0.5 1 2 1 0.5 1\n', |
|
|
chord: '%%MIDI gchordduration 0.5 1 2 1 0.5 1 2 1\n', |
|
|
overlap: '%%MIDI gchordduration 3\n', |
|
|
} |
|
|
|
|
|
function addDirectives() { |
|
|
var directives = accompaniments[accompanimentStyle] + |
|
|
stresses[stressStyle] + durations[durationStyle] |
|
|
|
|
|
var el = document.querySelector(".code") |
|
|
el.innerHTML = directives ? directives : "% nothing selected" |
|
|
return directives + tunes[accompanimentStyle] |
|
|
} |
|
|
function recreateAudio() { |
|
|
var abcString = addDirectives() |
|
|
if (ABCJS.synth.supportsAudio()) { |
|
|
var visualObj = ABCJS.renderAbc("paper", abcString)[0]; |
|
|
|
|
|
const options = { |
|
|
swing: swing ? 75 : 50, |
|
|
bassprog: 58, |
|
|
bassvol: 80, |
|
|
chordprog: 25, |
|
|
chordvol: 40, |
|
|
program: 24, |
|
|
pan: [ -0.5, 0.5 ], |
|
|
voicesOff: mute |
|
|
} |
|
|
|
|
|
if (!synthControl) { |
|
|
synthControl = new ABCJS.synth.SynthController(); |
|
|
synthControl.load("#audio", null, {displayLoop: true, displayRestart: true, displayPlay: true, displayProgress: true, displayWarp: true}); |
|
|
} |
|
|
synthControl.setTune(visualObj, true, options).then(function (response) { |
|
|
console.log("Audio successfully loaded.") |
|
|
}).catch(function (error) { |
|
|
console.warn("Audio problem:", error); |
|
|
}); |
|
|
} else { |
|
|
document.querySelector(".error").innerHTML = "<div class='audio-error'>Audio is not supported in this browser.</div>"; |
|
|
} |
|
|
} |
|
|
|
|
|
function load() { |
|
|
recreateAudio() |
|
|
} |
|
|
|
|
|
function styleChange(newStyle) { |
|
|
accompanimentStyle = newStyle |
|
|
recreateAudio() |
|
|
} |
|
|
|
|
|
function stressChange(newStyle) { |
|
|
stressStyle = newStyle |
|
|
recreateAudio() |
|
|
} |
|
|
|
|
|
function durationChange(newStyle) { |
|
|
durationStyle = newStyle |
|
|
recreateAudio() |
|
|
} |
|
|
|
|
|
function muteMelody(a) { |
|
|
var el = document.querySelector('input[name="melody"]') |
|
|
mute = el.checked |
|
|
recreateAudio() |
|
|
} |
|
|
|
|
|
function swingRhythm(a) { |
|
|
var el = document.querySelector('input[name="swing"]') |
|
|
swing = el.checked |
|
|
recreateAudio() |
|
|
} |
|
|
|
|
|
</script> |
|
|
</head> |
|
|
|
|
|
<body onload="load()"> |
|
|
<header> |
|
|
<img src="https://paulrosen.github.io/abcjs/img/abcjs_comp_extended_08.svg" alt="abcjs logo"> |
|
|
<h1>Accompaniment</h1> |
|
|
</header> |
|
|
<main> |
|
|
<p>This shows different options for tweaking the sound of the accompaniment.</p> |
|
|
<div class="options"> |
|
|
<h2>Pattern:</h2> |
|
|
<label><input type="radio" name="gchord" value="boom-chick" onclick="styleChange('boom-chick')" checked>Boom Chick (default)</label> |
|
|
<label><input type="radio" name="gchord" value="jazz" onclick="styleChange('jazz')">Jazz</label> |
|
|
<label><input type="radio" name="gchord" value="arpeggio" onclick="styleChange('arpeggio')">Arpeggio</label> |
|
|
<label><input type="radio" name="gchord" value="tango" onclick="styleChange('tango')">Tango</label> |
|
|
</div> |
|
|
<div class="options"> |
|
|
<h2>Stress:</h2> |
|
|
<label><input type="radio" name="stress" value="even" onclick="stressChange('even')" checked>Even (default)</label> |
|
|
<label><input type="radio" name="stress" value="bass" onclick="stressChange('bass')">Bass heavy</label> |
|
|
<label><input type="radio" name="stress" value="chord" onclick="stressChange('chord')">Chord heavy</label> |
|
|
</div> |
|
|
<div class="options"> |
|
|
<h2>Duration:</h2> |
|
|
<label><input type="radio" name="duration" value="even" onclick="durationChange('even')" checked>Even (default)</label> |
|
|
<label><input type="radio" name="duration" value="bass" onclick="durationChange('bass')">Long Bass</label> |
|
|
<label><input type="radio" name="duration" value="chord" onclick="durationChange('chord')">Long Chord</label> |
|
|
<label><input type="radio" name="duration" value="overlap" onclick="durationChange('overlap')">Overlapping</label> |
|
|
</div> |
|
|
<div class="options"> |
|
|
<h2>Melody:</h2> |
|
|
<label><input type="checkbox" name="melody" onclick="muteMelody()">Mute Melody</label> |
|
|
<label><input type="checkbox" name="swing" onclick="swingRhythm()">Swing Rhythm</label> |
|
|
</div> |
|
|
<div id="audio" class="abcjs-large"></div> |
|
|
<div class="error"></div> |
|
|
<p>Add this to your code:</p> |
|
|
<pre class="code"></pre> |
|
|
<div id="paper"></div> |
|
|
</main> |
|
|
</body> |
|
|
|
|
|
</html> |