1. Objectifs du Projet

Ce projet a pour but de fournir une station de travail audio numérique (DAW) légère et éducative écrite en Python. Il s’articule autour de trois objectifs principaux :

  1. Synthèse Sonore Temps Réel : Offrir un synthétiseur soustractif performant (formes d’ondes, filtres, ADSR) contrôlable via MIDI.
  2. Support SoundFont (SF2) : Permettre l’utilisation d’échantillons d’instruments réalistes via l’intégration de FluidSynth.
  3. Séquençage : Proposer un séquenceur multi-pistes basique pour l’enregistrement, l’édition et la lecture de compositions MIDI.

Le projet est conçu pour être modulaire, extensible et utilisable aussi bien en ligne de commande qu’avec une interface graphique moderne. Il est adapté à la gestion d’un clavier-maitre Midi connecté sur l’ordinateur.

2. Dépendances et Installation

Pré-requis Système

Le projet nécessite Python 3.8 ou supérieur.
Pour le moteur SoundFont (sf2_engine.py), la librairie système FluidSynth est requise.

  • Linux (Debian/Ubuntu) : sudo apt install fluidsynth
  • macOS : brew install fluidsynth
  • Windows : Nécessite les DLLs de FluidSynth accessibles dans le PATH.

Dépendances Python

Les bibliothèques Python nécessaires sont listées dans requirements.txt :

  • Audio & MIDI :
    • mido, python-rtmidi : Gestion des entrées/sorties et messages MIDI.
    • sounddevice : Sortie audio en temps réel.
    • numpy, scipy : Traitement du signal et génération audio mathématique.
    • pyfluidsynth : Wrapper Python pour FluidSynth (⚠️ Note : Semble manquant dans le requirements.txt actuel, à ajouter).
  • Interface Graphique :
    • customtkinter : Wrapper moderne autour de Tkinter pour l’UI.
    • pillow : Gestion des images pour l’interface.

Installation

  1. Créer un environnement virtuel :
    bash python3 -m venv .venv source .venv/bin/activate # Ou .venv\Scripts\activate sous Windows
  2. Installer les dépendances :
    bash pip install -r requirements.txt pip install pyfluidsynth # Installation manuelle si manquant

3. Mode Opératoire

Le projet peut être utilisé de deux manières principales.

3.1 Interface Graphique (Recommandé)

Le mode GUI offre l’expérience complète avec contrôle visuel du synthé, du séquenceur et des presets.

Lancement :

python main_synth.py --gui
# Ou
python synth_gui.py

Fonctionnalités Clés :

  • Connexion MIDI : Détection et connexion automatique aux claviers MIDI.
  • Moteurs Audio : Basculez entre le Synthétiseur (sons électroniques) et le Lecteur SoundFont (instruments réalistes).
  • Presets : Gestionnaire de presets avec catégories (Leads, Pads, Bass, etc.).
  • Séquenceur : Enregistrement multi-pistes, lecture en boucle, quantification.

3.2 Mode Console

Une version allégée pour tester le moteur audio sans interface graphique.

Lancement :

python main_synth.py

Le programme demandera de sélectionner un port MIDI et utilisera le son de synthé par défaut (Sawtooth).

3.3 Configuration

Les préférences sont sauvegardées automatiquement dans des fichiers JSON à la racine :

  • config.json : Dernier port MIDI utilisé, préférences d’affichage, dernier mode moteur.
  • presets.json : Bibliothèque des sons du synthétiseur.
  • projects/ : Dossier par défaut pour les sauvegardes de projets (séquences).

4. Architecture et Maintenance

Le code est organisé en modules :

Cœur Audio

  • synth_engine.py : Moteur de synthèse soustractive (génère les ondes mathématiquement).
  • sf2_engine.py : Moteur d’échantillonnage basé sur FluidSynth.
  • audio_output.py : Gestion du buffer audio et streaming vers la carte son.
  • waveforms.py, filters.py, envelope.py : Composants unitaires du synthétiseur.

Logique MIDI et Séquenceur

  • sequencer_engine.py : Moteur de séquençage (Tracks, Events, Transport). Gère la temporalité et le routing des notes.
  • midi_monitor.py : Utilitaire de debug pour visualiser les messages MIDI entrants.

Interface et Application

  • synth_gui.py : Interface utilisateur principale (CustomTkinter).
  • main_synth.py : Point d’entrée, orchestration du démarrage.
  • config_manager.py : Gestion de la persistance des données.
  • project_manager.py : Gestion des fichiers de projet (sauvegarde/chargement).

Maintenance

Pour maintenir le projet :

  1. Ajout de dépendances : Toujours mettre à jour requirements.txt (pip freeze > requirements.txt).
  2. Configuration : Les nouvelles clés de configuration doivent être ajoutées avec une valeur par défaut dans ConfigManager.DEFAULT_CONFIG pour éviter les plantages lors des mises à jour.
  3. Logs : Le projet utilise actuellement des print() pour le debug. Surveiller la console pour les erreurs Audio/MIDI.

5. Améliorations Possibles

Voici des pistes pour améliorer et fiabiliser le projet :

🔧 Technique & Stabilité

  • Dépendances : Ajouter pyfluidsynth au requirements.txt.
  • Logging : Remplacer les print() par le module logging de Python pour une meilleure traçabilité (fichiers logs).
  • Gestion d’erreurs : Améliorer la robustesse si FluidSynth n’est pas installé sur le système (désactiver gracieusement le moteur SF2 au lieu de planter).

🚀 Fonctionnalités

  • Export Audio : Ajouter la possibilité d’exporter la séquence en fichier .wav.
  • Piano Roll : Visualisation graphique des notes dans le séquenceur (actuellement liste d’événements interne).
  • Effets : Ajouter des effets globaux (Reverb, Delay) au moteur de synthèse soustractive (le moteur SF2 a sa propre reverb interne).
  • Mixer : Une vue table de mixage pour régler les volumes des pistes du séquenceur.

📚 Documentation

  • Ajouter des docstrings aux fonctions manquantes dans synth_gui.py.
  • Créer un guide utilisateur pour le séquenceur (raccourcis clavier, workflow d’enregistrement).

SOURCE