API Reference
The Amadeus server provides RESTful endpoints for audio analysis.
Base URL
Development: http://localhost:8000
Production: TBD (deployment planned for 2026)
Endpoints
POST /analyze
Analyses an audio file using Basic Pitch model and returns chord progressions and note events.
Request
POST /analyze HTTP/1.1
Content-Type: multipart/form-data
audio_file: <binary audio data>
Parameters
audio_file(required): Audio file in WAV, MP3, M4A, AAC, FLAC, or OGG formatMaximum file size: 50MB
Recording duration: Up to 30 seconds for in-app recording
Response
{
"notes": [
{
"onset": 0.0,
"offset": 0.5,
"pitch": 60,
"confidence": 0.95
}
],
"chords": [
{
"onset": 0.0,
"offset": 2.0,
"chord": "C",
"confidence": 0.85,
"pitch_classes": [0, 4, 7]
}
],
"key": {
"key": "C",
"mode": "major",
"confidence": 0.75
}
}
Status Codes
200 OK: Successful analysis400 Bad Request: Invalid request (no file, bad format)413 Payload Too Large: File exceeds size limit415 Unsupported Media Type: Unsupported audio format500 Internal Server Error: Processing error
Example Usage
Python example:
import requests
with open('song.mp3', 'rb') as f:
files = {'file': ('song.mp3', f, 'audio/mpeg')}
response = requests.post('http://localhost:8000/analyze', files=files)
result = response.json()
print(f"Detected {len(result['chords'])} chords")
Swift example:
let url = URL(string: "http://localhost:8000/analyze")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
let boundary = UUID().uuidString
request.setValue("multipart/form-data; boundary=\(boundary)",
forHTTPHeaderField: "Content-Type")
var data = Data()
data.append("--\(boundary)\r\n")
data.append("Content-Disposition: form-data; name=\"file\"; filename=\"audio.wav\"\r\n")
data.append("Content-Type: audio/wav\r\n\r\n")
data.append(audioData)
data.append("\r\n--\(boundary)--\r\n")
request.httpBody = data
let task = URLSession.shared.dataTask(with: request) { data, response, error in
// Handle response
}
task.resume()
GET /health
Health check endpoint for monitoring server status.
Request
GET /health HTTP/1.1
Response
{
"status": "healthy",
"model_available": true,
"model_path": "/path/to/model",
"version": "1.0.0"
}
Status Codes
200 OK: Server is healthy503 Service Unavailable: Server is unhealthy
GET /
Root endpoint providing basic server information.
Request
GET / HTTP/1.1
Response
{
"message": "Basic Pitch Server is running",
"version": "1.0.0"
}
Data Models
NoteEvent
Represents a single detected note.
class NoteEvent:
onset: float # Start time in seconds
offset: float # End time in seconds
pitch: int # MIDI pitch (0-127)
confidence: float # Detection confidence (0-1)
ChordEvent
Represents a detected chord.
class ChordEvent:
onset: float # Start time in seconds
offset: float # End time in seconds
chord: str # Chord symbol (e.g., "Cmaj7")
confidence: float # Detection confidence (0-1)
pitch_classes: List[int] # Pitch classes (0-11)
KeyInfo
Key estimation information.
class KeyInfo:
key: str # Root note (C, D, E, etc.)
mode: str # "major" or "minor"
confidence: float # Estimation confidence (0-1)
Error Responses
All error responses follow this format:
{
"detail": "Error description"
}
Common error messages:
"No filename provided": File upload missing filename"File too large. Maximum size: 50MB": File exceeds size limit"Unsupported format. Supported: .wav, .mp3, .m4a, .aac, .flac, .ogg": Invalid file format"Failed to process audio: [details]": Processing error
Rate Limiting
Currently no rate limiting is implemented. Future versions will include:
100 requests per minute per IP
1000 requests per hour per IP
Custom limits for authenticated users
Authentication
Currently no authentication is required. Future versions will support:
API key authentication
JWT tokens for user sessions
OAuth2 integration
CORS Policy
The server allows CORS from all origins in development. Production configuration should restrict to:
Amadeus iOS app
Amadeus web app (if applicable)
Trusted partner applications
WebSocket Support (Future)
Future versions will support WebSocket connections for:
Real-time analysis updates
Live mode streaming
Progress notifications
Collaborative sessions