Speaking of Witch User Manual
ποΈ Overview & Philosophy
Speaking of Witch is a speech-to-synth sampler that transforms text into expressive musical performances. Built on iOS's powerful AVSpeechSynthesizer engine, it captures spoken phrases and makes them playable as pitched, envelope-shaped samples across 16 independent pads with full MIDI control and multi-output routing.
The Speech Synthesis Vision
Traditional samplers require external audio sources, but Speaking of Witch generates its own unique content through:
- On-Device Speech Generation: Instant text-to-audio conversion using iOS system voices
- Multilingual Expression: Support for dozens of languages and voices
- Musical Pitch Control: Transform speech into melodic, harmonic, and rhythmic elements
- Professional Routing: 8-bus multi-output architecture for complex mixing scenarios
- Expressive Envelopes: Amplitude and pitch envelopes shape each trigger
Unique Design Philosophy
Speaking of Witch embraces a hybrid approach:
- Text is the Source: Type words, render speech, play musically
- Short Phrases, Multiple Pads: Design philosophy encourages splitting content across pads instead of long texts in single pads
- MIDI Channel = Pad Selector: Each pad responds only to its assigned MIDI channel (or use Single MIDI Channel Mode for sequential triggering)
- Output Bus = Mixing Group: Route multiple pads to dedicated outputs for external processing
- Envelope Per Trigger: Every MIDI note applies independent amplitude and pitch envelopes
- Speed = Pitch: Variable speed playback controls both duration and pitch simultaneously
The Multi-Pad Workflow Philosophy
Speaking of Witch is designed around distributing content across 16 pads rather than loading long texts into individual pads:
Why Short Phrases Work Better:
- β
Faster synthesis times (1-3 seconds vs 10+ seconds)
- β
Lower memory usage (prevents crashes)
- β
More musical and responsive
- β
Easier to sequence and perform
- β
Presets load quickly
Recommended Approach:
Instead of: One pad with paragraph-length text
Do this: Split into 8-16 pads with 1-5 words each
Example - Song Lyrics:
- β Avoid: Pad 1 = entire verse (50+ words)
- β
Better: Pad 1 = "Walking down", Pad 2 = "the street", Pad 3 = "I saw you", Pad 4 = "yesterday"
Example - Syllable Chopping:
- β Avoid: Pad 1 = "Supercalifragilisticexpialidocious"
- β
Better: Pad 1 = "Super", Pad 2 = "cali", Pad 3 = "fragi", Pad 4 = "listic" (trigger sequentially via MIDI)
This multi-pad design enables creative sequencing, layering, and performance that would be impossible with monolithic long-text samples.
π§ Core Architecture
16-Pad Sampler Design
Speaking of Witch organizes audio around 16 independent pads, each containing:
- 16 buffer slots per pad (multiple takes/variations of the same phrase)
- 1 active slot per pad (selectable)
- Monophonic playback: Each pad plays one note at a time
- 16-voice polyphony total: All 16 pads can play simultaneously
Pad Independence
- Each pad has its own text, voice, envelopes, routing, and MIDI channel
- Pads can share the same MIDI channel (layering) or use unique channels (sequencing)
- Pads can share the same output bus (submixing) or use separate busses (multi-tracking)
Signal Chain Overview
1. TEXT INPUT
User types phrase β selects voice/language
β
2. SPEECH SYNTHESIS (AVSpeechSynthesizer)
Text β AVSpeechSynthesizer.write() β float array (mono @ 44.1kHz)
β
3. SAMPLE LOADING (Swift β C++ Bridge)
Float array β DSPBridge β DSPKernel β Pad buffer slot
β
4. MIDI TRIGGERING
MIDI Note On (channel X, note Y, velocity Z)
β DSPKernel filters by channel
β Matching pad(s) trigger playback
β
5. REAL-TIME PLAYBACK (Per-Pad Voice)
Sample buffer β Speed modulation (MIDI note + speed param + pitch envelope)
β Amplitude envelope application
β Stereo panning
β
6. BUS MIXING (8 Stereo Busses)
All pads assigned to Bus 0 β mix together β Output Bus 0
All pads assigned to Bus 1 β mix together β Output Bus 1
... (up to 8 busses)
β
7. AUDIO OUTPUT
8 stereo busses (16 channels) β AUv3 multi-output β DAW host
π¨ User Interface
Main Pad Grid
The main interface displays all 16 pads in a grid layout:
Pad Display Elements
- Pad Number: Identifier (Pad 1-16)
- Text Label: First line of the entered text
- Waveform Preview: Visual representation of loaded sample (shows when synthesis complete)
- Loading Indicator: Spinning indicator during speech synthesis
- MIDI Channel Badge: Shows assigned MIDI channel (Ch 1-16)
- Output Bus Indicator: Shows assigned output bus (Bus 1-8)
- Sample Duration: Length of loaded sample
- Status Indicator: Empty/Loading/Ready states
Interaction
- Tap: Open pad editor
- Long Press: Trigger pad manually (audition)
- Color Coding: Visual grouping by output bus or MIDI channel
Pad Editor
Selecting a pad opens the detailed editor with tabs/sections:
Text & Voice Section
- Text Field: Multi-line text input for speech synthesis
- Voice Selector: Choose from available iOS voices
- Language Filter: Filter voices by language
- Preview Button: Hear speech without rendering to pad
- Render Button: Generate and load sample into active slot
Playback Section
- Speed Control: 0.5x to 2.0x playback speed (affects pitch & duration)
- Gain Control: 0-100% volume level
- Pan Control: L100% to Center to R100% stereo positioning
- Active Slot Selector: Choose which of 16 buffer slots to use
Routing Section
- MIDI Channel Selector: Assign to channels 1-16
- Output Bus Selector: Assign to busses 1-8
- MIDI Learn: Tap to auto-assign next incoming MIDI message
Visual State Indicators
- Loading Spinner: Appears during speech synthesis (background thread)
- Waveform Display: Shows sample is ready to play
- Empty Waveform: No sample loaded yet (enter text and tap "Render")
- Error Indicator: Speech synthesis failed (check text/voice selection)
Envelope Editors
Each pad has two independent envelope editors:
Amplitude Envelope Editor
- Visual Waveform Display: Shows sample waveform as background
- Breakpoint Curve Overlay: Editable amplitude envelope
- Touch Editing:
- Tap to add breakpoint
- Drag to move breakpoint
- Long-press to delete breakpoint
- Time Domain: X-axis represents sample duration (normalized 0-1)
- Amplitude Domain: Y-axis represents gain multiplier (0-1)
Pitch Envelope Editor
- Visual Waveform Display: Shows sample waveform as background
- Breakpoint Curve Overlay: Editable pitch envelope
- Touch Editing: Same as amplitude envelope
- Time Domain: X-axis represents sample duration (normalized 0-1)
- Pitch Domain: Y-axis represents pitch shift in semitones (-12 to +12)
π£οΈ Speech Synthesis Engine
AVSpeechSynthesizer Integration
Speaking of Witch uses Apple's built-in AVSpeechSynthesizer framework for high-quality, on-device speech generation.
Synthesis Pipeline
- Text Input: User enters text in pad editor
- Voice Selection: Choose from system-installed voices
- Utterance Creation: Configure speech rate and pitch
- Audio Capture: Use
AVSpeechSynthesizer.write() to capture audio buffers
- Buffer Concatenation: Combine all audio buffers into single float array
- Silence Trimming: Remove leading silence (preserving 10ms attack)
- Sample Loading: Copy float array into C++ DSP engine
Speech Settings
- Speech Rate: Fixed at 0.35x (natural, clear speech)
- Pitch Multiplier: Fixed at 1.0x (natural pitch - musical pitch is controlled via speed and MIDI)
- Output Format: Mono, 44.1kHz (matches typical speech synthesis output)
Multiple Language Support
Speaking of Witch supports all iOS system voices across dozens of languages and dialects.
Example Voices
- English: Samantha (en-US), Daniel (en-GB), Karen (en-AU)
- Spanish: MΓ³nica (es-ES), Paulina (es-MX)
- French: Thomas (fr-FR), AmΓ©lie (fr-CA)
- German: Anna (de-DE)
- Japanese: Kyoko (ja-JP)
- Mandarin: Ting-Ting (zh-CN)
- Arabic: Maged (ar-SA)
- Hindi: Lekha (hi-IN)
And many more, including regional variants and enhanced voices.
Voice Documentation
For a complete list of available voices, see Apple's AVSpeechSynthesizer documentation.
Note: Available voices depend on which voices are installed on your iOS device. You can download additional voices in Settings β Accessibility β Spoken Content β Voices.
Voice Selection
Voice Picker Interface
- Grouped by Language: Voices organized by language code
- Voice Preview: Tap to hear voice sample
- Voice Metadata: Displays voice name, language, and quality level
- Search/Filter: Quickly find voices by name or language
Voice Quality Levels
iOS voices come in different quality levels:
- Compact: Small download, lower quality
- Enhanced: Larger download, higher quality (recommended for musical use)
Text-to-Audio Pipeline
Workflow
- Enter Text: Type phrase in pad editor (e.g., "Hello world")
- Select Voice: Choose voice/language from picker
- Preview (Optional): Tap "Preview" to hear speech without rendering
- Render: Tap "Render" to synthesize and load into pad buffer
- Background Processing: Speech synthesis happens in background thread
- Sample Ready: Waveform appears, pad is ready to play via MIDI
Render Time & Text Length Guidelines
Synthesis Time (per pad):
- Short phrases (1-5 words): ~1-2 seconds
- Medium phrases (5-15 words): ~2-5 seconds
- Long phrases (15-50 words): ~5-15 seconds
- Very long text (50+ words): May cause slowdowns or crashes
Text Length Recommendations:
- β
Recommended: 1-20 words per pad (0.5-3 seconds audio, musical and responsive)
- β οΈ Use Carefully: 20-100 words (slow synthesis, high memory usage)
- β Avoid: 100+ words per pad (crash risk, impractical for musical use)
Memory & Stability:
- No Hard Technical Limit: You CAN paste very long text, but shouldn't
- Crash Risk: Extremely long text (thousands of words, large copied documents) can exceed memory limits
- User Responsibility: The app trusts you to use reasonable text lengths
- Best Practice: If you need long content, split it across multiple pads instead of one massive text block
Musical Timing Tip: Consider BPM and beat subdivisions when crafting phrases. Short, punchy phrases work best for rhythmic and melodic sequences.
π Pad Configuration
Text Input & Voice Settings
Text Field
- Multi-Line Support: Enter phrases with line breaks
- No Hard Character Limit: You can paste any length, but keep it reasonable
- Recommended Length: 1-20 words per pad (see "Design Philosophy" above)
- Special Characters: Punctuation affects speech pacing and intonation
- Numbers: Spoken as words (e.g., "42" β "forty-two")
Design Tip - Splitting Content Across Pads:
If you have long text to work with, split it intelligently:
- By Phrase: "Hello there" β Pad 1, "How are you" β Pad 2
- By Syllable: "Ex-traor-di-na-ry" β 5 pads (Pad 1 = "Ex", Pad 2 = "traor", etc.)
- By Word: "One" β Pad 1, "Two" β Pad 2, "Three" β Pad 3...
- By Sentence: Split paragraphs into individual sentences across pads
This approach gives you better control, faster synthesis, and more creative performance possibilities.
Voice Settings
- Voice Identifier: Each pad stores selected voice by identifier
- Persistence: Voice selection saved with presets
- Default Voice: Uses system default if no voice specified
Speed Control
The Speed parameter (0.5x to 2.0x) is a fundamental control that affects multiple aspects of playback:
Speed Effects
- Playback Rate: Multiplies sample playback speed
- Pitch Shift: Faster = higher pitch, slower = lower pitch (classic tape-style)
- Duration: Faster = shorter, slower = longer
Speed Accumulation
The final playback speed is a combination of multiple factors:
Final Speed = Base Speed Γ MIDI Note Factor Γ Pitch Envelope Γ Tempo Sync Factor
Where:
- Base Speed: Pad's speed parameter (0.5-2.0x)
- MIDI Note Factor: Pitch shift from MIDI note number
- Pitch Envelope: Real-time modulation from pitch envelope
- Tempo Sync Factor: Optional BPM-based adjustment (future feature)
Practical Uses
- Fine-Tuning: Adjust base pitch/speed to taste (0.8x for deeper, 1.2x for brighter)
- Formant Shifting: Speed changes affect formants (vocal character)
- Time Compression: Fit longer phrases into shorter musical timing
Gain & Pan
Gain Control
- Range: 0.0 to 1.0 (0% to 100%)
- Default: 0.8 (80%)
- Per-Pad: Independent gain for each pad
- Pre-Envelope: Gain applied before amplitude envelope modulation
- Use Cases:
- Balance relative loudness of different phrases
- Create dynamics variation across pads
- Prevent clipping in dense mixes
Pan Control
- Range: -1.0 to +1.0 (L100% to Center to R100%)
- Default: 0.0 (Center)
- Per-Pad: Independent stereo positioning
- Stereo Field:
- -1.0: Hard left
- -0.5: Moderate left
- 0.0: Center
- +0.5: Moderate right
- +1.0: Hard right
- Use Cases:
- Create wide stereo soundscapes
- Separate pads spatially for clarity
- Alternating L/R patterns for call-and-response effects
Multiple Takes (16 Buffer Slots)
Each pad contains 16 independent buffer slots, allowing multiple variations of the same or different phrases.
Slot Management
- Active Slot: Only one slot is active for playback at a time
- Slot Selector: Choose active slot (1-16) in pad editor
- Independent Storage: Each slot stores a complete sample independently
- Instant Switching: Change active slot instantly (even during playback)
Creative Uses
- Variations: Record same phrase with different voices β switch between them
- Syllable Splitting: Record individual syllables β trigger different slots for complex phrases
- Multi-Language: Store same phrase in different languages β switch dynamically
- Performance Layers: Store soft/loud variations β switch based on context
Memory Considerations
- Per-Slot Size: Varies by sample length (~192KB per second @ 44.1kHz mono)
- 1-second sample: ~192 KB
- 3-second sample: ~576 KB
- 10-second sample: ~1.92 MB
- Per-Pad Maximum: 16 slots Γ sample length
- Total Memory: Sum of all loaded samples across all pads and slots
- Crash Risk: Loading very long samples (50+ seconds) across multiple pads can exceed memory limits
- Realistic Usage: Most users keep samples short (1-5 seconds) and use 1-3 slots per pad
Important Memory Notes:
- Samples are stored in memory while loaded (not on disk)
- Very long text generates very long samples β high memory usage
- Presets do NOT save sample data (see Preset Management section below)
- Pads re-synthesize speech from saved text when loading presets
π Envelope System
Speaking of Witch features a sophisticated breakpoint envelope system with independent amplitude and pitch envelopes per pad.
Amplitude Envelope
The amplitude envelope controls the volume curve applied to each triggered note.
Envelope Characteristics
- Breakpoint Curve: User-definable with unlimited breakpoints
- Time-Normalized: X-axis spans entire sample duration (0.0 to 1.0)
- Amplitude Range: Y-axis from 0.0 (silence) to 1.0 (full volume)
- Interpolation: Smooth curves between breakpoints (linear or cubic)
- Default: Constant 1.0 (no modulation)
Common Envelope Shapes
- Fade In: Start at 0.0, rise to 1.0 at midpoint, hold
- Fade Out: Start at 1.0, hold, drop to 0.0 at end
- Fade In/Out: Classic ADSR-style shape with attack and release
- Gate: Start at 1.0, drop to 0.0 at specific point (hard cutoff)
- Tremolo: Multiple up/down cycles for rhythmic amplitude modulation
Pitch Envelope
The pitch envelope controls pitch modulation over the duration of each triggered note.
Envelope Characteristics
- Breakpoint Curve: User-definable with unlimited breakpoints
- Time-Normalized: X-axis spans entire sample duration (0.0 to 1.0)
- Pitch Range: Y-axis from -12 semitones to +12 semitones
- Interpolation: Smooth curves for glides and pitch bends
- Default: Constant 1.0 (no pitch modulation)
- Application: Pitch envelope multiplies with MIDI note and speed parameter
Common Envelope Shapes
- Pitch Dive: Start at +12, drop to 0 (classic dive bomb)
- Pitch Rise: Start at -12, rise to 0 (upward sweep)
- Vibrato: Sine-wave-like oscillation around center pitch
- Portamento: Gradual slide from one pitch to another
- Glitch: Rapid random pitch jumps for stuttering effects
Breakpoint Editing
Both envelopes use the same touch-based editing interface:
Editing Gestures
- Tap Anywhere: Add new breakpoint at tap location
- Drag Breakpoint: Move existing breakpoint in time (X) and value (Y)
- Long-Press Breakpoint: Delete breakpoint
- Pinch-to-Zoom: Zoom into envelope for precise editing (optional)
Visual Feedback
- Waveform Background: Sample waveform displayed for timing reference
- Breakpoint Dots: Visual handles at each breakpoint
- Envelope Curve: Smooth line connecting all breakpoints
- Grid Lines: Optional time/value grid for alignment
Editing Workflow
- Load sample into pad
- Open amplitude or pitch envelope editor
- Add breakpoints by tapping on envelope view
- Drag to adjust timing and depth
- Preview by triggering pad via MIDI or manual trigger
- Refine until desired effect is achieved
Envelope Application in Real-Time
Envelopes are applied per MIDI trigger in real-time during playback.
Application Flow
MIDI Note On β Trigger Pad
β
Calculate base playback speed:
speed = pad.speed Γ midiNoteFactor
β
For each audio frame during playback:
1. Calculate normalized time: t = currentFrame / totalFrames
2. Sample amplitude envelope at time t β ampMod
3. Sample pitch envelope at time t β pitchMod
4. Apply pitch modulation: finalSpeed = speed Γ pitchMod
5. Read sample at position (with interpolation)
6. Apply amplitude modulation: sample Γ ampMod Γ pad.gain
7. Apply stereo panning
8. Mix into assigned output bus
β
MIDI Note Off β Release (or immediate stop, depending on envelope tail)
Polyphonic Behavior
- Each pad is monophonic (one note at a time per pad)
- New note-on replaces currently playing note on that pad
- 16 pads = 16-voice polyphony total across all pads
- Envelopes are independent per pad, not per voice
πΉ MIDI Integration
Speaking of Witch features comprehensive MIDI support with channel-based routing for flexible performance and sequencing.
MIDI Channel Routing
The core routing model is: MIDI Channel β Pad β Output Bus
Channel Assignment
- Each of the 16 pads can be assigned to any MIDI channel (1-16)
- Multiple pads can share the same MIDI channel (layering)
- Each pad can have a unique MIDI channel (independent sequencing)
- MIDI channel assignment is independent of output bus assignment
Routing Examples
Example 1: Simple Mapping
Pad 1 β MIDI Ch 1 β Bus 1
Pad 2 β MIDI Ch 2 β Bus 1
Pad 3 β MIDI Ch 3 β Bus 1
Result: 3 pads on separate MIDI channels, all mixed to Bus 1
Example 2: Layering
Pad 1 β MIDI Ch 1 β Bus 1 (Voice: "Hello" in English)
Pad 2 β MIDI Ch 1 β Bus 1 (Voice: "Hello" in Spanish)
Pad 3 β MIDI Ch 1 β Bus 1 (Voice: "Hello" in Japanese)
Result: All 3 pads trigger together on MIDI Ch 1, creating multilingual layer
Example 3: Multi-Bus Sequencing
Pad 1 β MIDI Ch 1 β Bus 1
Pad 2 β MIDI Ch 2 β Bus 2
Pad 3 β MIDI Ch 3 β Bus 3
Result: 3 pads on separate channels AND separate outputs
Channel-Based Pad Triggering
MIDI Note-On Processing
When a MIDI Note-On message arrives on channel X:
- DSPKernel receives MIDI message
- Kernel iterates through all 16 pads
- Each pad checks:
if (pad.midiChannel == X)
- Matching pads trigger playback
- Non-matching pads ignore the message
Multiple Pads, Same Channel
If Pad 1, Pad 5, and Pad 9 all listen to MIDI Channel 1:
- Single note on Channel 1 β triggers all 3 pads simultaneously
- Creates layered sound from multiple samples
- Each pad applies its own envelopes, gain, pan, and speed
- Each pad can output to the same or different busses
MIDI Note Pitch Mapping
MIDI note numbers control the playback speed (and therefore pitch) of samples.
Speed Calculation
Playback Speed = Pad.Speed Γ 2^((MIDINoteNumber - 60) / 12)
Where:
- Pad.Speed: Base speed parameter (0.5-2.0x)
- MIDINoteNumber: Incoming MIDI note (0-127)
- 60: Middle C (C4) - reference note for 1:1 playback
- 2^(semitones/12): Equal temperament pitch formula
Pitch Examples
- MIDI Note 60 (C4): Sample plays at base speed (1.0x if speed = 1.0)
- MIDI Note 72 (C5): Sample plays 2x faster (+12 semitones = 1 octave up)
- MIDI Note 48 (C3): Sample plays 0.5x slower (-12 semitones = 1 octave down)
- MIDI Note 64 (E4): Sample plays ~1.26x faster (+4 semitones = major third up)
Musical Applications
- Melody: Play speech sample melodically across keyboard range
- Harmonization: Trigger same sample on multiple MIDI notes for chords
- Bass Lines: Play low MIDI notes for deep, slow speech
- Lead Lines: Play high MIDI notes for fast, bright speech
Single MIDI Channel Mode
Speaking of Witch includes an optional Single MIDI Channel Mode that provides an alternative way to trigger pads from a single MIDI keyboard or sequencer.
Overview
In standard mode, each pad listens to its own MIDI channel and responds to incoming MIDI pitch by pitch-shifting the sample. In Single MIDI Channel Mode, all 16 pads share the same MIDI channel, and each pad is assigned to a specific trigger note.
Enabling Single MIDI Channel Mode
- Open Settings (gear icon)
- Navigate to Single MIDI Channel Mode section
- Toggle Enable switch to ON
- Configure the following settings:
- MIDI Channel: Choose which channel (1-16) all pads will listen to
- Start Note: Choose the starting MIDI note (default: C4/60)
- White Keys Mode: Toggle to use only white keys for triggering
How It Works
Standard Mode vs Single Channel Mode:
Standard Mode:
MIDI Ch 1 Note 60 β Triggers Pad 1 at C4 (pitch-shifted by note)
MIDI Ch 2 Note 72 β Triggers Pad 2 at C5 (pitch-shifted by note)
MIDI Ch 3 Note 48 β Triggers Pad 3 at C3 (pitch-shifted by note)
Single Channel Mode (Start Note = C4):
MIDI Ch 1 Note 60 (C4) β Triggers Pad 1 at default pitch
MIDI Ch 1 Note 61 (C#4) β Triggers Pad 2 at default pitch
MIDI Ch 1 Note 62 (D4) β Triggers Pad 3 at default pitch
... (each semitone triggers the next pad)
Chromatic Mode (Default)
When White Keys Mode is OFF, each semitone triggers the next pad sequentially:
- Start Note (e.g., C4) β Pad 1
- Start Note + 1 (C#4) β Pad 2
- Start Note + 2 (D4) β Pad 3
- Start Note + 3 (D#4) β Pad 4
- ...and so on through all 16 pads
Example with C4 as start note:
C4 β Pad 1 | C#4 β Pad 2
D4 β Pad 3 | D#4 β Pad 4
E4 β Pad 5 | F4 β Pad 6
F#4 β Pad 7 | G4 β Pad 8
G#4 β Pad 9 | A4 β Pad 10
A#4 β Pad 11 | B4 β Pad 12
C5 β Pad 13 | C#5 β Pad 14
D5 β Pad 15 | D#5 β Pad 16
White Keys Mode
When White Keys Mode is ON, only white keys (natural notes) trigger pads, making it easier to play on a keyboard:
- Start Note C4 β Pad 1
- D4 β Pad 2
- E4 β Pad 3
- F4 β Pad 4
- G4 β Pad 5
- A4 β Pad 6
- B4 β Pad 7
- C5 β Pad 8
- ...and so on (black keys are ignored)
Example with C4 as start note:
C4 β Pad 1 (black keys ignored)
D4 β Pad 2 (C# ignored)
E4 β Pad 3 (D# ignored)
F4 β Pad 4 (no black key between E-F)
G4 β Pad 5 (F# ignored)
A4 β Pad 6 (G# ignored)
B4 β Pad 7 (A# ignored)
C5 β Pad 8 (no black key between B-C)
D5 β Pad 9
E5 β Pad 10
F5 β Pad 11
G5 β Pad 12
A5 β Pad 13
B5 β Pad 14
C6 β Pad 15
D6 β Pad 16
Key Differences from Standard Mode
| Feature |
Standard Mode |
Single MIDI Channel Mode |
| MIDI Channels |
Each pad has its own channel (1-16) |
All pads share one channel |
| Note Triggering |
Any note triggers, pitch-shifts sample |
Specific notes trigger specific pads |
| Pitch Control |
MIDI note number controls pitch |
Pads trigger at default pitch (C4) |
| Keyboard Layout |
Notes pitch-shift one pad |
Notes trigger different pads |
| Ideal For |
Melodic/harmonic playing |
Sequential triggering, pad performance |
Use Cases
Use Case 1: Step Sequencer Workflow
- Load different syllables or words into pads 1-16
- Enable Single MIDI Channel Mode on Channel 1
- Set start note to C4
- Play notes C4-D#5 to trigger pads sequentially
- Perfect for creating speech sequences from a single MIDI track
Use Case 2: Live Keyboard Performance
- White Keys Mode makes it easy to trigger pads chromatically
- Play like a traditional drum pad controller
- Each white key triggers a different phrase/sound
- No need to think about MIDI channels, just play notes
Use Case 3: Single-Track Sequencing
- Sequence all 16 pads from a single MIDI track in your DAW
- Easier than managing 16 separate MIDI channels
- Great for creating complex vocal sequences
- Simplifies MIDI routing in host applications
Use Case 4: Chromatic Speech Patterns
- Load vowel sounds or syllables across all 16 pads
- Trigger them chromatically for musical speech patterns
- Create scales, arpeggios, and melodies using speech
- Simpler layout than standard pitch-shifting mode
Settings Configuration
Optimal Settings for Different Workflows:
For Step Sequencing:
- Enable: ON
- MIDI Channel: 1
- Start Note: C4 (60)
- White Keys Mode: OFF (chromatic)
For Live Keyboard:
- Enable: ON
- MIDI Channel: 1
- Start Note: C3 (48) or C4 (60)
- White Keys Mode: ON (easier to play)
For Drum Pad Controller:
- Enable: ON
- MIDI Channel: 10 (standard drum channel)
- Start Note: C1 (36)
- White Keys Mode: OFF
Important Notes
- Pads trigger at their default pitch (C4) regardless of MIDI note received
- Original MIDI channel assignments are preserved when you disable Single MIDI Channel Mode
- Speed, gain, pan, and envelope settings still apply per pad
- Output bus routing remains independent (pads can still route to different busses)
- This mode does NOT affect pitch shiftingβpads play at their configured speed
Switching Between Modes
You can toggle Single MIDI Channel Mode on/off at any time:
- Enable: All pads immediately listen to the configured single channel
- Disable: All pads revert to their individual MIDI channel assignments
- Settings are saved with presets and project state
Typical Setup
- Text Entry: Enter phrases in pads 1-16
- Voice Selection: Assign different voices/languages to each pad
- MIDI Channel Assignment:
- Option A: Each pad on unique channel (1-16) for independent sequencing
- Option B: Group pads by channel for layering (e.g., pads 1-4 on Ch 1, pads 5-8 on Ch 2)
- Output Bus Assignment: Route to busses based on mixing strategy
- Envelope Design: Shape amplitude and pitch envelopes per pad
- MIDI Controller/Sequencer: Connect MIDI keyboard or DAW sequencer
- MIDI Keyboard: Play pads chromatically like a traditional sampler
- Pad Triggers: Use MIDI pad controllers to trigger pads rhythmically
- Sequencer: Use DAW MIDI tracks to create complex sequences
- Live Switching: Change active buffer slot during performance for variation
π Multi-Output Audio Routing
Speaking of Witch features a professional 8-bus multi-output architecture for advanced mixing and processing workflows.
8 Stereo Output Busses
Bus Configuration
- Total Busses: 8 stereo busses (16 channels total)
- Fixed Architecture: Always 8 busses (predictable, host-friendly)
- Bus Numbering: Bus 1 β channels 1-2, Bus 2 β channels 3-4, ... Bus 8 β channels 15-16
- Format: All busses are stereo (44.1kHz or host sample rate)
Bus Independence
- Each bus is completely independent
- Busses are mixed in the DSP kernel before reaching the output
- No inter-bus communication or routing (pure parallel architecture)
Per-Pad Bus Assignment
Each of the 16 pads can be assigned to any of the 8 output busses.
Assignment Strategy
- Pad Parameter:
outputBus (0-7, displayed as Bus 1-8 in UI)
- Instant Switching: Change bus assignment any time (even during playback)
- Visual Feedback: UI shows which bus each pad is assigned to
- Default Mapping: Pad 1-8 β Bus 1-8, Pad 9-16 β Bus 1-8 (repeating)
Bus Mixing Strategy
Multiple pads assigned to the same bus are automatically summed in the render callback.
Mixing Flow
For each audio frame:
1. Clear all 8 busses to silence
2. For each active pad:
a. Render pad's voice β temp buffer (stereo)
b. Get pad's assigned bus index (0-7)
c. Mix temp buffer into that bus (sum samples)
3. Output all 8 busses to host (16 channels)
Mixing Examples
Scenario 1: 4 pads β Bus 1
Pad 1 (gain 0.8) β Bus 1
Pad 2 (gain 0.7) β Bus 1
Pad 3 (gain 0.9) β Bus 1
Pad 4 (gain 0.6) β Bus 1
Result: Bus 1 contains sum of all 4 pad outputs
Busses 2-8 are silent
Scenario 2: Spread across busses
Pad 1 β Bus 1
Pad 2 β Bus 2
Pad 3 β Bus 3
Pad 4 β Bus 4
Result: Each bus contains one pad's output
Perfect for individual DAW tracks
Scenario 3: Grouped by character
Pads 1-4 (voice: male) β Bus 1
Pads 5-8 (voice: female) β Bus 2
Pads 9-12 (voice: child) β Bus 3
Result: Vocal character groups on separate busses
Complex Routing Possibilities
The combination of MIDI channel routing and output bus assignment enables sophisticated workflows:
Workflow Examples
Example 1: Multi-Tracked Recording
- Assign each pad to a unique output bus (Pad 1 β Bus 1, Pad 2 β Bus 2, etc.)
- Record each bus to a separate DAW track
- Apply different effects to each track (reverb on Bus 1, delay on Bus 2, etc.)
- Mix down with full control over each pad's processing chain
Example 2: Submix Groups
- Group pads by musical role:
- Kick/Bass pads β Bus 1 (low-end group)
- Snare/Perc pads β Bus 2 (rhythmic group)
- Melodic pads β Bus 3 (melodic group)
- FX pads β Bus 4 (texture group)
- Apply bus-level effects in DAW (compression on Bus 1, EQ on Bus 2, etc.)
Example 3: Layered Multi-Bus Performance
- Pads 1-4 all on MIDI Channel 1, but different busses (Bus 1-4)
- Single MIDI note triggers all 4 pads
- Each pad outputs to its own bus for independent processing
- Create complex, multi-layered textures from single MIDI input
Example 4: External Hardware FX Routing
- Bus 1 β DAW send β Hardware reverb β Return channel
- Bus 2 β DAW send β Hardware delay β Return channel
- Bus 3 β DAW send β Hardware distortion β Return channel
- Assign pads to busses based on desired hardware FX chain
Example 5: Stem Export
- Organize pads by song section or instrument role across busses
- Record/bounce each bus separately
- Export stems for remixing, mastering, or collaboration
ποΈ AUv3 Plugin Support
Speaking of Witch is a full-featured AUv3 audio unit with professional-grade host integration.
Full AUv3 Implementation
AUv3 Features
- Audio Unit Extension: Runs inside DAW hosts (GarageBand, AUM, Cubasis, etc.)
- Multi-Output Support: Exposes all 8 stereo busses to host
- MIDI Input: Receives MIDI from host tracks and external controllers
- Parameter Automation: All pad parameters automatable via host
- State Preservation: Full state save/restore in host projects
- Preset System: Factory and user presets accessible from host
- Resizable UI: Adapts to host window size
Supported Hosts
- GarageBand (iOS): Apple's accessible DAW
- AUM (Audio Mixer): Advanced multi-track mixer and effect host
- Cubasis: Steinberg's mobile DAW
- Loopy Pro: Live looping and performance
- BeatMaker 3: Sampling and beat creation
- Auria Pro: Professional mixing and mastering
- Audiobus: Inter-app audio routing
- Any AUv3-compatible host
Multi-Output in DAW Hosts
Host Configuration
Different hosts expose multi-output AUs differently:
GarageBand
- Loads Speaking of Witch as instrument
- Outputs all busses mixed to stereo (multi-out not fully exposed)
- Use for simple performance and sketching
AUM
- Full multi-output support
- Create 8 separate mixer channels for each bus
- Route each bus to different effect chains
- Record each bus to separate files
Cubasis
- Multi-output support in mixer
- Each bus appears as separate mixer channel
- Full automation and routing capabilities
BeatMaker 3
- Advanced multi-output routing
- Each bus can be routed to internal pads or external outputs
- Integrate with BeatMaker's sequencer and FX
Routing in Host
- Load Speaking of Witch as AUv3 instrument
- Enable multi-output mode (host-dependent setting)
- Host creates 8 stereo channels for busses 1-8
- Route each bus channel to desired mixer track/FX chain
- Assign pads to busses in Speaking of Witch UI
- Play via MIDI β audio flows through assigned busses
Parameter Automation
Speaking of Witch exposes 65 AUParameters to the host:
Parameter List
- 1 Master Parameter: Global settings
- 64 Pad Parameters (4 per pad Γ 16 pads):
- Gain (0.0-1.0)
- Pan (-1.0 to +1.0)
- MIDI Channel (1-16)
- Output Bus (1-8)
Automation Workflow
- In DAW, enable automation recording for Speaking of Witch track
- Play project, adjust parameters in Speaking of Witch UI
- Host records parameter changes as automation lanes
- Edit automation curves in DAW timeline
- Playback includes all automated parameter changes
Use Cases
- Dynamic Panning: Automate pan for moving vocal effects
- Gain Rides: Automate gain for dynamic mix changes
- Bus Switching: Automate bus assignment for effect sends
- Channel Routing: Automate MIDI channel for pad selection changes
State Preservation
Speaking of Witch implements full state persistence for seamless project workflow.
State Components
- Pad Configuration: All 16 pads' text content, voice selection, envelopes, routing, and parameters
- NO Sample Buffers: Audio samples are NOT saved (text is re-synthesized on load)
- Parameter Values: All 65 AUParameter values
- Active Preset: Currently loaded preset reference
How State Restoration Works
When you reopen a saved project or load a preset:
- Immediate: All text, voice selections, envelopes, and routing settings restore instantly
- Background Synthesis: Each pad automatically re-synthesizes its saved text using the saved voice
- Loading Indicators: Watch each pad's loading spinner as synthesis happens in parallel
- Ready to Play: Pads become playable as their waveforms appear
- Total Time: Depends on text length across all pads (typically 2-15 seconds for full preset load)
State Storage Methods
- fullState: Complete configuration (text + settings, NO audio data)
- fullStateForDocument: Optimized for AUv3 host project saves
- Factory Preset: Preset reference only (loads bundled preset)
- User Preset: JSON file with all text and configuration data
Host Integration
- Project Save: Host saves all text, voices, and settings (typically 5-50 KB)
- Project Load: Host restores settings β pads re-synthesize speech in background
- Preset Recall: Loads preset configuration β triggers parallel synthesis
- Seamless Workflow: Reopen project days later, all pads re-synthesize automatically
Why Not Save Audio Samples?
- File Size: Text-only presets are 50-500Γ smaller than audio-embedded presets
- Portability: Presets work across devices regardless of sample rate or audio format
- Flexibility: Change voices or update text without breaking existing presets
- Re-synthesis: AVSpeechSynthesizer is deterministic (same text + voice = same audio)
πΎ Preset Management
Speaking of Witch features a comprehensive preset system with both factory and user presets.
Preset System Architecture
Preset Model
Each preset contains:
- Metadata: Name, author, description, tags, creation date
- 16 Pad Configurations: Text content, voice selection, envelopes, routing, and all parameters
- NO Audio Sample Data: Presets save text, not audio (samples re-synthesize on load)
- Global Settings: Master parameters and preferences
- File Format: JSON (Codable, human-readable)
- Extension:
.sowpreset (Speaking of Witch Preset)
- File Size: Typically 5-50 KB (text-only, no audio data)
- Structure: Version-tracked for backward compatibility
- Portability: Works across all iOS devices
How Preset Loading Works
When you load a preset (factory or user):
- Instant Config Load: All text, voices, envelopes, routing settings load immediately
- Parallel Synthesis: All 16 pads begin synthesizing their text in background threads simultaneously
- Loading Indicators: Each pad shows a spinner while synthesizing
- Progressive Readiness: Pads become playable as soon as their individual synthesis completes
- Full Load Time: Typically 2-15 seconds depending on total text length across all pads
Why This Design?
- β
Small Preset Files: 50Γ smaller than audio-embedded presets
- β
Fast Sharing: Email, AirDrop, iCloud sync are instant
- β
Cross-Device: No sample rate or format compatibility issues
- β
Editable: Change text/voice after loading without breaking preset
- β οΈ Requires Synthesis: Brief wait time when loading (not instant playback)
Saving & Overwriting Presets
Creating a New Preset
- Open the Presets browser β User Presets tab
- Tap the + button in the top-right corner
- Enter a name for the preset
- Tap Save β the current pad configuration is written to a new preset file
Overwriting an Existing Preset
Updating a preset used to require creating a new preset with the exact same name β a fragile workflow where a small typo would silently create a duplicate instead of replacing the original. Speaking of Witch now offers a direct Overwrite action for updating a preset in place:
- Open the Presets browser β User Presets tab
- Swipe left on the preset you want to update
- Three actions appear: Delete, Rename, Overwrite
- Tap Overwrite
- Confirm in the alert that appears (this action cannot be undone)
- The preset file is replaced with your current pad configuration
Notes:
- User Presets Only: Only presets in the User Presets tab can be overwritten. Swiping a Factory Preset shows no swipe actions at all, since factory presets are read-only
- Name Preserved: The preset keeps its original name β only its saved content and date are updated
- Date Updates: The preset's saved date updates to the moment of the overwrite, and the preset moves to the top of the list
- Selection Updates: After overwriting, the preset is automatically marked as the currently selected preset (checkmark), since your live pad configuration now matches it exactly
- Storage-Aware: Like creating a new preset, overwriting saves to iCloud when available, or automatically falls back to local device storage when it isn't (see iCloud & Local Storage)
iCloud & Local Storage
Speaking of Witch supports both iCloud Drive and local storage for presets.
Storage Locations
- Factory Presets: Bundled with app, read-only
- User Presets (Local): Device-specific storage
- User Presets (iCloud): Synced across all user's devices
iCloud Sync
- Automatic Sync: Presets saved to iCloud sync to all devices
- Conflict Resolution: Last-write-wins strategy
- Offline Support: Local cache allows offline use
- Storage Management: User controls iCloud storage quota
- Automatic Local Fallback: If iCloud isn't available (signed out, disabled, or unreachable), preset saves and overwrites are written to local device storage automatically β a save is never blocked by iCloud status
File Manager Integration
- Files App: Access presets via iOS Files app
- Import/Export: Drag-and-drop preset files
- Sharing: AirDrop, email, or cloud storage sharing
- Backup: Include presets in device backups
Factory Presets
Speaking of Witch includes curated factory presets demonstrating various techniques:
Factory Preset Categories
Vocal Percussion
- "Beatbox Kit": Mouth percussion samples across pads
- "Vocal Drums": Speech-based drum sounds
- "Human 808": Low-pitched vocal bass kicks
Melodic Phrases
- "Choir Pads": Harmonized vowel sounds
- "Robot Talk": Synthesized voice melodies
- "Vocal Synth": Pitched speech chords
Multi-Language
- "World Hello": "Hello" in 16 languages
- "Counting": Numbers 1-16 in various languages
- "Polyglot Sequence": Musical phrase in multiple languages
FX & Textures
- "Glitch Speech": Stutter and pitch-modulated speech
- "Reversed Talk": Reversed speech samples
- "Whisper Textures": Soft, ambient speech
Multi-Bus Demos
- "8-Bus Separation": One pad per bus showcase
- "Layered Output": Multiple pads per bus example
- "FX Routing Template": Pre-routed for external effects
Import/Export
Export Preset
- Select preset in preset browser
- Tap "Share" or "Export" button
- Preset file contains:
- All 16 pads' text content and voice selections
- Envelope configurations (amplitude and pitch breakpoints)
- MIDI channel and output bus assignments
- Gain, pan, speed, and all other parameters
- NO audio samples (samples re-synthesize on import)
- Choose export destination:
- iCloud Drive
- Files app location
- AirDrop to another device
- Email attachment
- Preset file saved as
.sowpreset (typically 5-50 KB)
Import Preset
- Tap "Import" button in preset browser
- Choose import source:
- iCloud Drive
- Files app location
- AirDrop from another device
- Email attachment
- Preset text/configuration loads instantly
- Each pad synthesizes speech in background (watch loading indicators)
- Pads become playable as waveforms appear (typically 2-15 seconds total)
Preset Sharing
- Community Presets: Share presets with other users (small file sizes make sharing easy)
- Template Distribution: Distribute starting-point templates for creative workflows
- Collaboration: Send presets between collaborators (works across all iOS devices)
- Archiving: Archive favorite presets for long-term storage (JSON format is future-proof)
Sharing Benefits of Text-Based Presets:
- β
Tiny Files: Email-friendly, instant AirDrop
- β
Universal: Works on any iOS device with Speaking of Witch
- β
Voice Flexibility: Recipients can use their installed voices
- β
Editable: Recipients can tweak text/voices to their preference
πΌ Creative Applications
Speaking of Witch opens up unique creative possibilities at the intersection of speech synthesis and musical performance.
Vocal Sampling & Sequencing
Speech as Instrument
Transform ordinary speech into extraordinary musical material:
Technique 1: Melodic Speech
- Type a single word or syllable (e.g., "Yeah", "Oh", "Bam")
- Render with different voices across pads
- Sequence melodically via MIDI keyboard or DAW
- Result: Pitched vocal melodies from speech
Technique 2: Rhythmic Phrases
- Type percussive syllables (e.g., "Boom", "Tss", "Ksh")
- Assign to pads 1-8 (kick, snare, hats, etc.)
- Sequence rhythmically in DAW
- Result: Speech-based drum kits
Technique 3: Harmonic Layering
- Type same phrase in all 16 pads
- Use different voices/languages per pad
- Assign all pads to same MIDI channel
- Trigger single note β 16-voice harmonic layer
- Result: Thick, multicultural vocal chords
Technique 4: Multi-Pad Phrase Chopping (Recommended Workflow)
Instead of loading long phrases into single pads, split content across multiple pads for creative sequencing:
Example: "Walking down the street, I saw you yesterday"
Traditional (Avoid):
- Pad 1: Entire sentence (12 words, ~6 seconds, slow synthesis)
Multi-Pad Approach (Better):
- Pad 1: "Walking" (MIDI Ch 1)
- Pad 2: "down" (MIDI Ch 1)
- Pad 3: "the street" (MIDI Ch 1)
- Pad 4: "I saw" (MIDI Ch 2)
- Pad 5: "you" (MIDI Ch 2)
- Pad 6: "yesterday" (MIDI Ch 3)
Benefits:
- β
Fast synthesis (6Γ faster total time)
- β
Sequence individual words via MIDI
- β
Rearrange phrase order creatively
- β
Apply different envelopes per word
- β
Route words to different busses
- β
Create stutters, loops, variations
Performance:
- Trigger pads 1-3 sequentially on Ch 1 β "Walking down the street"
- Trigger pads 4-5 on Ch 2 β "I saw you"
- Trigger pad 6 alone on Ch 3 β "yesterday"
- Or rearrange: "Yesterday, walking down the street, I saw you"
Complex Multi-Bus Setups
Advanced Routing Scenarios
Setup 1: Parallel Processing
Bus 1 (Dry): Pads 1-4 β No FX
Bus 2 (Reverb): Pads 5-8 β Long reverb in DAW
Bus 3 (Delay): Pads 9-12 β Rhythmic delay in DAW
Bus 4 (Distortion): Pads 13-16 β Heavy distortion in DAW
Performance:
- Trigger dry pads for clarity
- Trigger reverb pads for space
- Trigger delay pads for rhythm
- Trigger distortion pads for aggression
Setup 2: Frequency-Based Routing
Bus 1 (Subs): Low-pitched male voices (MIDI notes 24-48)
Bus 2 (Mids): Mid-pitched female voices (MIDI notes 48-72)
Bus 3 (Highs): High-pitched child voices (MIDI notes 72-96)
DAW Processing:
- Bus 1 β Low-pass filter + sub bass EQ
- Bus 2 β Mid-range boost + compression
- Bus 3 β High-pass filter + air EQ
Setup 3: Call-and-Response
Bus 1: "Question" phrases (pads 1-8)
Bus 2: "Answer" phrases (pads 9-16)
Automation:
- Bus 1 panned hard left
- Bus 2 panned hard right
- Alternate triggering for stereo dialogue
External FX Processing
Hardware Integration
Speaking of Witch's multi-bus architecture is perfect for hardware outboard gear:
Workflow 1: Hardware Reverb
- Bus 1 β DAW output 1-2 β Hardware reverb input
- Hardware reverb output β DAW input β Return track
- Assign ambient pads to Bus 1
- Real hardware reverb processing on speech samples
Workflow 2: Multi-FX Chain
- Bus 1 β Hardware delay
- Bus 2 β Hardware chorus
- Bus 3 β Hardware distortion
- Bus 4 β Hardware filter
- Assign pads to busses based on desired FX
- Each pad gets unique hardware character
Plugin Chains
In DAW, create unique effect chains per bus:
Example Bus Effects
- Bus 1: Clean β Light compression + EQ
- Bus 2: Ambient β Reverb + chorus + delay
- Bus 3: Aggressive β Distortion + bit crusher + filter
- Bus 4: Lo-Fi β Vinyl emulation + tape saturation
- Bus 5: Granular β Granular freeze + pitch shift
- Bus 6: Modulation β Phaser + flanger + tremolo
- Bus 7: Rhythmic β Gate + rhythmic delay
- Bus 8: Experimental β Random modulation + glitch
- Load 16 short syllables across pads
- Assign all to same MIDI channel
- Spread across MIDI note range (C1-D#2)
- Play chromatically like a traditional sampler
- Use pitch/mod wheels for real-time expression
Technique 2: Pad Controller Sequencing
- Use pad controller (e.g., Launchpad, Push)
- Map pads to MIDI notes on different channels
- Assign Speaking of Witch pads to corresponding channels
- Trigger speech samples rhythmically
- Create live beat-making performances
Technique 3: DAW Automation
- Pre-sequence MIDI patterns in DAW
- Automate bus assignments during song sections
- Automate gain/pan for dynamic movement
- Automate MIDI channel assignments for pad switching
- Create evolving, automated vocal textures
Technique 4: Hybrid External Control
- MIDI keyboard plays melodic parts
- Pad controller triggers rhythmic parts
- DAW sequencer handles background pads
- Performer controls mix via parameter automation
- Full live hybrid performance setup
Links
Speaking of Witch β Where speech becomes music.