Play audio sound in appstudio

is it possible to make a sound in Appstudio at a designated time?

Use setinterval to run a function every x interval to check if the time is right to play sound.

Yes but how does one actually make the sound?

PlayTone(x,x) or PlaySound (Javascript may be NSB.PlaySound)

This code works with my app PianoCalc. To get the sound one has to hit a button. Not sure if this is a relevant solution for your purposes.:

// Stand 2.1.20
// manche Browser begrenzen audiocontext auf 6 oder 8 Aufrufe. Deshalb Empfehlung:
// audioCtx assignment should be moved outside of functionX(), 
// as it will get called every time, eventually throwing an exception since you can't 
// create more than 6 audio contexts in a document.
// chrome policy verlangt, context erst nach user interaction oder resume. 
// Deshalb war let context verschieden verschoben. Trotzdem Meldung von Chrome.
// First, be reminded that it is good practice to wait for a user interaction 
// before starting audio playback as user is aware of something happening. 
// Schließlich, 2.1.20, hier gelassen, da funktioniert und andernfalls diverse andere Probleme
// 16. Okt 2020?: in Projekt Explorer die includes/Taste.. 
// Einträge nicht löschen (in Projekt Datei, children), da dann mp3 nicht wiedergegeben wird.
// in extraFiles jedoch den Ordner includes hinzugefügt

// certificates/pc-api-8953043525238254774-820-687d2376b59c.json

// Experiment vom 12.9.21
console.clear();

// Experiment vom 12.9.21
const AudioContext = window.AudioContext || window.webkitAudioContext;
const context = new AudioContext({
  latencyHint: 'interactive',
  sampleRate: 44100,
});

function taste2note(tastenr) {
   switch(taste) {
    case 88:
        notede = "c5";
        txtNoteDe.value = notede;
        noteen = "C8";
        txtNoteEn.value = noteen;
        break;
    case 87:
        notede = "h4";
        txtNoteDe.value = notede;
        noteen = "B7";
        txtNoteEn.value = noteen;
        break;
    case 86:
        notede = "ais4/b4";
        txtNoteDe.value = notede;
        noteen = "A#7/Bb7";
        txtNoteEn.value = noteen;
        break;
    case 85:
        notede = "a4";
        txtNoteDe.value = notede;
        noteen = "A7";
        txtNoteEn.value = noteen;
        break;
    case 84:
        notede = "gis4/as4"; 
        txtNoteDe.value = notede;
        noteen = "G#7/Ab7";
        txtNoteEn.value = noteen;
        break;
    case 83:
        notede = "g4"; 
        txtNoteDe.value = notede;
        noteen = "G7";
        txtNoteEn.value = noteen;
        break;
    case 82:
        notede = "fis4/ges4"; 
        txtNoteDe.value = notede;
        noteen = "F#7/Gb7";
        txtNoteEn.value = noteen;
        break;
    case 81: 
        notede = "f4"; 
        txtNoteDe.value = notede;
        noteen = "F7";
        txtNoteEn.value = noteen;
        break;  
    case 80:
        notede = "e4"; 
        txtNoteDe.value = notede;
        noteen = "E7";
        txtNoteEn.value = noteen;
        break;
    case 79:
        notede = "dis4/es4"; 
        txtNoteDe.value = notede;
        noteen = "D#7/Eb7";
        txtNoteEn.value = noteen;
        break;
    case 78:
        notede = "d4"; 
        txtNoteDe.value = notede;
        noteen = "D7";
        txtNoteEn.value = noteen;
        break;
    case 77:
        notede = "cis4/des4"; 
        txtNoteDe.value = notede;
        noteen = "C#7/Db7";
        txtNoteEn.value = noteen;
        break;
    case 76:
        notede = "c4"; 
        txtNoteDe.value = notede;
        noteen = "C7";
        txtNoteEn.value = noteen;
        break;
    case 75:
        notede = "h3"; 
        txtNoteDe.value = notede;
        noteen = "B6";
        txtNoteEn.value = noteen;
        break;
    case 74:
        notede = "ais3/b3"; 
        txtNoteDe.value = notede;
        noteen = "A#6/Bb6";
        txtNoteEn.value = noteen;
        break;
    case 73:
        notede = "a3"; 
        txtNoteDe.value = notede;
        noteen = "A6";
        txtNoteEn.value = noteen;
        break;
    case 72:
        notede = "gis3/as3"; 
        txtNoteDe.value = notede;
        noteen = "G#6/Ab6";
        txtNoteEn.value = noteen;
        break;
    case 71:
        notede = "g3"; 
        txtNoteDe.value = notede;
        noteen = "G6";
        txtNoteEn.value = noteen;
        break;
    case 70:
        notede = "fis3/ges3"; 
        txtNoteDe.value = notede;
        noteen = "F#6/Gb6";
        txtNoteEn.value = noteen;
        break;
    case 69:
        notede = "f3"; 
        txtNoteDe.value = notede;
        noteen = "F6";
        txtNoteEn.value = noteen;
        break;
    case 68:
        notede = "e3"; 
        txtNoteDe.value = notede;
        noteen = "E6";
        txtNoteEn.value = noteen;
        break;
    case 67:
        notede = "dis3/es3"; 
        txtNoteDe.value = notede;
        noteen = "D#6/Eb6";
        txtNoteEn.value = noteen;
        break;
    case 66:
        notede = "d3"; 
        txtNoteDe.value = notede;
        noteen = "D6";
        txtNoteEn.value = noteen;
        break;
    case 65:
        notede = "cis3/des3"; 
        txtNoteDe.value = notede;
        noteen = "C#6/Db6";
        txtNoteEn.value = noteen;
        break;
    case 64:
        notede = "c3"; 
        txtNoteDe.value = notede;
        noteen = "C6 (high C)";
        txtNoteEn.value = noteen;
        break;
    case 63:
        notede = "h2"; 
        txtNoteDe.value = notede;
        noteen = "B5";
        txtNoteEn.value = noteen;
        break;
    case 62:
        notede = "ais2/b2"; 
        txtNoteDe.value = notede;
        noteen = "A#5/Bb5";
        txtNoteEn.value = noteen;
        break;
    case 61:
        notede = "a2"; 
        txtNoteDe.value = notede;
        noteen = "A5";
        txtNoteEn.value = noteen;
        break;
    case 60:
        notede = "gis2/as2"; 
        txtNoteDe.value = notede;
        noteen = "G#5/Ab5";
        txtNoteEn.value = noteen;
        break;
    case 59:
        notede = "g2"; 
        txtNoteDe.value = notede;
        noteen = "G5";
        txtNoteEn.value = noteen;
        break;
    case 58:
        notede = "fis2/ges2"; 
        txtNoteDe.value = notede;
        noteen = "F#5/Gb5";
        txtNoteEn.value = noteen;
        break;
    case 57:
        notede = "f2"; 
        txtNoteDe.value = notede;
        noteen = "F5";
        txtNoteEn.value = noteen;
        break;
    case 56:
        notede = "e2"; 
        txtNoteDe.value = notede;
        noteen = "E5";
        txtNoteEn.value = noteen;
        break;
    case 55:
        notede = "dis2/es2"; 
        txtNoteDe.value = notede;
        noteen = "D#5/Eb5";
        txtNoteEn.value = noteen;
        break;
    case 54:
        notede = "d2"; 
        txtNoteDe.value = notede;
        noteen = "D5";
        txtNoteEn.value = noteen;
        break;
    case 53:
        notede = "cis2/des2"; 
        txtNoteDe.value = notede;
        noteen = "C#5/Db5";
        txtNoteEn.value = noteen;
        break;
    case 52:
        notede = "c2"; 
        txtNoteDe.value = notede;
        noteen = "C5";
        txtNoteEn.value = noteen;
        break;
    case 51:
        notede = "h1"; 
        txtNoteDe.value = notede;
        noteen = "B4";
        txtNoteEn.value = noteen;
        break;
    case 50:
        notede = "ais1/b1"; 
        txtNoteDe.value = notede;
        noteen = "A#4/Bb4";
        txtNoteEn.value = noteen;
        break;
    case 49:
        notede = "a1 - Kammerton"; 
        txtNoteDe.value = notede;
        noteen = "A4 - concert pitch";
        txtNoteEn.value = noteen;
        break;
    case 48:
        notede = "gis1/as1"; 
        txtNoteDe.value = notede;
        noteen = "G#4/Ab4";
        txtNoteEn.value = noteen;
        break;
    case 47:
        notede = "g1"; 
        txtNoteDe.value = notede;
        noteen = "G4";
        txtNoteEn.value = noteen;
        break;
    case 46:
        notede = "fis1/ges1"; 
        txtNoteDe.value = notede;
        noteen = "F#4/Gb4";
        txtNoteEn.value = noteen;
        break;
    case 45:
        notede = "f1"; 
        txtNoteDe.value = notede;
        noteen = "F4";
        txtNoteEn.value = noteen;
        break;
    case 44:
        notede = "e1"; 
        txtNoteDe.value = notede;
        noteen = "E4";
        txtNoteEn.value = noteen;
        break;
    case 43:
        notede = "dis1/es1"; 
        txtNoteDe.value = notede;
        noteen = "D#4/Eb4";
        txtNoteEn.value = noteen;
        break;
    case 42:
        notede = "d1"; 
        txtNoteDe.value = notede;
        noteen = "D4";
        txtNoteEn.value = noteen;
        break;
    case 41:
        notede = "cis1/des1"; 
        txtNoteDe.value = notede;
        noteen = "C#4/Db4";
        txtNoteEn.value = noteen;
        break;
    case 40:
        notede = "c1 Eingestrichenes"; 
        txtNoteDe.value = notede;
        noteen = "C4 middle";
        txtNoteEn.value = noteen;
        break;
    case 39:
        notede = "h"; 
        txtNoteDe.value = notede;
        noteen = "B3";
        txtNoteEn.value = noteen;
        break;
    case 38:
        notede = "ais/b"; 
        txtNoteDe.value = notede;
        noteen = "A#3/Bb3";
        txtNoteEn.value = noteen;
        break;
    case 37:
        notede = "a"; 
        txtNoteDe.value = notede;
        noteen = "A3";
        txtNoteEn.value = noteen;
        break;
    case 36:
        notede = "gis/as"; 
        txtNoteDe.value = notede;
        noteen = "G#3/Ab3";
        txtNoteEn.value = noteen;
        break;
    case 35:
        notede = "g"; 
        txtNoteDe.value = notede;
        noteen = "G3";
        txtNoteEn.value = noteen;
        break;
    case 34:
        notede = "fis/ges"; 
        txtNoteDe.value = notede;
        noteen = "F#3/Gb3";
        txtNoteEn.value = noteen;
        break;
    case 33:
        notede = "f"; 
        txtNoteDe.value = notede;
        noteen = "F3";
        txtNoteEn.value = noteen;
        break;
    case 32:
        notede = "e"; 
        txtNoteDe.value = notede;
        noteen = "E3";
        txtNoteEn.value = noteen;
        break;
    case 31:
        notede = "dis/es"; 
        txtNoteDe.value = notede;
        noteen = "D#3/Eb3";
        txtNoteEn.value = noteen;
        break;
    case 30:
        notede = "d"; 
        txtNoteDe.value = notede;
        noteen = "D3";
        txtNoteEn.value = noteen;
        break;
    case 29:
        notede = "cis/des"; 
        txtNoteDe.value = notede;
        noteen = "C#3/Db3";
        txtNoteEn.value = noteen;
        break;
    case 28:
        notede = "c Kleine Oktave"; 
        txtNoteDe.value = notede;
        noteen = "C3";
        txtNoteEn.value = noteen;
        break;
    case 27:
        notede = "H"; 
        txtNoteDe.value = notede;
        noteen = "B2";
        txtNoteEn.value = noteen;
        break;
    case 26:
        notede = "Ais/B"; 
        txtNoteDe.value = notede;
        noteen = "A#2/Bb2";
        txtNoteEn.value = noteen;
        break;
    case 25:
        notede = "A"; 
        txtNoteDe.value = notede;
        noteen = "A2";
        txtNoteEn.value = noteen;
        break;
    case 24:
        notede = "Gis/As"; 
        txtNoteDe.value = notede;
        noteen = "G#2/Ab2";
        txtNoteEn.value = noteen;
        break;
    case 23:
        notede = "G"; 
        txtNoteDe.value = notede;
        noteen = "G2";
        txtNoteEn.value = noteen;
        break;
    case 22:
        notede = "Fis/Ges"; 
        txtNoteDe.value = notede;
        noteen = "F#2/Gb2";
        txtNoteEn.value = noteen;
        break;
    case 21:
        notede = "F"; 
        txtNoteDe.value = notede;
        noteen = "F2";
        txtNoteEn.value = noteen;
        break;
    case 20:
        notede = "E"; 
        txtNoteDe.value = notede;
        noteen = "E2";
        txtNoteEn.value = noteen;
        break;
    case 19:
        notede = "Dis/Es"; 
        txtNoteDe.value = notede;
        noteen = "D#2/Eb2";
        txtNoteEn.value = noteen;
        break;
    case 18:
        notede = "D"; 
        txtNoteDe.value = notede;
        noteen = "D2";
        txtNoteEn.value = noteen;
        break;
    case 17:
        notede = "Cis/Des"; 
        txtNoteDe.value = notede;
        noteen = "C#2/Db2";
        txtNoteEn.value = noteen;
        break;
    case 16:
        notede = "C - Große Oktave"; 
        txtNoteDe.value = notede;
        noteen = "C2 (low C)";
        txtNoteEn.value = noteen;
        break;
    case 15:
        notede = "'H"; 
        txtNoteDe.value = notede;
        noteen = "B1";
        txtNoteEn.value = noteen;
        break;
    case 14:
        notede = "'Ais/'B"; 
        txtNoteDe.value = notede;
        noteen = "A#1/Bb1";
        txtNoteEn.value = noteen;
        break;
    case 13:
        notede = "'A"; 
        txtNoteDe.value = notede;
        noteen = "A1";
        txtNoteEn.value = noteen;
        break;
    case 12:
        notede = "'Gis/'As"; 
        txtNoteDe.value = notede;
        noteen = "G#1/Ab1";
        txtNoteEn.value = noteen;
        break;
    case 11:
        notede = "'G"; 
        txtNoteDe.value = notede;
        noteen = "G1";
        txtNoteEn.value = noteen;
        break;
    case 10:
        notede = "'Fis/'Ges"; 
        txtNoteDe.value = notede;
        noteen = "F#1/Gb1";
        txtNoteEn.value = noteen;
        break;
    case 9:
        notede = "'F"; 
        txtNoteDe.value = notede;
        noteen = "F1";
        txtNoteEn.value = noteen;
        break;
    case 8:
        notede = "'E"; 
        txtNoteDe.value = notede;
        noteen = "E1";
        txtNoteEn.value = noteen;
        break;
    case 7:
        notede = "'Dis/'Es"; 
        txtNoteDe.value = notede;
        noteen = "D#1/Eb1";
        txtNoteEn.value = noteen;
        break;
    case 6:
        notede = "'D"; 
        txtNoteDe.value = notede;
        noteen = "D1";
        txtNoteEn.value = noteen;
        break;
    case 5:
        notede = "'Cis/'Des"; 
        txtNoteDe.value = notede;
        noteen = "C#1/Db1";
        txtNoteEn.value = noteen;
        break;
    case 4:
        notede = "'C - Kontra-Oktave"; 
        txtNoteDe.value = notede;
        noteen = "C1";
        txtNoteEn.value = noteen;
        break;
    case 3:
        notede = "''H"; 
        txtNoteDe.value = notede;
        noteen = "B0";
        txtNoteEn.value = noteen;
        break;
    case 2:
        notede = "''Ais/''B"; 
        txtNoteDe.value = notede;
        noteen = "A#0/Bb0";
        txtNoteEn.value = noteen;
        break;          
    case 1:
        notede = "''A"; 
        txtNoteDe.value = notede;
        noteen = "A0";
        txtNoteEn.value = noteen;
        break;
    case 0:
        notede = "''Gis/''As"; 
        txtNoteDe.value = notede;
        noteen = "G#0/Ab0";
        txtNoteEn.value = noteen;
        break;
    case -1:
        notede = "''G"; 
        txtNoteDe.value = notede;
        noteen = "G0";
        txtNoteEn.value = noteen;
        break;
    case -2:
        notede = "''Fis/''Ges";  
        txtNoteDe.value = notede;
        noteen = "F#0/Gb0";
        txtNoteEn.value = noteen;
        break;
    case -3:
        notede = "''F"; 
        txtNoteDe.value = notede;
        noteen = "F0";
        txtNoteEn.value = noteen;
        break;
    case -4:
        notede = "''E"; 
        txtNoteDe.value = notede;
        noteen = "E0";
        txtNoteEn.value = noteen;
        break;
    case -5:
        notede = "''Dis/''Es";
        txtNoteDe.value = notede;
        noteen = "D#0/Eb0";
        txtNoteEn.value = noteen;
        break;
    case -6:
        notede = "''D"; 
        txtNoteDe.value = notede;
        noteen = "D0";
        txtNoteEn.value = noteen;
        break;
    case -7:
        notede = "''Cis/''Des";
        txtNoteDe.value = notede;
        noteen = "C#0/Db0";
        txtNoteEn.value = noteen;
        break;
    case -8:
        notede = "''C - Subkontra-Oktave";
        txtNoteDe.value = notede;
        noteen = "C0";
        txtNoteEn.value = noteen;
        break; 
   } //Ende switch
} //Ende Function

ButtonPiano.onclick=function(){
  switch(taste) {
    case 88:
        NSB.PlaySound("Taste88.mp3");
        break;
    case 87:
        NSB.PlaySound("Taste87.mp3");
        break;
    case 86:
        NSB.PlaySound("Taste86.mp3");
        break;
    case 85:
        NSB.PlaySound("Taste85.mp3");
        break;
    case 84:
        NSB.PlaySound("Taste84.mp3");
        break;
    case 83:
        NSB.PlaySound("Taste83.mp3");
        break;
    case 82:
        NSB.PlaySound("Taste82.mp3");
        break; 
    case 81:
        NSB.PlaySound("Taste81.mp3");
        break;
    case 80:
        NSB.PlaySound("Taste80.mp3");
        break;
    case 79:
        NSB.PlaySound("Taste79.mp3");
        break;
    case 78:
        NSB.PlaySound("Taste78.mp3");
        break;
    case 77:
        NSB.PlaySound("Taste77.mp3");
        break;
    case 76:
        NSB.PlaySound("Taste76.mp3");
        break;
    case 75:
        NSB.PlaySound("Taste75.mp3");
        break;
    case 74:
        NSB.PlaySound("Taste74.mp3");
        break;
    case 73:
        NSB.PlaySound("Taste73.mp3");
        break;
    case 72:
        NSB.PlaySound("Taste72.mp3");
        break;
    case 71:
        NSB.PlaySound("Taste71.mp3");
        break;
    case 70:
        NSB.PlaySound("Taste70.mp3");
        break;
    case 69:
        NSB.PlaySound("Taste69.mp3");
        break;
    case 68:
        NSB.PlaySound("Taste68.mp3");
        break;
    case 67:
        NSB.PlaySound("Taste67.mp3");
        break;
    case 66:
        NSB.PlaySound("Taste66.mp3");
        break;
    case 65:
        NSB.PlaySound("Taste65.mp3");
        break;
    case 64:
        NSB.PlaySound("Taste64.mp3");
        break;
    case 63:
        NSB.PlaySound("Taste63.mp3");
        break;
    case 62:
        NSB.PlaySound("Taste62.mp3");
        break;
    case 61:
        NSB.PlaySound("Taste61.mp3");
        break;
    case 60:
        NSB.PlaySound("Taste60.mp3");
        break;
    case 59:
        NSB.PlaySound("Taste59.mp3");
        break;
    case 58:
        NSB.PlaySound("Taste58.mp3");
        break;
    case 57:
        NSB.PlaySound("Taste57.mp3");
        break;
    case 56:
        NSB.PlaySound("Taste56.mp3");
        break;
    case 55:
        NSB.PlaySound("Taste55.mp3");
        break;
    case 54:
        NSB.PlaySound("Taste54.mp3");
        break;
    case 53:
        NSB.PlaySound("Taste53.mp3");
        break;
    case 52:
        NSB.PlaySound("Taste52.mp3");
        break;
    case 51:
        NSB.PlaySound("Taste51.mp3");
        break;
    case 50:
        NSB.PlaySound("Taste50.mp3");
        break;
    case 49:
        NSB.PlaySound("Taste49.mp3");
        break;
    case 48:
        NSB.PlaySound("Taste48.mp3");
        break;
    case 47:
        NSB.PlaySound("Taste47.mp3");
        break;
    case 46:
        NSB.PlaySound("Taste46.mp3");
        break;
    case 45:
        NSB.PlaySound("Taste45.mp3");
        break;
    case 44:
        NSB.PlaySound("Taste44.mp3");
        break;
    case 43:
        NSB.PlaySound("Taste43.mp3");
        break;
    case 42:
        NSB.PlaySound("Taste42.mp3");
        break;
    case 41:
        NSB.PlaySound("Taste41.mp3");
        break;
    case 40:
        NSB.PlaySound("Taste40.mp3");
        break;
    case 39:
        NSB.PlaySound("Taste39.mp3");
        break;
    case 38:
        NSB.PlaySound("Taste38.mp3");
        break;
    case 37:
        NSB.PlaySound("Taste37.mp3");
        break;
    case 36:
        NSB.PlaySound("Taste36.mp3");
        break;
    case 35:
        NSB.PlaySound("Taste35.mp3");
        break;
    case 34:
        NSB.PlaySound("Taste34.mp3");
        break;
    case 33:
        NSB.PlaySound("Taste33.mp3");
        break;
    case 32:
        NSB.PlaySound("Taste32.mp3");
        break;
    case 31:
        NSB.PlaySound("Taste31.mp3");
        break;    
    case 30:
        NSB.PlaySound("Taste30.mp3");
        break;
    case 29:
        NSB.PlaySound("Taste29.mp3");
        break;
    case 28:
        NSB.PlaySound("Taste28.mp3");
        break;
    case 27:
        NSB.PlaySound("Taste27.mp3");
        break;
    case 26:
        NSB.PlaySound("Taste26.mp3");
        break;
    case 25:
        NSB.PlaySound("Taste25.mp3");
        break;
    case 24:
        NSB.PlaySound("Taste24.mp3");
        break;
    case 23:
        NSB.PlaySound("Taste23.mp3");
        break;
    case 22:
        NSB.PlaySound("Taste22.mp3");
        break;
    case 21:
        NSB.PlaySound("Taste21.mp3");
        break;
    case 20:
        NSB.PlaySound("Taste20.mp3");
        break;
    case 19:
        NSB.PlaySound("Taste19.mp3");
        break;
    case 18:
        NSB.PlaySound("Taste18.mp3");
        break;
    case 17:
        NSB.PlaySound("Taste17.mp3");
        break;
    case 16:
        NSB.PlaySound("Taste16.mp3");
        break;
    case 15:
        NSB.PlaySound("Taste15.mp3");
        break;
    case 14:
        NSB.PlaySound("Taste14.mp3");
        break;
    case 13:
        NSB.PlaySound("Taste13.mp3");
        break;
    case 12:
        NSB.PlaySound("Taste12.mp3");
        break;
    case 11:
        NSB.PlaySound("Taste11.mp3");
        break;
    case 10:
        NSB.PlaySound("Taste10.mp3");
        break;
    case 9:
        NSB.PlaySound("Taste09.mp3");
        break;
    case 8:
        NSB.PlaySound("Taste08.mp3");
        break;
    case 7:
        NSB.PlaySound("Taste07.mp3");
        break;
    case 6:
        NSB.PlaySound("Taste06.mp3");
        break;
    case 5:
        NSB.PlaySound("Taste05.mp3");
        break;
    case 4:
        NSB.PlaySound("Taste04.mp3");
        break;
    case 3:
        NSB.PlaySound("Taste03.mp3");
        break;
    case 2:
        NSB.PlaySound("Taste02.mp3");
        break;
    case 1:
        NSB.PlaySound("Taste01.mp3");
        break;
    } // End switch
} //Ende Function

ButtonRechne.onclick=function(){
    //Parameter 10 ist für Dezimalsystem
    taste = parseInt(txtTaste.value, 10);  
    if (taste > 88) {
      alert('Maximal 88');
      txtTaste.value = 88; //kein String!, da inputType = Zahl
	  taste = 88;
    } else
    if (taste < -8) {
      alert('Nur bis -8');
	  txtTaste.value = -8; //kein String!, da inputType = Zahl
	  taste = -8;
    } 
    //txtFrequenz - Kammerton A = 49
    powy = (taste-49)/12;
    frequenz = 440 * Math.pow(2,powy);
    frequenz2 = Math.round(frequenz * 10000) / 10000;  
    txtFrequenz.value = frequenz2;        
    midinr = (12*Math.log2(frequenz/440)) + 69;
    txtMidi.value = parseInt(midinr, 10);
    taste2note(taste);     // Funktion taste2note
} //Click ButtonRechne 


// item 1, 2, 3 = choice 0, 1, 2
//Navs1.onclick = function (choicenav) {
//  if (choicenav === 1 ) { ChangeForm(Form2) };
//  if (choicenav === 2 ) { ChangeForm(Form3) };
//}


ButtonTon.onclick=function(){  
  // class Sound etc aus: https://css-tricks.com/introduction-web-audio-api/
  class Sound {
  constructor(context) {
    this.context = context;
  }
  
  setup() {
    this.oscillator = this.context.createOscillator();
    this.gainNode = this.context.createGain();

    this.oscillator.connect(this.gainNode);
    this.gainNode.connect(this.context.destination);
    this.oscillator.type = 'sine';
  } // type sine nicht erforderlich, da sine default

  play(value) {
    this.setup();
    this.oscillator.frequency.value = value;
    this.gainNode.gain.setValueAtTime(3, this.context.currentTime);
                
    this.oscillator.start(this.context.currentTime);
    this.stop(this.context.currentTime);
  }
  
  // The AudioParam.exponentialRampToValueAtTime(value, endTime)
  // method schedules gradual change of the value. 
  // 1. Parameter darf nicht Null sein. Beispiel war mit 0.001.
  // Ende bei 0.01 klingt wohl besser
  // This code will exponentially decrease the volume of the oscillator in one second, which is a good way to stop sound smoothly
  // ich habe decrease in 1 sec durch 1.5 ersetzt
  // deshalb auch stop nach 1 sec durch 1.5 ersetzt
  // bei txtTaste < 20 war Ton kaum hörbar. Deshalb mit Werten experimentiert. Noch nicht perfekt. Ganz brauchbar, nachdem oben setValueAtTime auf 3 gesetzt
  
  stop() {
    if (taste < 20) {
    this.gainNode.gain.linearRampToValueAtTime(0.01, this.context.currentTime + 3);
    this.oscillator.stop(this.context.currentTime + 3); // war 0.5, mit 4 oder 3 lang, aber knackt nicht mehr am Ende
  } else {
    this.gainNode.gain.exponentialRampToValueAtTime(0.01, this.context.currentTime + 1.5);
    this.oscillator.stop(this.context.currentTime + 1.5);
    }
  }
 
} // Ende class Sound

//You can simply use any and the compiler will let you new it:
//let contextClass : any = window.AudioContext || window.webkitAudioContext;
//let context: AudioContext = new contextClass();
// Korrekturversuch, funkt nicht, stoert sich an :


//Code mit manchmal Fehlermeldung, wenn wiederholt andere Note eingegeben und gespielt wird:
// audioCtx assignment should be moved outside of functionX(), hier ButtonTon, as it will get called every time, eventually throwing an exception since you can't create more than 6 audio contexts in a document.
//let context = new (window.AudioContext || window.webkitAudioContext)();

let note = new Sound(context);
let now = context.currentTime;
note.play(frequenz, now);

} // Ende ButtonTon


Taste.onclick=function(){
  ChangeForm(Form2);
}

CopyrightInfo.onclick=function(){
  ChangeForm(Form3);
}

Put the audio track file name (ie. music.mp3) into your extraFiles (full deploy is required). In your app use:

Audio1.src = “music.mp3”
Audio1.play()

Use the loop property of Audio1 to continuously replay the sound and Audio1.pause() to stop.

I took an unused older tablet and wrote an app to be a clock, big red numbers with date, then added an alarm function. A setInterval is used to test a time for the alarm to sound and then uses Audio1.play() to make it happen.

John