# Interactive Frequency Trainer
> An educational ear training tool using Strudel live coding for mixing and mastering practice
## Overview
This tool generates random frequencies using different waveforms to help develop critical listening skills for audio engineering, mixing, and mastering. Built with Strudel for live coding audio synthesis.
## Controls
### Waveform Selection
- **Sine Wave**: Pure tone, great for frequency identification
- **Square Wave**: Harmonically rich, good for timbre training
- **Sample Waves**: Real-world audio examples
### Frequency Ranges
- **Sub Bass**: 20-60 Hz
- **Bass**: 60-250 Hz
- **Low Mids**: 250-500 Hz
- **Mids**: 500-2000 Hz
- **High Mids**: 2000-4000 Hz
- **Treble**: 4000-20000 Hz
## Interactive Strudel Code
```javascript
// Strudel Ear Training Generator
// Live coding environment for frequency training
// Basic setup
await initStrudel();
// Frequency ranges for training
const freqRanges = {
subBass: [20, 60],
bass: [60, 250],
lowMids: [250, 500],
mids: [500, 2000],
highMids: [2000, 4000],
treble: [4000, 20000]
};
// Waveform types
const waveforms = ['sine', 'square', 'sawtooth', 'triangle'];
// Generate random frequency in range
function randomFreq(range) {
const [min, max] = freqRanges[range];
return Math.floor(Math.random() * (max - min) + min);
}
// Generate random waveform
function randomWaveform() {
return waveforms[Math.floor(Math.random() * waveforms.length)];
}
// Main training pattern
let currentFreq = 440;
let currentWave = 'sine';
// Interactive controls
const controls = {
newFrequency: () => {
currentFreq = randomFreq('mids');
console.log(`New frequency: ${currentFreq}Hz`);
},
newWaveform: () => {
currentWave = randomWaveform();
console.log(`New waveform: ${currentWave}`);
},
newChallenge: () => {
const ranges = Object.keys(freqRanges);
const randomRange = ranges[Math.floor(Math.random() * ranges.length)];
currentFreq = randomFreq(randomRange);
currentWave = randomWaveform();
console.log(`Challenge: ${currentFreq}Hz ${currentWave} wave`);
}
};
// Basic Strudel pattern
const earTrainer = () => {
return sound(currentWave)
.freq(currentFreq)
.gain(0.3)
.attack(0.1)
.release(0.5);
};
// Start the trainer
earTrainer().play();
```
## Training Exercises
### Exercise 1: Frequency Identification
1. Click "New Challenge" to generate a random frequency
2. Listen to the tone
3. Try to identify the frequency range
4. Check your answer
### Exercise 2: Waveform Recognition
1. Generate tones with different waveforms
2. Train your ear to distinguish between sine, square, and sawtooth waves
3. Notice the harmonic content differences
### Exercise 3: Critical Band Training
1. Generate two close frequencies
2. Practice identifying beating and masking effects
3. Develop sensitivity to small frequency differences
## Usage Notes
- Use headphones or quality monitors for accurate frequency response
- Start with wider frequency ranges and gradually narrow them down
- Practice regularly in short sessions (10-15 minutes)
- Take breaks to prevent ear fatigue
## Next Steps
- [ ] Add visual frequency analyzer
- [ ] Implement A/B testing features
- [ ] Add preset frequency challenges
- [ ] Create progress tracking
- [ ] Add harmonics and complex waveforms
---
*Built with [Strudel](https://strudel.tidalcycles.org/) live coding environment*