<!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>