Skip to content

Pipeline de transformation (ancien)

Documentation d'ancienne version

Cette page décrit une idée initiale de graphe visuel de nœuds ("Pipeline de transformation").

Neurode MIDI v2 utilise le code source NeuroScript 2.0 comme encodage canonique pour le routage/les transformations.

  • La compilation se fait hors des threads en temps réel vers un plan immuable.
  • L'activation du plan est un échange atomique ; les échecs retournent à passage direct et l'interface montre l'erreur de compilation.
  • Il n'y a pas de besoin de runtime TransformGraph/DAG.

Si vous avez atterri ici depuis d'autres documents, traitez le reste de cette page comme historique.

Aperçu

Dans le design ancien, au lieu d'un routage linéaire simple (Source → Destination), le Pipeline de transformation permettait des chaînes de traitement complexes :

[MIDI In] → [Filter] → [Transpose] → [Split] → [Output 1]
                                       └──────→ [Output 2]

Chaque nœud traite les événements MIDI, et les connexions (arêtes) définissent le flux entre les nœuds.


Concepts de base

Nœuds

Les nœuds sont des unités de traitement. Chaque nœud a :

  • Type : Détermine le comportement (filtre, transformation, script, etc.)
  • Entrées/Sorties : Points de connexion (ports)
  • Paramètres : Configuration spécifique au type de nœud
  • État activé : Peut être contourné sans suppression

Connexions (Arêtes)

Les connexions relient les nœuds ensemble :

  • Source : Port de sortie d'un nœud
  • Cible : Port d'entrée d'un autre nœud
  • Une entrée par port : Chaque entrée ne peut recevoir qu'une source
  • Plusieurs sorties : Une sortie peut se diviser vers plusieurs nœuds

Graphes

Un graphe est un pipeline complet :

  • Collection de nœuds
  • Ensemble de connexions
  • Métadonnées (nom, date de création, etc.)

Catégories de nœuds

1. Entrée/Sortie

Entrée MIDI — Point d'entrée pour les événements MIDI entrants

  • Entrées : Aucune
  • Sorties : 1 (tous les événements)
  • Utilisation : Créée automatiquement pour chaque route

Sortie MIDI — Point de sortie envoyant les événements vers la destination

  • Entrées : 1 (événements à envoyer)
  • Sorties : Aucune
  • Utilisation : Créée automatiquement pour chaque route

Entrée/Sortie virtuelle — Pour le routage interne

  • Fonctionnalité planifiée pour des configurations multi-route complexes

2. Filtres

Les filtres sélectionnent les événements qui passent :

Filtre de note — Passer/bloquer les événements de note

  • Paramètres : Plage de notes (ex. C3-C5), mode passer/bloquer
  • Utilisation : Isoler des zones spécifiques du clavier

Filtre de canal — Passer/bloquer par canal MIDI

  • Paramètres : Sélection des canaux 1-16, mode passer/bloquer
  • Utilisation : Router des canaux spécifiques différemment

Filtre de vélocité — Filtre par vélocité de note

  • Paramètres : Plage de vélocité (0-127), mode passer/bloquer
  • Utilisation : Séparer les couches de jeu fort/faible

Filtre CC — Filtre les messages de changement de contrôle

  • Paramètres : Plage de numéro CC, mode passer/bloquer
  • Utilisation : Supprimer les données CC indésirables

Filtre de type d'événement — Filtre par type d'événement

  • Paramètres : Note, CC, Changement de programme, Pitch Bend, etc.
  • Utilisation : Supprimer tous les CC, garder uniquement les notes

Filtre en temps réel — Filtre les messages de synchronisation

  • Paramètres : Aucun (vérification automatique)
  • Utilisation : Gérer les conflits de synchronisation

3. Transformations

Les transformations modifient les événements :

Transposeur — Événements de note transposés

  • Paramètres : Octaves à transposer, mode de transposition
  • Utilisation : Adapter les notes à des instruments ou styles

Modulateur — Événements de contrôle modifiés

  • Paramètres : Valeurs de modulation, type de modulation
  • Utilisation : Créer des effets dynamiques

Échantillonneur — Événements de son modifiés

  • Paramètres : Fréquence d'échantillonnage, format de sortie
  • Utilisation : Créer des sons personnalisés

4. Scripts

Les nœuds de script exécutent du code personnalisé :

Neuroscript — DSL basé sur les lignes

Lua — Scripting léger

  • Paramètres : Code Lua
  • Utilisation : Code personnalisé critique pour les performances

Construction d'un Pipeline

Étape 1 : Commencer avec un Modèle

Toute route commence avec un pipeline par défaut :

[MIDI Input] → [MIDI Output]

C'est un pass-through — les événements circulent directement de la source à la destination.

Étape 2 : Insérer des Nœuds

Ajoutez des nœuds entre l'entrée et la sortie :

  1. Ouvrez l'éditeur de Pipeline de transformation pour la route
  2. Cliquez sur Ajouter un nœud (+)
  3. Sélectionnez le type de nœud depuis la catégorie
  4. Placez le nœud sur la canvas
  5. Connectez en traçant depuis le port de sortie vers le port d'entrée

Exemple : Ajouter un nœud de transposition :

[MIDI Input] → [Transpose] → [MIDI Output]

Étape 3 : Configurer les Paramètres

Sélectionnez le nœud et ajustez les paramètres :

  • Transpose : Définissez les demi-tons à +12 (une octave plus haut)
  • Mode : Choisissez "clamp" (sécurisé pour les performances en direct)

Étape 4 : Tester avec un Moniteur

Ajoutez un nœud Moniteur pour observer le flux d'événements :

[MIDI Input] → [Monitor] → [Transpose] → [MIDI Output]

Le Moniteur affiche les événements passant à travers en temps réel.

Étape 5 : Ajouter de la Complexité

Insérez plus de nœuds, créez des branches :

[MIDI Input] → [Channel Filter: CH 1] → [Transpose +12] → [Output 1]
               [Channel Filter: CH 2] → [Transpose -12] → [Output 2]

Cela divise le canal 1 (une octave plus haut) et le canal 2 (une octave plus bas) vers des destinations différentes.


Modèle d'Exécution

Tri Topologique

Les graphes s'exécutent en ordre topologique — les nœuds sont traités selon les dépendances, pas la position visuelle :

A → B → D
A → C → D

Ordre d'exécution : A → (B, C in parallel) → D

Flux d'Exécution du Pipeline

mermaid
graph LR
    A[MIDI Input] --> B[Note Filter]
    B --> C[Transpose +12]
    C --> D[Velocity Scale]
    D --> E[Script Node]
    E --> F[MIDI Output]
    
    style A fill:#10b981,stroke:#059669,stroke-width:2px,color:#fff
    style B fill:#f59e0b,stroke:#d97706,stroke-width:2px,color:#fff
    style C fill:#8b5cf6,stroke:#7c3aed,stroke-width:2px,color:#fff
    style D fill:#8b5cf6,stroke:#7c3aed,stroke-width:2px,color:#fff
    style E fill:#ec4899,stroke:#db2777,stroke-width:2px,color:#fff
    style F fill:#3b82f6,stroke:#2563eb,stroke-width:2px,color:#fff

Types de Nœuds : Entrée (vert), Filtres (orange), Transformations (violet), Scripts (rose), Sortie (bleu). Les événements circulent de gauche à droite à travers le pipeline.

Détection de Cycle

Les graphes ne peuvent pas contenir de cycles — les boucles de rétroaction sont invalides :

A → B → C
    ↑   ↓
    └───┘

Cela créerait une boucle infinie et serait rejeté lors de la validation.

Flux d'Événement


  1. L'événement MIDI arrive au nœud MIDI Input
  2. L'événement est transmis aux nœuds connectés
  3. Chaque nœud traite et modifie éventuellement l'événement
  4. Les événements traités continuent vers les prochains nœuds
  5. Les événements finaux sortent par le nœud MIDI Output

Clé : Les nœuds peuvent :

  • Ignorer les événements (filtre bloquant)
  • Transmettre sans modification (transparent)
  • Transformer (modifier les propriétés)
  • Générer (créer des événements supplémentaires)

Branches Parallèles

Lorsqu'un nœud sort vers plusieurs connexions, les événements sont dupliqués :

[Input] → [Split] → [Transpose +12] → [Output 1]
                 → [Transpose -12] → [Output 2]

Même événement traité deux fois, chaque sortie reçoit une copie indépendante.

Visualisation de la Chaîne de Branchement

mermaid
graph TD
    A[MIDI Input] --> B[Split Node]
    B --> C[Transpose +12]
    B --> D[Transpose -12]
    C --> E[Velocity Scale 80-127]
    D --> F[Velocity Scale 40-80]
    E --> G[Output 1: Lead Synth]
    F --> H[Output 2: Bass Synth]
    
    style A fill:#10b981,stroke:#059669,stroke-width:2px,color:#fff
    style B fill:#f59e0b,stroke:#d97706,stroke-width:2px,color:#fff
    style C fill:#8b5cf6,stroke:#7c3aed,stroke-width:2px,color:#fff
    style D fill:#8b5cf6,stroke:#7c3aed,stroke-width:2px,color:#fff
    style E fill:#8b5cf6,stroke:#7c3aed,stroke-width:2px,color:#fff
    style F fill:#8b5cf6,stroke:#7c3aed,stroke-width:2px,color:#fff
    style G fill:#3b82f6,stroke:#2563eb,stroke-width:2px,color:#fff
    style H fill:#3b82f6,stroke:#2563eb,stroke-width:2px,color:#fff

Nœud de Division duplique les événements vers les deux branches. Chaque branche applique des transformations indépendantes avant d'atteindre les sorties séparées.


Exemples de Chaînes

1. Zone de Sol avec Amplification

Objectif : Conserver les notes sur le canal 1, transposer vers le haut, atténuer les notes fortes.

[MIDI Input]

[Channel Filter: CH 1]

[Transpose: +12 clamp]

[Velocity Curve: Compress]

[MIDI Output]

Équivalent Neuroscript :

neuroscript
keep note, ch 1
transpose +12 clamp
vel clamp 50..110
pass

2. Division du Clavier (Basse + Mélodie)

Objectif : Les touches basses → synthétiseur basse, les touches hautes → synthétiseur mélodie.

[MIDI Input]

[Split]
    ├─→ [Note Filter: C1-B3] → [Channel Remap: CH 1→2] → [Output: Bass]
    └─→ [Note Filter: C4-C7] → [Channel Remap: CH 1→3] → [Output: Lead]

3. Routage par vélocité

Objectif : Les notes douces → pad, les notes fortes → mélodie.

[MIDI Input]

[Split]
    ├─→ [Velocity Filter: 0-70] → [Output: Pad Synth]
    └─→ [Velocity Filter: 71-127] → [Output: Lead Synth]

4. Nettoyage MIDI (Supprimer le Temps)

Objectif : Supprimer les messages de temps, standardiser les CC.

[MIDI Input]

[Realtime Filter: Block Clock/Start/Stop]

[CC Remap: 1→74]

[MIDI Output]

5. Harmoniseur Dynamique (À venir)

Objectif : Ajouter une harmonie basée sur la vélocité.

[MIDI Input]

[Split]
    ├─→ [Pass Through] → [Merge] → [Output]
    └─→ [Conditional: vel > 90]

        [Harmonizer: +7 semitones] → [Merge]

Lorsque la vélocité dépasse 90, ajouter une harmonie d'une quinte au-dessus.


Linéarisation

Certains graphes peuvent être linéarisés — représentés comme une liste simple d'étapes (sans branche).

Graphe Linéaire

[Input] → [A] → [B] → [C] → [Output]

Ce graphe linéaire devient : [A, B, C] — traitement séquentiel simple.

Graphe Non Linéaire (Branché)

[Input] → [Split] → [A] → [Merge] → [Output]
                 → [B] ─────┘

Ce ne peut pas être linéarisé — nécessite un traitement par branche.


Limitations

Aucun Boucle de Retour

Les graphes ne peuvent pas contenir de cycles :

A → B → C
    ↑   ↓
    └───┘  ❌ Invalid

Pour les effets de délai, utiliser le nœud Echo (à venir).

Aucun Contrôle Temporel

Les nœuds traitent les événements immédiatement — pas de planification ou de retards dans le graphe.

Pour les effets temporels :

  • Utiliser plusieurs routes avec un contrôle temporel au niveau de routage (à venir)
  • Utiliser des scripts avec un état interne (limité)

Aucune Branchement Conditionnel (Encore)

Le nœud Split actuel duplique vers toutes les sorties. Le nœud Conditionnel (à venir) permettra :

[Input] → [Conditional: vel > 90] → [Output A]
                                  → [Output B (else)]

Aucun État Externe

Les nœuds ne peuvent pas partager d'état entre traitements :

  • Chaque événement est traité indépendamment
  • Aucun "souviens de la note précédente" ou logique croisée (sauf dans les scripts)

Avancé : Types de Nœuds Personnalisés

Actuellement, les nœuds personnalisés ne sont pas supportés via l'API Swift.

Pour la logique personnalisée, utiliser des nœuds Script (Neuroscript, Lua).

À venir : Types de nœuds Swift personnalisés avec des performances natives.


Comparaison : Chaîne vs. Routage Simple

CaractéristiqueRoutage SimpleChaîne de Transformation
Facilité d'UtilisationFacileMoyen
FlexibilitéLimitéeÉlevée
BranchementNonOui
VisualisationListeGraphe de nœuds
PerformanceLe plus rapideTrès rapide
Meilleur PourRoutes basiquesTraitement complexe

Quand utiliser le Routage Simple :

  • Passage MIDI direct
  • Une seule transformation (transposition, remappage de canal)

Quand utiliser la Chaîne de Transformation :

  • Plusieurs transformations en séquence
  • Branchement/splitting
  • Logique conditionnelle
  • Débogage de traitement complexe

Étapes Suivantes


Ce concept de chaîne de transformation était une exploration précoce pour Neurode MIDI (iOS/macOS).

Créé avec ❤️ pour les musiciens