improvisation-lab / README.md
atsushieee's picture
Upload folder using huggingface_hub
c1e08a0 verified
|
raw
history blame
4.1 kB
---
title: Improvisation Lab
emoji: 🎵
python_version: 3.11
colorFrom: blue
colorTo: purple
sdk: gradio
sdk_version: 5.7.1
app_file: main.py
pinned: false
license: mit
---
# Improvisation Lab
A Python package for generating musical improvisation melodies based on music theory principles. The package specializes in creating natural-sounding melodic phrases that follow chord progressions while respecting musical rules, with real-time pitch detection for practice feedback.
Improvisation Lab Demo
https://github.com/user-attachments/assets/a4207f7e-166c-4f50-9c19-5bf5269fd04e
## Features
- Generate melodic phrases based on scales and chord progressions
- Support for multiple scale types:
- Major
- Natural minor
- Harmonic minor
- Diminished
- Support for various chord types:
- Major 7th (maj7)
- Minor 7th (min7)
- Dominant 7th (dom7)
- Half-diminished (min7b5)
- Diminished 7th (dim7)
- Intelligent note selection based on:
- Chord tones vs non-chord tones
- Scale degrees
- Previous note context
- Real-time pitch detection with FCPE (Fast Context-aware Pitch Estimation)
- Web-based and direct microphone input support
## Prerequisites
- Python 3.11 or higher
- A working microphone
- [Poetry](https://python-poetry.org/) for dependency management
## Installation
```bash
make install
```
## Quick Start
1. Create your configuration file:
```bash
cp config.yml.example config.yml
```
2. (Optional) Edit `config.yml` to customize settings like audio parameters and song selection
3. Run the script to start the melody generation and playback (default is web interface):
```bash
make run
```
- To run the console interface, use:
```bash
poetry run python main.py --app_type console
```
4. Follow the displayed melody phrases and sing along with real-time feedback
### Configuration
The application can be customized through `config.yml` with the following options:
#### Audio Settings
- `sample_rate`: Audio sampling rate (default: 44100 Hz)
- `buffer_duration`: Duration of audio processing buffer (default: 0.2 seconds)
- `note_duration`: How long to display each note during practice (default: 3 seconds)
- `pitch_detector`: Configuration for the pitch detection algorithm
- `hop_length`: Hop length for the pitch detection algorithm (default: 512)
- `threshold`: Threshold for the pitch detection algorithm (default: 0.006)
- `f0_min`: Minimum frequency for the pitch detection algorithm (default: 80 Hz)
- `f0_max`: Maximum frequency for the pitch detection algorithm (default: 880 Hz)
- `device`: Device to use for the pitch detection algorithm (default: "cpu")
#### Song Selection
- `selected_song`: Name of the song to practice
- `chord_progressions`: Dictionary of songs and their progressions
- Format: `[scale_root, scale_type, chord_root, chord_type, duration]`
- Example:
```yaml
fly_me_to_the_moon:
- ["A", "natural_minor", "A", "min7", 4]
- ["A", "natural_minor", "D", "min7", 4]
- ["C", "major", "G", "dom7", 4]
```
## How It Works
### Melody Generation
The melody generation follows these principles:
1. Notes are selected based on their relationship to the current chord and scale
2. Chord tones have more freedom in movement
3. Non-chord tones are restricted to moving to adjacent scale notes
4. Phrases are connected naturally by considering the previous note
5. All generated notes stay within the specified scale
### Real-time Feedback
Pitch Detection Demo:
https://github.com/user-attachments/assets/fd9e6e3f-85f1-42be-a6c8-b757da478854
The application provides real-time feedback by:
1. Capturing audio from your microphone
2. Detecting the pitch using FCPE (Fast Context-aware Pitch Estimation)
3. Converting the frequency to the nearest musical note
4. Displaying both the target note and your sung note in real-time
## Development
### Running Lint
```bash
make lint
```
### Running Format
```bash
make format
```
### Running Tests
```bash
make test
```
## License
MIT License
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.