xxxxxxxxxx
70
// Include the p5.sound library in your HTML file for this to work
let lowFrequencies = [697, 770, 852, 941]; // Low-frequency group
let highFrequencies = [1209, 1336, 1477, 1633]; // High-frequency group
let osc1, osc2; // Two oscillators for the dual tones
function setup() {
createCanvas(400, 400);
textSize(20);
textAlign(CENTER, CENTER);
// Initialize oscillators
osc1 = new p5.Oscillator('sine');
osc2 = new p5.Oscillator('sine');
// Set initial volume to 0 (muted)
osc1.amp(0);
osc2.amp(0);
// Start the oscillators
osc1.start();
osc2.start();
}
function draw() {
background(220);
text("Press 0-9, *, or # to play a DTMF tone", width / 2, height / 2);
}
// Play DTMF tones when keys are pressed
function keyPressed() {
let row, col;
// Map keypad characters to row and column indices
switch (key) {
case '1': row = 0; col = 0; break;
case '2': row = 0; col = 1; break;
case '3': row = 0; col = 2; break;
case 'A': row = 0; col = 3; break;
case '4': row = 1; col = 0; break;
case '5': row = 1; col = 1; break;
case '6': row = 1; col = 2; break;
case 'B': row = 1; col = 3; break;
case '7': row = 2; col = 0; break;
case '8': row = 2; col = 1; break;
case '9': row = 2; col = 2; break;
case 'C': row = 2; col = 3; break;
case '*': row = 3; col = 0; break;
case '0': row = 3; col = 1; break;
case '#': row = 3; col = 2; break;
case 'D': row = 3; col = 3; break;
default: return; // Exit if an unrecognized key is pressed
}
// Set oscillator frequencies
let lowFreq = lowFrequencies[row];
let highFreq = highFrequencies[col];
osc1.freq(lowFreq);
osc2.freq(highFreq);
// Gradually increase amplitude
osc1.amp(0.5, 0.05); // Smooth fade-in over 0.05 seconds
osc2.amp(0.5, 0.05);
}
function keyReleased() {
// Gradually decrease amplitude when key is released
osc1.amp(0, 0.05); // Smooth fade-out over 0.05 seconds
osc2.amp(0, 0.05);
}