gcs.cc v2.4 - nuage de grains sur boucles enregistrées, pour Organelle S2 (Pure Data vanilla, aucun external)
(English version below / version anglaise plus bas)

Ce n'est pas un synthé : c'est un EFFET qui traite l'entrée audio de l'Organelle (saxophone au micro ou dans le jack,
une autre machine en ligne). On enregistre des boucles (6 couches de 10 s) avec AUX ou la pédale, puis un nuage de
grains les relit, joué au clavier.

Inspiré de l'Instruō Arbhar (grains, couches, attaques). Ce n'est la copie d'aucun appareil. Ce qui est sourcé est
marqué « (source) » ; le reste (temps, longueurs, courbes) est un CHOIX. Aucun nom de marque à l'écran.

DEUX PATCHS DISTINCTS (depuis cette version)
  gcs.cc v1.0 faisait tout (20 pages, 80 réglages). Il est séparé en deux :
    tcs.cc v1.4 ... la BANDE : boucle à la Frippertronics, tête à vitesse variable, usure (9 pages)
    gcs.cc v2.4 ... les GRAINS : ce patch (11 pages)
  Les deux ont le même looper (AUX / pédale) et le même écran. Détails de la séparation : plus bas, HISTORIQUE.

------------------------------------------------------------------------------------------------
INSTALLATION
------------------------------------------------------------------------------------------------
  Copier gcs.cc (et tcs.cc si voulu) dans Patches (carte ou /usbdrive/Patches), ainsi que gcs-check :
  une sonde à lancer UNE fois (voir gcs-check/LISEZMOI.txt) : elle affiche si les objets utilisés marchent sur
  l'Organelle, la fréquence d'échantillonnage et le niveau des entrées G / D en direct.

ENTRÉE (jack ou micro interne)
  L'Organelle a une entrée jack TRS stéréo de niveau ligne et un micro intégré derrière la grille sous les potards 1
  et 2. On choisit avec le SÉLECTEUR À L'ARRIÈRE (matériel) : jack ou micro (source : manuel Organelle M / S / S2).
  Le patch reçoit l'entrée sur [r~ inL] / [r~ inR] (source : mother.pd, dépôt Organelle_OS) dans les deux cas.
  Câble mono (TS) : seul le canal gauche reçoit (source : manuel). Page INPUT > IN.SRC : L | R | L+R [L+R], ce qui marche
  avec un câble mono comme avec le micro. Mesuré : signal à gauche seulement -> L : -23,2 dB, R : silence,
  L+R : -23,2 dB (entrée -23,0 dB, sortie sèche). L+R ADDITIONNE les deux canaux : un même signal présent des deux
  côtés sort plus fort (mesuré : -17,6 dB au lieu de -23,6) ; dans ce cas, baisser IN.GAIN de 6 dB ou choisir L.
  ATTENTION au larsen avec le micro interne et une enceinte proche (le manuel conseille de démarrer sur LINE).
  Signalé sur le forum Critter & Guitari (non confirmé par le fabricant) : un contrôleur USB branché au démarrage
  peut empêcher le sélecteur de fonctionner ; le brancher après le démarrage.

ÉCRAN DE DÉMARRAGE : « // gcs.cc v2.4 » et « // loading... », deux bobines qui tournent, la bande défile et s'effrite
  en grains qui tombent (environ 3 s), puis la page 1. Les potards tournés pendant ce temps agissent.
  Aperçu : sources/bench/resultats/gcs/ecran_demarrage.png.

------------------------------------------------------------------------------------------------
LE LOOPER : AUX, PÉDALE (footswitch) ou CC64 (les trois font la même chose)
------------------------------------------------------------------------------------------------
  couche vide  --appui-->  REC   --appui-->  PLAY  --appui-->  DUB  --appui-->  PLAY  --appui-->  DUB ...
  AUX tenu 1 s : la couche active s'efface (fondu de 300 ms) et redevient vide.
  - REC : premier enregistrement. La longueur de la boucle = le temps entre les deux appuis (de 0,1 à 10 s). Au-delà
    de 10 s, l'enregistrement s'arrête tout seul et la boucle fait 10 s (source : Arbhar, couches de 10 s).
    Au point de bouclage, un fondu de 30 ms (CHOIX) évite le clic.
  - PLAY : la boucle tourne sans perte, à l'identique ; les grains la lisent.
  - DUB : on rajoute par-dessus ce qui est joué ; l'ancien contenu est gardé à DUB (page SETUP, 100 % d'usine : rien ne
    s'efface, comme le « Dub » de l'Arbhar, source ; plus bas, l'ancien s'estompe à chaque tour).
  - Chaque appui agit tout de suite. Si on le garde enfoncé 1 s, la couche s'efface (même si l'appui venait de passer
    en DUB). Relâcher avant 1 s : rien n'est effacé.
  - ARM (page INPUT, O.MODE = ARM ou BOTH) : sur une couche vide, l'appui ARME seulement ; c'est la prochaine attaque
    jouée qui lance REC (l'attaque est enregistrée : l'entrée arrive 10 ms après la détection, CHOIX). Un nouvel appui
    pendant ARM lance REC tout de suite. Mesuré : attaque à 2,0 s, appui à 4,0 s -> boucle de 1998 ms.
  - Changer de couche (touches do à fa) pendant REC ou DUB termine proprement l'enregistrement de la couche qu'on quitte
    (mesuré : REC lancé à 1,0 s, couche 2 à 2,5 s -> couche 1 = boucle de 1500 ms, en PLAY).
  Écran (bandeau) : nom de la page, 6 petits carrés = les 6 couches (plein = la couche joue ; creux = enregistrée
  mais muette ou pas jouée ; trait = vide ; souligné = la couche active), puis l'état (--- vide, REC, PLY, DUB, ARM ;
  écrit en inversé = REVERSE), « n/11 ». Aperçu : sources/bench/resultats/gcs/ecran_couches.png. LED : une couleur par état (valeurs du mother : REC 1, PLAY 3, DUB 2, ARM 5, éteinte si vide ; les couleurs
  exactes sont à vérifier sur l'appareil).
  Le contenu des boucles n'est pas sauvegardé (il disparaît à l'extinction).

AUTRES COMMANDES
  Tourner l'ENCODEUR = page (on boucle de la 11 à la 1) ; appuyer = retour au menu de l'Organelle.
  Prise en main douce (comme vcs.cc / wcs.cc) : après un changement de page, un potard ne reprend la main qu'en passant
  par la valeur enregistrée (petit repère).

CLAVIER (24 touches)
  do  do# ré  ré# mi  fa   (6 touches graves) ... SOLO : couche active 1 à 6 (fondu de 20 ms) ;
                                                       MULTI : court = muet / audible, long = couche à enregistrer
  fa# ................................................ REVERSE (bascule : inverse le sens des grains, voir DIR)
  sol à si (17 touches) .............................. hauteur des grains, chromatique : le do du milieu (note 72)
                                                       = hauteur d'origine, soit -5 à +11 demi-tons, + PITCH + OCTAVE.
  KEYS (page PLAY) : MONO = la dernière touche tenue ; POLY = chaque grain prend au hasard une des touches tenues
  (accord en nuage). Sans touche tenue : PITCH seul. K.GATE ON : le nuage ne sonne que tant qu'une touche est tenue.
  Pitch bend : +/-2 demi-tons (fixe). Un clavier MIDI externe joue de la même façon.

COUCHES : SOLO / MULTI (v2.3) - une tête de lecture par couche
  Chaque couche a sa propre tête de lecture ; toutes avancent à la même vitesse (SPEED, REVERSE), comme un
  magnétophone multipiste. Le potard L.MODE (page HEAD) choisit ce qu'on entend :
    SOLO [usine] : seule la couche active joue (comme avant). Touche de couche (do à fa) = choisir la couche active.
    MULTI : toutes les couches pleines et non muettes jouent ensemble. Touche de couche :
      appui COURT = muet / audible (fondu de 30 ms) ;
      appui LONG (0,5 s) = choisir la couche que AUX enregistre / DUB (elle devient audible).
  Une tête qui se remet à sonner (couche démutée, retour en SOLO) se replace à la position de lecture habituelle (un
  tour derrière l'enregistrement).
  Grains en MULTI : avec LAYER = W, chaque grain lit une des couches audibles, au hasard ; une couche muette n'envoie
  plus de grains (mesuré : 220 / 330 Hz : SOLO couche 2 -95 / -11 dB ; MULTI -18 / -17 dB ; couche 1 muette -97 / -14 dB).
  Mesuré (couche 1 = 220 Hz, couche 2 = 330 Hz, niveau dans chaque bande) : SOLO couche 2 -> 220 Hz -121 dB / 330 Hz
  -14 dB ; MULTI -> -15 / -14 dB ; couche 1 muette (appui court) -> -105 / -14 dB ; de nouveau audible -> -15 / -14 dB ;
  couche 2 muette -> -15 / -66 dB ; appui long sur la couche 3 vide puis AUX -> la couche 3 s'enregistre (2000 ms) et les
  3 couches jouent ensemble (-15 / -14 / -14 dB). Bascules SOLO / MULTI et muet / audible : rafale d'aigus -66,6 dB
  (aucun clic). Une tête ne produit du son que si elle sonne (sa position est suivie dès que la couche est enregistrée : les grains la suivent).

TÊTE DE LECTURE ET GRAINS (page HEAD, v2.4) : les GRAINS viennent APRÈS la tête
  Chaque couche a une tête qui avance dans la boucle, en avant ou à l'envers, à vitesse variable (comme tcs.cc). Les
  grains sont pris AUTOUR de cette tête : position d'un grain = position de la tête + SCAN (+ SPRAY). Donc :
  SPEED [STOP] .. fait avancer le SCAN tout seul. x1 = les grains suivent la boucle telle qu'elle a été jouée ; x0,5 =
                  deux fois plus lentement (étirement) ; -x1 = à l'envers ; STOP = les grains restent figés sur le
                  dernier passage (SCAN seul choisit l'endroit, comme avant). -2 à +2, crans à 0 et +/-1 (Vari-Speed du
                  Morphagene, source). La hauteur des grains ne bouge PAS avec SPEED (touches, PITCH, OCTAVE seulement).
  H.INERT [200 ms] la tête accélère et freine doucement (5 ms à 5 s) : les grains glissent avec elle.
  H.LEVEL [0 %] .. mélange GRAINS <-> TÊTE à puissance constante : 0 = grains seuls ; 50 % = les deux ; 100 % = tête
                  seule (la bande lue à la vitesse SPEED, la hauteur suit la vitesse comme sur une bande).
  L.MODE ......... SOLO / MULTI (voir COUCHES ; ce réglage ne touche pas la tête).
  REVERSE (fa#) inverse la tête et les grains. Pitch bend : +/-2 demi-tons sur la tête. Position de départ fixe (un tour
  derrière l'enregistrement ; H.POS de tcs.cc fixé à 100 %).
  SCAN QUI BOUGE TOUT SEUL :
    - qui AVANCE : SPEED (x1, x0,5, -x1 ...), voir plus haut ;
    - au HASARD ou par LFO : page MOD, M.DEST = SCAN, M.SHAPE = S&H (sauts au hasard) ou FLUCT (dérive lente au hasard)
      ou SINE / TRI (va-et-vient) ; M.RATE = la cadence, M.AMT = l'ampleur. Les deux s'additionnent (la tête avance et
      le modulateur déplace les grains autour).
  Mesuré (couche de 2 s : 1 s de 220 Hz puis 1 s de 440 Hz ; SCAN 25 % ; hauteur lue par les grains toutes les 0,25 s
  de 4 à 8 s) : STOP -> 220 Hz tout du long (fixe) ; x1 -> 220 et 440 Hz alternent chaque seconde ; x0,5 -> toutes
  les 2 s ; -x1 -> alternent aussi (sens inverse) ; STOP + MOD S&H sur SCAN (+/-100 %, ~1,3 Hz) -> sauts au hasard
  entre 220 et 440 Hz. H.LEVEL 0 / 50 / 100 % : niveau total -10,6 / -10,5 / -14,4 dB (pas de trou au milieu).
  Tête seule (H.LEVEL 100 %, 440 Hz enregistré, grains sur une couche vide) : x1 440,0 Hz ; x0,5 220,0 ; x1,5 660,0 ;
  -x1 439,6 ; STOP silence. H.LEVEL 0 (usine) : sortie de la tête nulle.

------------------------------------------------------------------------------------------------
PAGES (11 pages de 4 potards ; détails : LISEZMOI-PAGES.txt / README-PAGES.txt)
------------------------------------------------------------------------------------------------
  1 GRAINS   SCAN | SIZE | INTENS | DRY/WET        l'essentiel
  2 VARY     SPRAY | DIR | DEV | WINDOW            variations grain par grain
  3 PLAY     PITCH | OCTAVE | KEYS | K.GATE        hauteur et clavier
  4 SETUP    LAYER | DUB | MAXGR | BURST           couche lue, overdub, nombre de grains, salve
  5 HEAD     H.LEVEL | SPEED | H.INERT | L.MODE    la tête que suivent les grains (SCAN qui avance), SOLO / MULTI
  6 INPUT    IN.GAIN | IN.SRC | O.MODE | SENS      entrée et attaques (STRIKE / ARM)
  7 MOD      M.DEST | M.AMT | M.RATE | M.SHAPE    un modulateur vers n'importe quel réglage
  8 DELAY    DELAY | D.TIME | D.FDBK | CHAR        delay d'ambiance (DRY / WET, après la boucle)
  9 REVERB   VERB | R.TIME | SMEAR | SHIM          reverb d'ambiance (DRY / WET, après la boucle)
  10 OUT     FX.IN | PRINT | G.SPRD | VOLUME       ce que traitent les effets, enregistrer les effets
  11 VIEW     la boucle et les grains ; potards = SCAN | SPRAY | SIZE | PITCH (les mêmes réglages que leurs pages)
  Réglages fixés (retirés des pages, CHOIX) : REC.LVL 100 %, IN.HPF 60 Hz (12 dB/oct),
  IN.GATE OFF, BEND 2 demi-tons, GLIDE OFF, limiteur de boucle -3 dB.

  DRY/WET (page 1) : à puissance constante. Tout à droite (WET) = on n'entend plus du tout le son direct (ni sa reverb,
  ni son delay), seulement les grains (passés dans les effets selon FX.IN, voir EFFETS D'AMBIANCE). Tout à gauche (DRY) = seulement l'entrée. Mesuré (couche vide, sinus -23 dB à gauche) : DRY -23,6 dB,
  D50/W50 -26,6 dB (-3 dB : puissance constante), WET : sortie nulle (-240 dB).

CHEMIN DU SON
  entrée -> IN.SRC -> IN.GAIN -> passe-haut 60 Hz -> 10 ms -> (REC ou DUB seulement) -> couche active
  couches (6 x 10 s) -> têtes de lecture -> nuage de grains autour de la tête (LAYER) ; H.LEVEL : grains <-> tête -> DRY / WET (sec = entrée directe, au centre) -> DELAY puis REVERB
  en DRY / WET (FX.IN : ce qui y passe) -> VOLUME -> limiteur -> sortie. PRINT : entrée passée dans les effets -> couche (REC / DUB).

------------------------------------------------------------------------------------------------
LES GRAINS (façon Arbhar ; source : manuel Arbhar firmware 2.0)
------------------------------------------------------------------------------------------------
  SCAN : position dans la boucle (source, p. 22), comptée depuis la tête de lecture (v2.4). Avec SPEED STOP (usine) :
    SCAN 0 = le début de l'enregistrement, 100 % = la fin (CHOIX). Avec SPEED, le SCAN avance tout seul (voir TÊTE).
    Mesuré : boucle 220 Hz puis 440 Hz -> SCAN 25 % : 221 Hz, 75 % : 450 Hz.
  SIZE : 4 ms à 3 s, 750 ms au milieu (source, p. 21).
  INTENS : au centre, le plus de grains ; à gauche grains synchrones, de même amplitude ; à droite asynchrones,
    d'amplitude au hasard (source, p. 18-19). Grains simultanés = 0,5 + (MAXGR - 0,5) x (1 - |écart au centre|)^1,5
    (CHOIX).
  SPRAY : décalage au hasard du départ de chaque grain ; à fond, n'importe où dans la couche (source, p. 23).
  DIR : probabilité de lecture à l'envers (source, p. 21). Mesuré (14 grains) : 0 -> 14 à l'endroit ; 50 % -> 11 ;
    100 % -> 0. La touche REVERSE l'inverse.
  DEV : à gauche, écart au hasard non quantifié (+/-12 demi-tons à fond, CHOIX : le manuel ne le chiffre pas) ; à
    droite, 12 positions d'intervalles, chaque grain prend -a, 0 ou +b demi-tons : -2/+1, -1/+2, -4/+3, -3/+4, -7/+5,
    -6/+6, -5/+7, -9/+8, -8/+9, -11/+10, -10/+11, -12/+12 (source : table par défaut, p. 24-25). Mesuré (1re position,
    440 Hz) : -2 / 0 / +1 présents (-42 / -37 / -34 dB), -3 / -1 / +2 absents (-54 / -51 / -64 dB).
  WINDOW : carré <- gaussienne -> scie descendante, 9 formes (source, p. 20 ; largeurs : CHOIX).
  PITCH : -24 à +24 demi-tons (CHOIX : étendue non donnée par le manuel). Mesuré sur 440 Hz : +7 -> 665,1 Hz,
    -12 -> 212,8 Hz.
  LAYER : W (la couche active), 1 à 6, ALL (SCAN parcourt les 6 couches, position « omega », source p. 16).
    Mesuré : LAYER 1 / 2 -> 220,0 / 329,0 Hz (couches à 220 / 330 Hz) ; ALL -> 220,0 puis 329,0 Hz.
    Une couche vide ne fait aucun son.
  MAXGR : 1 à 16 grains en même temps (l'Arbhar en a 44 : source ; ici borné pour le CPU).
    Mesuré (SIZE 1 s) : MAXGR 4 -> 3,4 grains/s, 16 -> 15,2 grains/s.
  G.SPRD (page OUT) : chaque grain part à gauche ou à droite à pile ou face (source : « coin toss », p. 11).
  Niveau des grains calé sur l'entrée (bruit rose, WET) : +0,3 à +1,6 dB sur toute la course d'INTENS et de SIZE
    (-3,1 dB au pire : grains de ~1 s, asynchrones, rares).
  Mesuré en PLAY (boucle de 2 s) : niveau des grains -19,3 / -19,0 / -19,3 / -19,8 dB toutes les 2 s : stable.

ATTAQUES (détecteur maison, Pd vanilla, sans bonk~)
  Niveau rapide comparé à un niveau lent (~145 ms) : attaque si l'écart dépasse SENS (18 à 3 dB), au-dessus de
  -60 dBFS, et si le détecteur est réarmé (CHOIX). Mesuré sur un « sax » synthétique (12 notes : détachées, douces,
  liées) : 11 sur 12 (SENS 20 % et 50 %), 10 sur 12 (80 %), aucune fausse, retard moyen 2 à 4 ms.
  O.MODE : OFF | STRIKE (chaque attaque lance BURST grains sur ce qu'on vient de jouer, +15 % de niveau comme le Strike
  de l'Arbhar, source p. 20 ; mesuré : 4 grains par attaque, 11 sur 11) | ARM (l'attaque lance REC, voir LOOPER ;
  modes d'attaque de l'Arbhar, source p. 27-29) | BOTH.

MODULATION (page MOD)
  Un seul modulateur (au lieu de LFO + RANDOM + molette dans gcs.cc v1.0) : M.SHAPE SINE | TRI | SQUARE | S&H | FLUCT
  (fluctuation lente) | STEPS ; M.RATE 0,02 à 20 Hz ; M.AMT -100 à +100 % ; M.DEST n'importe quel réglage (sauf VIEW).
  Il ne change ni la valeur du potard ni la sauvegarde. Calcul toutes les 20 ms (CHOIX).
  Mesuré : carré 0,5 Hz sur SCAN (+/-25 %), boucle 220 / 440 Hz -> 450 / 223 / 450 / 222 / 450 / 225 / 450 / 225 Hz,
  une valeur par seconde. Pour un SCAN qui bouge au hasard : M.DEST SCAN + S&H ou FLUCT (voir TÊTE, mesuré).

PAGE VIEW
  Forme de la couche lue (enveloppe, 128 colonnes), position d'écriture (trait plein), grains récents (petits traits en
  haut), « SC.. SP.. ..ms ..st » en bas. 8 images/s, rien ne calcule hors de la page.
  Aperçu : sources/bench/resultats/gcs/ecran_view.png.

------------------------------------------------------------------------------------------------
EFFETS D'AMBIANCE : DELAY et REVERB (pages DELAY, REVERB, OUT) - en vrai DRY / WET depuis gcs.cc v2.2
------------------------------------------------------------------------------------------------
  Inspirés des pédales Chase Bliss (sources plus bas) : canal Wet de la MOOD MkII, Dark World, Habit. Ce sont des
  inspirations : les algorithmes ici sont des CHOIX, rien n'est copié.
  CHAÎNE (comme des pédales branchées après le looper) :
    1. DRY/WET (page 1) : son direct contre boucle. À WET, plus aucun son direct, ni sa reverb, ni son delay
       (mesuré : couche vide, WET, quel que soit FX.IN : sortie nulle).
    2. FX.IN choisit ce qui entre dans les effets : INPUT (le son direct), BOTH (son direct + boucle), LOOP (la boucle).
       Ce qui n'y entre pas les contourne et s'ajoute à la sortie, intact.
    3. DELAY puis REVERB, en série, chacun avec un vrai DRY / WET à puissance constante (D100 = effet éteint, sans calcul ;
       D50/W50 ; W100 = seulement l'effet).
  RÈGLE : les effets ne modifient JAMAIS la boucle (ils sont après elle). Mesuré : boucle enregistrée avec les effets à
  fond (FX.IN BOTH, PRINT OFF), puis effets remis à DRY -> écart 0,0 (au bit près) avec la même boucle sans effets.
  La boucle ne reçoit des effets que pendant l'enregistrement (REC / DUB), et seulement si PRINT = ON.
  Niveaux mesurés (bruit rose continu, son direct seul dans les effets) : REVERB W100 +1,3 dB, D50/W50 +2,5 dB ;
  DELAY W100 (retour 45 %) +3,9 dB, D50/W50 +3,7 dB, par rapport à l'entrée.

  REVERB (page 9)
    VERB ..... DRY / WET de la reverb [D75/W25].
    R.TIME ... taille ET déclin ensemble, comme le TIME de la MOOD (source) : 0,4 s à 30 s ; au-delà de 95 % : FREEZE,
               la queue est figée et tient indéfiniment, rien de nouveau n'y entre (comme le Decay au maximum de la
               Dark World, source). Mesuré (bruit rose, -60 dB) : affiché 1,0 / 6,1 / 23,9 s -> 0,9 / 5,8 / 20,4 s.
               FREEZE : -23,4 / -22,9 / -22,0 / -22,1 dB à 2 / 6 / 10 / 13 s (il tient) ; un bruit fort joué pendant
               le gel n'y entre pas (-218 dB) ; relâché (60 %) : -21 -> -33 -> -62 dB en 4 s. [6,1 s]
    SMEAR .... de multi-taps (échos séparés) à nappe, comme le MODIFY de la MOOD en Reverb (source). Mesuré, facteur de
               crête de la queue : 77 à 0 %, 24 à 100 %. [70 %]
    SHIM ..... la queue, montée d'une octave, est réinjectée : elle monte d'octave en octave (Shim de la Dark World,
               source). Mesuré (sinus 220 Hz) : 440 Hz à -17 dB sous 220 Hz sans SHIM, à +0,3 dB avec SHIM 100 % ;
               880 Hz : -21 -> -1 dB. [0 %]
    Moteur (CHOIX) : 3 passe-tout par côté, réseau de 4 lignes rebouclées (67 à 108 ms x taille, matrice de Hadamard),
    2 lignes modulées, amorti 4,8 kHz ; au gel : longueurs arrondies à l'échantillon, sans modulation ni amorti, gain 1.
    Chaque ligne a un plafond doux transparent : gel + SHIM à fond ne peuvent pas s'emballer.

  DELAY (page 8)
    DELAY .... DRY / WET du delay [DRY = éteint, sans calcul].
    D.TIME ... 40 ms à 2 s [283 ms]. Le temps GLISSE comme une bande (300 ms), puis se pose exactement sur un
               échantillon. Mesuré : répétitions toutes les 280-285 ms pour 283 ms (fenêtres de 5 ms).
    D.FDBK ... retour ; à 100 % les répétitions tiennent et s'empilent sans s'emballer (comme le MODIFY de la MOOD en
               Delay, source). Mesuré : 50 % -> -6,0 / -5,9 / -6,4 dB par répétition ; 100 % (CHAR CLEAN) ->
               -11,9 / -12,3 / -12,8 / -13,4 dB à 2 / 5 / 10 / 19 s. [45 %]
    CHAR ..... gauche = TAPE : chaque répétition plus sombre (jusqu'à 1,2 kHz), qui pleure et sature (mesuré à 100 %,
               retour 100 % : -25 -> -39 dB et centroïde 333 -> 142 Hz en 17 s) ; milieu = CLEAN ; droite = chaque
               répétition monte d'une QUINTE (UP 5th) puis d'une OCTAVE (UP OCT), comme la Habit (source). Mesuré
               (sinus 220 Hz, 600 ms) : UP 5th 220 / 332 / 494 Hz (attendu 220 / 329,6 / 493,9) ; UP OCT
               220 / 444 / 893 Hz (attendu 220 / 440 / 880). [TAPE 22 %]
    Stéréo : tête gauche à D.TIME, tête droite à 1,5 x D.TIME (CHOIX).

  OUT (page 10) : FX.IN | PRINT | G.SPRD | VOLUME
    FX.IN .... INPUT / BOTH / LOOP, voir plus haut [BOTH].
    PRINT .... OFF : on enregistre l'entrée sèche. ON : pendant REC et DUB SEULEMENT, on enregistre l'entrée passée dans
               DELAY puis REVERB (mêmes réglages, dans une deuxième chaîne qui ne traite que l'entrée) à la place de
               l'entrée sèche : la couche reçoit ce que la chaîne donne (avec son DRY / WET). La boucle déjà là n'est
               jamais repassée dans les effets. [OFF]
               Mesuré : partie silencieuse de la boucle, effets coupés ensuite : PRINT OFF -240 dB, PRINT ON -32,6 dB
               (la queue est dans la boucle). DUB 10 s sans jouer avec PRINT ON et FX.IN BOTH : écart 0,0 avec le même
               DUB en PRINT OFF.
  Sécurité : retour 100 % + UP OCT + FREEZE + SHIM 100 % + IN.GAIN +24 dB, 40 s : aucun NaN, crête < 1, niveau stable.
  Clics (sinus 220 Hz ; référence avec effets au repos -60,7 dB) : glissement de D.TIME -54,4 ; gel / dégel -58,7 ;
  FX.IN changé -60,2 ; DELAY allumé -63,1 : aucun clic.

------------------------------------------------------------------------------------------------
SÉCURITÉ, CLICS, SILENCE
------------------------------------------------------------------------------------------------
  Pas de réinjection de la sortie dans les boucles dans gcs.cc (elle est dans tcs.cc). DELAY à 100 % et le gel de
  la REVERB tiennent sans s'emballer (plafonds doux). La sortie a le limiteur de
  wcs.cc. Un larsen ACOUSTIQUE (micro interne devant l'enceinte) ne peut pas être empêché par un patch.
  Réglages extrêmes et au hasard (14 tirages, avec appuis AUX et touches) : aucune erreur Pd, aucun NaN, crête <= 1.
  Au repos (sans entrée) : sortie exactement nulle ; boucle enregistrée sur du silence : crête 0.
  Effacement (AUX tenu à 6,0 s) : silence (< -90 dB) dès 7,2 s, sortie nulle de 8 à 10 s.
  Clics (sinus 220 Hz ; rafales d'aigus > 4 kHz par fenêtres de 2 ms, rapportées au signal ; la référence est la
  prise sans action, point de bouclage compris : -76,7 dB) : PLAY -> DUB -> PLAY -76,7 dB ; touches de hauteur
  -74,7 dB ; effacement -67,4 dB ; REVERSE -68,8 dB ; changement de couche (vers une couche vide puis retour)
  -61,8 dB. Aucun clic audible.
  Notes bloquées : 25 séquences au hasard -> 0.

------------------------------------------------------------------------------------------------
CPU ET MÉMOIRE
------------------------------------------------------------------------------------------------
  CPU (machine de test x86, PAS l'Organelle : seuls les rapports comptent ; méthode de vcs.cc : t(40 s) - t(10 s),
  entrée = bruit, boucle de 4 s enregistrée ; référence mesurée dans la même série) :
    vcs.cc v2.20 8v, 8 notes tenues ................................. 10,2 % d'un cœur (référence)
    gcs.cc boucle de 4 s en PLAY sans effets (VERB DRY) .............. 1,6 %  (x0,15)
    gcs.cc réglages d'usine (PLAY, 12 grains max, VERB D75/W25) ...... 2,2 %  (x0,22)
    gcs.cc 6 couches en MULTI, têtes à x1, H.LEVEL 50 % + grains ..... 2,5 %  (x0,24)
    gcs.cc PLAY, 16 grains en même temps ............................. 2,7 %  (x0,27)
    gcs.cc pire cas : DUB + 16 grains + MOD + DELAY (UP OCT) + REVERB
      (SHIM) + PRINT (deux chaînes d'effets) ......................... 4,3 %  (x0,42)
  (Écarts de +/-0,04 entre séries : bruit de mesure.) La deuxième chaîne d'effets ne tourne qu'avec PRINT ON ; une tête
  calcule sa position dès que sa couche est enregistrée (les grains la suivent), et
  son son seulement si elle sonne.
  Une voix de grain ne calcule que pendant son grain ; DELAY et REVERB sont éteints (switch~) à 0 % ;
  la page VIEW ne calcule que quand elle est affichée.
  MÉMOIRE : l'Organelle S2 a 1 Go de RAM (source : forum Critter & Guitari, « The S2 uses the 1GB RAM version » du
  module Raspberry Pi CM4). Tampons : 6 couches x 13 s (10 s + 3 s de marge pour les grains) x 44 100 x 4 octets
  = 13,8 Mo, + environ 1,7 Mo (2 delays de 3,2 s, 2 reverbs, décaleurs, VIEW), soit environ 1,6 % de la RAM.

SAUVEGARDE DES RÉGLAGES
  2 s après le dernier mouvement, dans gcs-etat-v24.txt (dossier du patch), relu au démarrage (mesuré : VOLUME 0 relu
  -> sortie nulle). Effacer ce fichier = réglages d'usine. Les boucles ne sont pas sauvegardées.

------------------------------------------------------------------------------------------------
HISTORIQUE (avant -> après, mesuré)
------------------------------------------------------------------------------------------------
  v2.4 (demandé : « une petite indication pour savoir si les layers sont actifs ou non, quelque chose de très simple » ;
  « sur gcs.cc le HEAD agit en parallèle de GRAINS, ça devrait être l'inverse : GRAINS devrait agir après (H.LEVEL, SPEED,
  H.INERT) » ; « c'est le SCAN que je veux automatiser, qu'il avance tout seul ou qu'il se déplace selon un LFO, par
  exemple au hasard ») :
  - bandeau : « L1 » et « R » -> 6 carrés (plein / creux / trait, couche active soulignée), REVERSE = état en inversé ;
  - les grains suivent la tête : avant, tête et grains jouaient côte à côte et SCAN restait fixe quelle que soit SPEED ;
    après (mesuré) : x1 -> 220 / 440 Hz alternent chaque seconde, x0,5 toutes les 2 s,
    -x1 à l'envers, STOP fixe ;
  - H.LEVEL : niveau de la tête ajouté aux grains -> mélange grains <-> tête (-10,6 / -10,5 / -14,4 dB à 0 / 50 / 100 %) ;
  - SPEED d'usine x1 -> STOP (le son d'usine reste celui de v2.3 : SCAN fixe) ; G.LEVEL fixé retiré (remplacé par le
    mélange).
  v2.3 (demandé : « une option qui permette de jouer les layers en simultané et/ou en séparé (mute / démute avec les
  touches) » ; « une tête de lecture comme sur tcs.cc, en avant ou en reverse, avec une vitesse ») : une tête par couche,
  L.MODE SOLO / MULTI, touches court / long ; page HEAD (10 -> 11 pages). Corrigé pendant la mise au point : un [delay]
  qui recevait un nombre au lieu d'un bang lançait le choix de couche au bout de 1 ms au lieu de 500 (l'appui court ne
  mettait rien en muet) -> appui court / long conformes.
  v2.2 (demandé : « les effets doivent être DRY/WET, pas juste un SEND ») : DELAY et VERB en vrai DRY / WET en série ;
  FX.IN : ce qui entre dans la chaîne, le reste la contourne ; à WET (page 1), plus aucun son direct, effets compris
  (avant, la reverb du sax restait : -31,8 dB ; après : sortie nulle) ; PRINT enregistre la sortie de la chaîne.
  v2.1 (effets, demandé : « enlever la SPRING, une reverb plus ambient avec sa page, un delay plus expressif et
  ambient, inspiré de la MOOD MkII ou d'autres Chase Bliss ; les effets ne touchent pas la boucle, sauf pendant
  l'enregistrement ») : ECHO, SPRING, LOFI, WIDTH -> pages DELAY et REVERB, FX.IN et PRINT (voir EFFETS D'AMBIANCE).
  9 -> 10 pages.
  v2.0 (séparation, demandée : « trop de subpages », AUX pour REC, supprimer / overdub, DRY/WET) :
  - 20 pages / 80 réglages -> 9 pages / 32 réglages (+ 4 sur VIEW). Retirés : tête bande, usure, dérive, réinjection,
    LENGTH (-> tcs.cc) ; LFO + RANDOM + WHEEL -> un modulateur ; COMP et TAPE de la section vintage ; GLIDE, ERASE.T,
    F.FADE, AUTO.L, O.HOLD, IN.GATE, IN.HPF, REC.LVL, G.LEVEL (fixés).
  - FREEZE (AUX tenu / double appui) -> looper REC / PLAY / DUB, effacement par AUX tenu 1 s, ARM sur attaque
    (remplace O.MODE REC + O.HOLD). La touche sol (ERASE) devient une touche de hauteur.
  - DRY/WET : à WET, plus aucun signal sec (mesuré : couche vide + entrée -> sortie nulle à WET).
  - DUB d'usine 85 % -> 100 % (les grains relisent la boucle sans qu'elle s'estompe).
  - Niveau : grains calés sur l'entrée (+0,3 à +1,6 dB), plus sur la tête bande.
  - Corrigé pendant la séparation : ECHO muet (le réglage HEADS, retiré des pages, n'était plus initialisé) -> fixé à
    1+2 ; une variable en majuscules (w_keepT) non déclarée -> renommée ; après l'effacement, la lecture continuait
    jusqu'à la fin du tour -> coupée selon l'état de la couche (sortie nulle de 8 à 10 s).
  v1.0 : corrections décrites dans le README de v1.0 (hasard d'expr, latence d'un bloc dans la boucle, détecteur
  d'attaques 21-35 fausses -> 0, SCAN, VOLUME...).

BANC : sources/bench (Pd 0.54.1 en mode batch + numpy ; sources/bench/LISEZMOI.txt). Résultats : resultats/gcs/*.json.

NON VÉRIFIÉ / À VÉRIFIER SUR L'ORGANELLE
  - version de Pd de l'Organelle S2 (le banc tourne sous Pd 0.54.1) ; objets : gcs-check ;
  - canal du micro interne : gcs-check ; couleurs exactes de la LED par état ;
  - CPU réel sur l'Organelle (seuls les rapports du banc comptent) ;
  - le son et le détecteur d'attaques sur un vrai saxophone (le banc utilise un « sax » synthétique) ;
  - l'Arbhar lui-même : étendue de PITCH, largeur des fenêtres, loi d'INTENS, plage de l'écart non quantifié.

SOURCES (consultées le 17/10/2026)
  Arbhar : manuel firmware 2.0 (Instruō) https://www.instruomodular.com/wp-content/uploads/2023/10/Arbhar-Manual-Firmware-2.0-A5.pdf
  Organelle M / S / S2 (entrée, micro, sélecteur, notes) : https://docs.critterandguitari.com/Organelle/og_sms2/
  Organelle S2, 1 Go : https://forum.critterandguitari.com/t/organelle-returns-with-new-model-s2/11109
  Sélecteur micro / ligne (bogue signalé) : https://forum.critterandguitari.com/t/organelles-s2-internal-microphone-always-on-even-changing-the-input-selector/11367
  mother.pd, gWaveform, gCircle : https://github.com/critterandguitari/Organelle_OS
  Chase Bliss MOOD MkII (canal Wet, routage, MIX) : https://www.chasebliss.com/s/MOOD-MKII_Manual_Pedal_Chase-Bliss.pdf
  Chase Bliss Dark World (Shim, Decay au maximum = gel) : https://www.chasebliss.com/s/Dark-World_Manual_Pedal_Chase-Bliss.pdf
  Chase Bliss Habit (vitesse par paliers en quintes et octaves) : https://guitar.com/review/effects-pedal/the-big-review-chase-bliss-habit-echo-collector/
  Limiteur, prise en main douce : vcs.cc v2.20 / wcs.cc v3.0.1 (voir leurs README).

################################################################################################
ENGLISH VERSION
################################################################################################
gcs.cc v2.4 - grain cloud on recorded loops, for Organelle S2 (vanilla Pure Data, no externals)

An EFFECT on the Organelle's audio input (sax on the mic or the jack, or any line source). Record loops (6 layers of
10 s) with AUX or the footswitch; a grain cloud plays them back, pitched from the keys. Inspired by the Instruō Arbhar;
a copy of nothing. Sourced facts are marked "(source)", everything else is a CHOICE. No brand names on screen.

TWO SEPARATE PATCHES: gcs.cc v1.0 (20 pages, 80 settings) is now split into tcs.cc v1.4 (TAPE: Frippertronics loop,
variable-speed head, wear; 9 pages) and gcs.cc v2.4 (GRAINS: this patch; 11 pages). Same looper, same screen.

INSTALL: copy gcs.cc (and tcs.cc) plus gcs-check into Patches. Run gcs-check once (objects, sample rate, live L / R
input levels). INPUT: line-level TRS jack or internal mic via the hardware selector on the back (source: manual); the
patch reads [r~ inL] / [r~ inR]. A mono cable only feeds the left input. IN.SRC L | R | L+R [L+R]. Beware of acoustic
feedback with the internal mic.

LOOPER (AUX, footswitch or CC64):
  empty --press--> REC --press--> PLAY --press--> DUB --press--> PLAY ...   hold 1 s = erase the active layer.
  REC: loop length = time between the two presses (0.1-10 s; stops by itself at 10 s; 30 ms seam crossfade).
  PLAY: the loop repeats unchanged. DUB: overdub; old content kept at DUB [100 %, no fade, like the Arbhar Dub].
  Every press acts at once; keep it held 1 s to erase. ARM (INPUT > O.MODE ARM or BOTH): on an empty layer a press
  only arms; the next played attack starts REC (measured: attack at 2.0 s -> loop of 1998 ms). Switching layer during
  REC / DUB closes the recording cleanly. Header: page, 6 small squares = the 6 layers (filled = playing, hollow =
  recorded but silent, dash = empty, underlined = active layer), state (--- REC PLY DUB ARM; inverted = REVERSE), "n/11". The LED
  colour follows the state (to be checked on the device). Loops are not saved.
KEYS: C to F (low) = active layer 1-6 (MULTI: short = mute, long = record layer); F# = REVERSE; G to B (17 keys) = grain pitch, middle C (72) = original
  (-5..+11 semitones + PITCH + OCTAVE). KEYS MONO / POLY (each grain picks a held key); K.GATE ON = sound only while a
  key is held. Pitch bend +/-2 semitones.
PAGES: GRAINS (SCAN, SIZE, INTENS, DRY/WET), VARY (SPRAY, DIR, DEV, WINDOW), PLAY (PITCH, OCTAVE, KEYS, K.GATE), HEAD (H.LEVEL, SPEED, H.INERT, L.MODE), SETUP
  (LAYER, DUB, MAXGR, BURST), INPUT (IN.GAIN, IN.SRC, O.MODE, SENS), MOD (M.DEST, M.AMT, M.RATE, M.SHAPE), DELAY (DELAY,
  D.TIME, D.FDBK, CHAR), REVERB (VERB, R.TIME, SMEAR, SHIM), OUT (FX.IN, PRINT, G.SPRD, VOLUME), VIEW. See README-PAGES.txt.
  Fixed (CHOICE): REC level 100 %, input high-pass 60 Hz, no gate,
  bend 2 st, no glide, loop limiter -3 dB.
  DRY/WET: constant power; full WET = no direct sound at all, nor its effects (measured -240 dB). IN.SRC L+R adds
  both channels: a signal on both sides comes out ~6 dB louder.
GRAINS (source: Arbhar manual FW 2.0): SCAN (0 = start of the recording), SIZE 4 ms-3 s (750 ms at centre), INTENS
  (centre = most grains, left = synchronous, right = asynchronous), SPRAY, DIR, DEV (left random, right the 12 default
  quantised pairs), WINDOW, PITCH +/-24 st, LAYER (W, 1-6, ALL = omega), MAXGR 1-16, coin-toss panning.
  Measured: SCAN 25 / 75 % -> 221 / 450 Hz; LAYER 1 / 2 -> 220.0 / 329.0 Hz; MAXGR 4 / 16 -> 3.4 / 15.2 grains/s;
  DIR 0 / 50 / 100 % -> 14 / 11 / 0 forward out of 14; PITCH +7 / -12 -> 665.1 / 212.8 Hz; grain level vs input
  +0.3..+1.6 dB (worst -3.1 dB); stable in PLAY (-19.3 / -19.0 / -19.3 / -19.8 dB).
ONSETS: home-made detector: 11/12 attacks, 0 false, 2-4 ms. STRIKE = burst of BURST grains (4 per attack measured),
  ARM = attack starts REC.
MOD: one modulator (SINE, TRI, SQUARE, S&H, FLUCT, STEPS; 0.02-20 Hz) to any setting; measured 0.5 Hz square on SCAN:
  450 / 223 / 450 / 222 Hz... one per second.
SAFETY: no output reinjection in gcs.cc; output limiter; extreme / random settings: no Pd error, no NaN, peak <= 1;
  silence at rest; erase -> silence from 7.2 s. Clicks: all actions -61.8 to -76.7 dB (reference without action
  -76.7 dB). Stuck notes: 0 / 25.
AMBIENT EFFECTS: DELAY and REVERB, true DRY / WET inserts in series (since gcs.cc v2.2), inspired by Chase Bliss pedals
  (MOOD MkII, Dark World, Habit; algorithms are CHOICES). Chain: DRY/WET (direct vs loop; at WET no direct sound at all,
  nor its reverb / delay) -> FX.IN picks what enters the effects (INPUT / BOTH / LOOP; the rest bypasses them) ->
  DELAY dry/wet -> REVERB dry/wet. The effects NEVER change the loop (measured: bit-identical). REVERB: VERB dry/wet
  [D75/W25] | R.TIME 0.4-30 s, above 95 % FREEZE (holds) | SMEAR | SHIM. DELAY: DELAY dry/wet [DRY = off] | D.TIME
  40 ms-2 s, tape glide | D.FDBK, 100 % = repeats hold | CHAR TAPE / CLEAN / UP 5th / UP OCT. PRINT ON: during REC / DUB
  only, the input processed by a second DELAY -> REVERB chain is recorded instead of the dry input; the existing loop is
  never re-processed (measured: difference 0). Safety and clicks: no NaN, peak < 1, no click.
LAYERS (since v2.3): one play head per layer, all at the same speed (multitrack tape). L.MODE SOLO = only the active
  layer plays (layer key = choose it); MULTI = all non-muted layers play together; layer key short press = mute /
  unmute, long press (0.5 s) = choose the layer AUX records / overdubs. Measured: mute -105 dB, no click (-66.6 dB).
HEAD (v2.4: the GRAINS come AFTER the head): each layer has a head moving through the loop; grains are taken around
  it (grain position = head + SCAN + SPRAY). SPEED [STOP] moves the SCAN by itself: x1 = grains follow the loop as it
  was played, x0.5 = half as fast (stretch), -x1 = backwards, STOP = frozen on the last pass (SCAN alone, as before);
  grain pitch does not follow SPEED. H.INERT: the head (and the grains) speed up / slow down smoothly. H.LEVEL [0] =
  constant-power mix GRAINS <-> HEAD (0 grains only, 50 % both, 100 % head only). L.MODE: see LAYERS.
  Random / LFO SCAN: MOD page, M.DEST SCAN, M.SHAPE S&H (random jumps) or FLUCT (slow random drift) or SINE / TRI.
  Measured (2 s layer: 220 Hz then 440 Hz, SCAN 25 %, pitch read every 0.25 s): STOP 220 Hz constant; x1 alternates
  every 1 s; x0.5 every 2 s; -x1 alternates backwards; STOP + S&H on SCAN: random jumps. H.LEVEL 0 / 50 / 100 %:
  -10.6 / -10.5 / -14.4 dB. Head alone: x0.5 / x1.5 / -x1 -> 220.0 / 660.0 / 439.6 Hz for 440.
CPU (x86 test machine, ratios only; t(40 s) - t(10 s), noise input, 4 s loop): PLAY without effects 0.15x vcs.cc 8v;
  factory 0.22x; 6 layers in MULTI (heads x1, H.LEVEL 50 %) 0.24x; 16 grains 0.27x; worst case (DUB + 16 grains + MOD + DELAY + REVERB + PRINT with two effect chains)
  0.42x.
MEMORY: 6 x 13 s x 44,100 x 4 bytes = 13.8 MB (+ about 1.7 MB for the effects), about 1.6 % of the S2's 1 GB (source: C&G forum).
SETTINGS saved to gcs-etat-v24.txt 2 s after the last move; delete it for factory settings.
HISTORY v2.4: header layer squares (filled / hollow / dash, active underlined; REVERSE = inverted state); grains follow
  the head (SPEED moves the SCAN; before: SCAN fixed whatever SPEED); H.LEVEL = grains <-> head mix; SPEED factory STOP.
v2.3: one play head per layer, L.MODE SOLO / MULTI, mute with short key press; HEAD page (tape head).
v2.2: DELAY / VERB are true dry/wet inserts; WET = no direct sound at all; PRINT records the chain output.
v2.1: ambient DELAY / REVERB pages, FX.IN, PRINT (replace ECHO / SPRING / LOFI / WIDTH); 10 pages.
v1.0 -> v2.0: 20 pages -> 9; FREEZE -> REC / PLAY / DUB looper with hold-to-erase and ARM; DRY/WET full WET =
  no dry; DUB 85 % -> 100 %; fixed during the split: silent ECHO (HEADS not initialised), undeclared variable, one
  extra pass after erasing.
NOT VERIFIED: Pd version on the S2, mic channel and objects (gcs-check), LED colours, real CPU, real saxophone,
  Arbhar details the manual does not give.
