Create a complete, highly interactive p5.js simulation demonstrating: wave interference

CRITICAL REQUIREMENTS:
1. ACCURACY: The simulation must be scientifically/mathematically accurate for wave interference
2. FUNCTIONAL INTERACTIVITY: All sliders and buttons MUST actually control and modify the simulation behavior in real-time
3. EDUCATIONAL: Users should learn about wave interference through experimentation and parameter manipulation

CONTROL POSITIONING - FOLLOW EXACTLY:
- Canvas size: Use createCanvas(600, 400) for consistent sizing
- Slider positioning: Position sliders using .position(x, height + y) where:
  * First row: y = 20, x = 10, 160, 310, 460 (4 sliders max per row)
  * Second row: y = 60, x = 10, 160, 310, 460 
  * Third row: y = 100, x = 10, 160, 310, 460
- Button positioning: Position buttons at y = height + 140, x = 10, 110, 210, 310, 410
- Slider width: Use .style('width', '120px') for all sliders
- Always use .value() to read slider values: let gravity = gravitySlider.value();

MANDATORY INTERACTIVE ELEMENTS:
- 4-6 sliders controlling key parameters with realistic ranges and proper labels
- 3-4 buttons for actions (reset, pause/play, presets) that actually work
- Real-time parameter display showing current values in the canvas
- Immediate visual feedback when controls change

CONTROL IMPLEMENTATION TEMPLATE:
```javascript
let gravitySlider, velocitySlider, angleSlider, dampingSlider;
let resetBtn, pauseBtn, presetBtn1, presetBtn2;

function setup() {
  createCanvas(600, 400);
  
  // Row 1 sliders - always use this exact positioning pattern
  gravitySlider = createSlider(0.1, 2.0, 0.5, 0.05);
  gravitySlider.position(10, height + 20);
  gravitySlider.style('width', '120px');
  
  velocitySlider = createSlider(1, 50, 20, 1);
  velocitySlider.position(160, height + 20);
  velocitySlider.style('width', '120px');
  
  angleSlider = createSlider(0, 90, 45, 1);
  angleSlider.position(310, height + 20);
  angleSlider.style('width', '120px');
  
  dampingSlider = createSlider(0.9, 1.0, 0.99, 0.001);
  dampingSlider.position(460, height + 20);
  dampingSlider.style('width', '120px');
  
  // Buttons - always use this exact positioning pattern
  resetBtn = createButton('Reset');
  resetBtn.position(10, height + 140);
  resetBtn.mousePressed(resetSimulation);
  
  pauseBtn = createButton('Pause/Play');
  pauseBtn.position(110, height + 140);
  pauseBtn.mousePressed(togglePause);
  
  presetBtn1 = createButton('Preset 1');
  presetBtn1.position(210, height + 140);
  presetBtn1.mousePressed(preset1);
  
  presetBtn2 = createButton('Preset 2');
  presetBtn2.position(310, height + 140);
  presetBtn2.mousePressed(preset2);
}

function draw() {
  background(220);
  
  // ALWAYS read slider values like this
  let gravity = gravitySlider.value();
  let velocity = velocitySlider.value();
  let angle = angleSlider.value();
  let damping = dampingSlider.value();
  
  // Use these values in your simulation
  // Display current values
  fill(0);
  textSize(12);
  text('Gravity: ' + gravity.toFixed(2), 10, 20);
  text('Velocity: ' + velocity.toFixed(1), 10, 35);
  text('Angle: ' + angle.toFixed(0) + '°', 10, 50);
  text('Damping: ' + damping.toFixed(3), 10, 65);
}

// Always implement these functions
function resetSimulation() {
  // Reset your simulation state
}

function togglePause() {
  // Toggle pause state
}

function preset1() {
  // Set specific slider values and reset
  gravitySlider.value(0.5);
  velocitySlider.value(25);
  resetSimulation();
}

function preset2() {
  // Set different slider values and reset
  gravitySlider.value(1.0);
  velocitySlider.value(15);
  resetSimulation();
}
```
PHYSICS/MATH ACCURACY FOR WAVE INTERFERENCE:

Use correct equations and realistic parameter ranges
Proper time scaling: use deltaTime/1000 for smooth animation
Realistic default values that demonstrate the concept well
Units and scaling that make physical sense

VISUAL REQUIREMENTS:

Clear title at top: text('Wave Interference', width/2, 20);
Minimal parameter display (max 6 values shown)
Smooth animations with proper frame rate
Color coding for different elements
Grid lines or reference markers where helpful

CODE STRUCTURE REQUIREMENTS:

Use GLOBAL MODE p5.js (function setup(), function draw())
All variables declared globally with let
Standard p5.js functions (createCanvas, background, fill, etc.)
NO instance mode or sketch wrapper
Clean, readable code with meaningful variable names

TIMING AND ANIMATION:

Use realistic time scaling to avoid too-fast animations
Implement proper physics timesteps
Smooth, continuous motion
Frame rate: use frameRate(60) in setup()

CRITICAL POSITIONING RULES:

NEVER use positioning like height + 10, height + 40 randomly
ALWAYS use the exact positioning template above
ALWAYS use .style('width', '120px') for sliders
ALWAYS use .value() to read slider values in draw()
Position elements in neat rows as specified

Generate an accurate, interactive simulation of: wave interference following the EXACT positioning template above.