Audio en temps réel

L'information suivante concerne en premier lieu l'utilisation de csound à partir de la ligne de commande. Les frontaux implémentent ces caractéristiques de différentes manières, mais leur connaissance est nécessaire dans certains d'entre eux.

Les options -i et -o sont utilisées pour spécifier une sortie en temps réel à la place de l'habituelle sortie différée dans un fichier. On utilise -o dac pour la sortie en temps réel et -i adc pour l'entrée en temps réel. Naturellement, on peut utiliser l'un ou les deux selon les possibilités matérielles. On peut aussi spécifier le matériel à utiliser en ajoutant un numéro ou un nom de périphérique au drapeau (voir -i et -o).

Il peut aussi être nécessaire d'utiliser l'option -+rtaudio pour spécifier le pilote d'interface à utiliser. Csound utilise Portaudio par défaut, qui est multi plates-formes et fiable, mais, pour obtenir de meilleures performances, on peut utiliser ALSA et JACK sur linux, et CoreAudio sur Mac. On peut utiliser ASIO sur Windows si la version de Portaudio a été compilée avec le support ASIO.

On peut voir une liste des périphériques disponibles en donnant un numéro de périphérique trop grand, par example -o dac99. Si vous utilisez Portaudio, ceci indiquera également si ASIO est disponible.

Tailles de période et de tampon

Les tailles de période et de tampon varient beaucoup d'une machine à l'autre. Plus la taille du tampon est petite et plus la latence est courte, mais cela peut causer des interruptions et des clics dans le flux audio. Les options Csound qui contrôlent les tailles de période et de tampon sont respectivement -b et -B. La taille de tampon dépend du matériel, et des essais peuvent être nécessaires pour trouver l'équilibre optimal entre une faible latence et un flux audio continu. Les valeurs données à -b et -B doivent être des puissances de deux, et la valeur de -B doit surpasser celle de -b d'au moins une puissance de deux.

Actuellement, avec -B fixé à 512, la latence de la sortie audio est d'environ 12 millisecondes, suffisamment rapide pour un jeu au clavier raisonnablement réactif. On peut même obtenir des latences plus courtes sur certains systèmes.

Cadence de contrôle

De faibles valeurs de ksmps donneront en général une synthèse de meilleure qualité, mais consommeront plus de ressources système. Il n'y a pas de règle absolue pour fixer ksmps - différents orchestres nécessiteront différentes cadences de contrôle. Un instrument à guide d'onde nécessitera une valeur de ksmps de 1 (et pourra ne pas convenir au temps réel), alors qu'une simple synthèse FM pourra fonctionner avec de plus grandes valeurs de ksmps sans dégradation notable du son. Si cette synthèse FM doit jouer une ligne de basse monodique, on peut utiliser une très faible valeur de ksmps, cependant des clusters de notes plus complexes nécessiteront une valeur de ksmps plus grande. Un système linux bien réglé devrait même être capable de produire des synthèses polyphoniques complexes avec des valeurs de ksmps aussi faibles que 4 ou 8. Si l'on a besoin de capacités audio duplex complètes, -b doit être un multiple entier de ksmps. En gardant cela à l'esprit, on peut poser comme règle empirique de n'utiliser que des puissances de deux pour ksmps.

Certains réglages diffèrent selon la plate-forme. Voir la suite pour de l'informations sur chaque plate-forme.

Entrées/sorties en temps réel sous Linux

Sous linux, les réglages PortAudio/PortMidi par défaut provoquent une latence plus longue que celle que l'on obtiendrait avec ALSA et/ou JACK. Les greffons PortMusic sont des serveurs audio et MIDI, qui fournissent une interface aux pilotes ALSA, tout comme le fait JACK, mais d'une manière fondamentalement différente. Pour une comparaison plus détaillée prière de se référer à :

http://jackaudio.org/faq

Utilisation d'ALSA

Le plus haut niveau de contrôle et la plus faible latence possible sont atteints en utilisant les greffons ALSA en combinaison avec l'option --sched. L'utilisation de --sched nécessite que Csound soit lancé par l'utilisateur root, ce qui peut être impossible ou indésirable dans certaines circonstances.

Les greffons ALSA nécessitent le nom ("name") d'une carte ("card") et d'un périphérique ("device"). A moins d'avoir nommé vos cartes dans ~/.asoundrc (ou /etc/asound.conf), les noms seront en fait des nombres. Pour obtenir une liste des configurations possibles, utilisez les utilitaires en ligne de commande "aplay", "arecord" et "amidi". Ces utilitaires sont inclus dans la plupart des distributions Linux, ou peuvent être téléchargés et construits à partir de ces sources :

ftp://ftp.alsa-project.org/pub/utils/

Sortie audio

En tapant la commande suivante :

          aplay -l

vous obtiendrez une liste des périphériques de reproduction audio disponibles sur votre système. Cette liste ressemble à ceci :

[....]
**** List of PLAYBACK Hardware Devices ****
card 0: A5451 [ALI 5451], device 0: ALI 5451 [ALI 5451]
[....]

Si vous avez plus d'une carte sur votre système, ou s'il y a plus d'un périphérique sur votre carte, la liste sera naturellement plus compliquée, cependant, dans tous les cas, l'information pertinente est le numéro/nom de la carte/périphérique. Afin d'utiliser la carte son ci-dessus pour la sortie audio, il faut ajouter l'option suivante à la ligne de commande Csound, dans ~/.csoundrc, ou dans la section <CsOptions> d'un CSD :

          -+rtaudio=alsa -o dac

Sortie avec dmix

Si vous désirez utiliser Csound avec dmix et que votre carte son ne supporte pas le mixage matériel des flux audio, il faut régler les tampons logiciel (-b) et matériel (-B) avec un soin particulier. Si vous recevez un message du pilote ALSA de Csound qui ressemble à ceci :

ALSA: -B 8192 not allowed on this device; use 7526 instead

il y a de bonnes chances que vous puissiez utiliser dmix. Si vous utilisez dmix, les réglages de -b et de -B dans Csound doivent être synchronisés avec le taille de période (period_size) et la taille de tampon (buffer_size) de dmix respectivenemt, en utilisant le rapport du taux d'échantillonnage du projet Csound sur le taux d'échantillonnage sur lequel dmix est réglé. Les formules suivantes déterminent les réglages à utiliser pour Csound en fonction des réglages de dmix :

-b = (csound_sr/dmix_sample_rate) * dmix_period_size
-B = (csound_sr/dmix_sample_rate) * dmix_buffer_size

Par exemple, si dmix est fixé à 48000 échantillons par seconde, un period_size de 1024, et un buffer_size de 8192, si l'on exécute un projet Csound avec sr=48000, les réglages des tampons seront "-b 1024 -B8192". Si sr=24000, les réglages des tampons seront "-b 512 -B4096".

A cause de cette relation, si le taux d'échantillonnage du projet Csound ne divise pas exactement le taux d'échantillonnage utilisé par dmix, il pourra être difficile, voire impossible, de régler correctement -b et -B à cause des erreurs d'arrondi. En conséquence, si vous utilisez des taux d'échantillonnage différents que ceux que vous fixez pour dmix, nous vous suggérons de configurer dmix avec un period_size et un buffer_size divisibles par le rapport entre le taux d'échantillonnage de csound et celui de dmix. Par exemple, pour exécuter un projet avec sr=16000, les réglages suivants de dmix :

pcm.amix {
   type dmix
   ipc_key 50557
   slave {
       pcm "hw:0,0"
       period_time 0
       #period_size 1024
       #buffer_size 8192
       period_size 1536
       buffer_size 12288
   }
   bindings {
       0 0
       1 1
   }
}

# route ALSA software through pcm.amix
pcm.!default {
   type plug
   slave.pcm "amix"
}

avec period_size=1536 et buffer_size=12288 seront divisibles par 3 (le rapport du taux d'échantillonnage de csound par celui de dmix) pour obtenir "-b 512 -B4096" ((16000/48000) * 1536 = 512, (16000/48000) * 12288 = 4096).

[Note] Note

Pour la plupart des cartes son qui sont affectées par ceci, le taux d'échantillonnage par défaut de la carte sera 48000 et ceux de dmix seront 1024 et 8192.

Entrée audio

Normalement, la même carte étant utilisée pour les entrées et les sorties, en continuant l'exemple précédant, l'option :

          -i adc:hw:0,0

sera ajouté pour l'entrée audio à partie du périphérique 0 de la carte 0. Pour utiliser la carte par défaut, on emploie l'option suivante, mais attention, ça peut ne pas fonctionner :

          -i adc

Si l'on désire utiliser une autre carte ou un autre périphérique pour l'entrée, la commande suivante fournira une liste de périphériques en entrée :

          arecord -l

Si, par exemple, vous désirez utiliser en sortie une interface audio USB, qui est la deuxième "carte" dans votre système, alors que vous désirez utiliser en entrée votre carte son interne, la première carte de votre installation, positionnez les options suivantes à l'endroit adéquat :

          -+rtaudio=alsa -i adc:hw:0,0 -o dac:hw:1,0

Si vous désirez utiliser le second périphérique sur votre interface USB, pour envoyer un flux audio à un canal particulier, vous utiliserez les options suivantes :

          -+rtaudio=alsa -i adc:hw:0,0 -o dac:hw:1,1

Entrée MIDI

Csound ne crée pas automatiquement son propre port de séquenceur ALSA. Il crée un port midi direct ALSA à chaque lancement. Afin de permettre à votre orchestre de recevoir une entrée MIDI vous pouvez utiliser VirMIDI ou MIDIThru, selon vos préférences. La configuration de ces ports MIDI virtuels a été largement couverte ailleurs, voir le Linux MIDI how-to ou parcourez la documentation de votre distribution ou la documentation ALSA à la recherche d'instructions pour intaller et configurer VirMidi ou MIDIThru. Une fois ceci réalisé, la commande :

          amidi -l

retourne une liste des périphériques disponibles. Cette liste ressemble à ceci :

    [....]
Device    Name
hw:1,0    Virtual Raw MIDI (16 subdevices)
hw:1,1    Virtual Raw MIDI (16 subdevices)
hw:1,2    Virtual Raw MIDI (16 subdevices)
hw:1,3    Virtual Raw MIDI (16 subdevices)
hw:2,0,0  PCR MIDI
hw:2,0,1  PCR 1

Dans cet exemple, Csound peut se connecter à n'importe lequel des quatre ports virtuels MIDI directs, pour y écouter l'entrée MIDI. L'option suivante indique à Csound d'écouter sur le premier de ces ports :

          -+rtmidi=alsa -Mhw:1,0

Il faudra ensuite connecter votre matériel ou votre contrôleur logiciel au port qui accueille votre synthétiseur Csound. La manière la plus simple de le faire est d'employer l'utilitaire "aconnect". Tapez :

          aconnect -li

pour une liste des périphériques d'entrée disponibles, et :

          aconnect -lo

pour une liste des périphériques de sortie disponibles (y compris le port auquel Csound a été connecté). Cette liste ressemble à ceci :


#aconnect -li
client 0: 'System' [type=kernel]
    0 'Timer           '
    1 'Announce        '
        Connecting To: 15:0
client 20: 'Virtual Raw MIDI 1-0' [type=kernel]
    0 'VirMIDI 1-0     '
client 21: 'Virtual Raw MIDI 1-1' [type=kernel]
    0 'VirMIDI 1-1     '
client 22: 'Virtual Raw MIDI 1-2' [type=kernel]
    0 'VirMIDI 1-2     '
client 23: 'Virtual Raw MIDI 1-3' [type=kernel]
    0 'VirMIDI 1-3     '
client 24: 'PCR' [type=kernel]
    0 'PCR MIDI        '
    1 'PCR 1           '
    2 'PCR 2           '


#aconnect -lo
client 20: 'Virtual Raw MIDI 1-0' [type=kernel]
    0 'VirMIDI 1-0     '
client 21: 'Virtual Raw MIDI 1-1' [type=kernel]
    0 'VirMIDI 1-1     '
client 22: 'Virtual Raw MIDI 1-2' [type=kernel]
    0 'VirMIDI 1-2     '
client 23: 'Virtual Raw MIDI 1-3' [type=kernel]
    0 'VirMIDI 1-3     '
client 24: 'PCR' [type=kernel]
    0 'PCR MIDI        '
    1 'PCR 1           '

Dans l'exemple suivant, le clavier USB qui est listé ci-dessus comme le client 24 sera connecté au synthétiseur Csound qui est à l'écoute sur le premier port VirMIDI. Le clavier a trois ports de sortie. Le premier (24:0) transmet les messages reçus sur le port d'entrée MIDI, le second (24:1) transmet les messages de touches et de contrôleurs, et le troisième (24:2) transmet les messages système exclusif. La commande suivante connecte le second port du clavier au synthétiseur Csound :

          aconnect 24:1 20:0

Il faut garder à l'esprit que Csound agit comme un périphérique MIDI direct et non comme un client du séquenceur ALSA. Cela signifie que Csound n'apparaitra pas dans la liste des périphériques MIDI et ne sera pas disponible pour un usage direct avec aconnect, ainsi, il faut se connecter à un périphérique virtuel (comme 'virtual raw MIDI' ou 'MIDI through') pour des connexions persistantes, ou se connecter directement à la destination en utilisant les options de ligne de commande.

Sortie MIDI

On peut connecter Csound à n'importe quel périphérique qui apparaît dans la liste des ports de sortie du séquenceur ALSA, que l'on obtient par "amidi -l" comme ci-dessus. Afin de connecter un synthétiseur Csound au port MIDI out du clavier listé ci-dessus, on utilise l'option suivante :

          -Qhw:2,0,0

Temps-partagé

Si vous avez la possibilité d'exécuter Csound en tant qu'utilisateur root, l'option "--sched" permet d'améliorer spectaculairement les performances en temps réel avec ALSA, cependant vous pouvez bloquer le système si vous faites quelque chose de stupide. N'UTILISEZ PAS "--sched" si vous choisissez JACK pour la sortie audio. JACK contrôle le temps-partagé pour les applications audio qui l'utilisent, et il essaie également de fonctionner avec la priorité maximale. Si l'option "--sched" est utilisée, Csound et JACK vont entrer en compétition au lieu de coopérer, ce qui aura pour résultat de piètres performances.

Utiliser JACK

La manière la plus simple d'activer les entrées-sorties avec le greffon JACK est :

          -+rtaudio=jack -i adc -o dac

En outre, il y a quelques options de ligne de commande spécifiques à JACK :

Options de ligne de commande de JACK

-+jack_client=[nom_de_client]

Le nom de client par défaut de Csound est 'csound5'. Si plusieurs instances de Csound se connectent au serveur JACK, il faut utiliser des noms de client différents pour éviter les conflits de noms.

-+jack_inportname=[préfixe du nom de port d'entrée], -+jack_outportname=[préfixe du nom de port de sortie]

Le préfixe du nom des ports d'entrée/sortie JACK de Csound ; la valeur par défaut est 'input' et 'ouput'. Le nom complet d'un port est obtenu en ajoutant le numéro du canal au préfixe. Exemple : avec les réglages par défaut, un orchestre stéréo créera les ports suivants en mode d'opération full duplex :

csound5:input1              (enregistrement gauche)
csound5:input2              (enregistrement droite)
csound5:output1             (reproduction gauche)
csound5:output2             (reproduction droite)

-+jack_sleep_time=[temps de repos en microsecondes]

Depuis Csound version 5.01, cette option est dépréciée et ignorée.

Connecter Csound à d'autres clients JACK

Il n'y a par défaut aucune connection (on doit utiliser jack_connect, qjackctl, ou un utilitaire semblable) ; cependant, on peut connecter le greffon à des ports spécifiés par '-iadx:portname_prefix' ou '-odac:portname_prefix', où portname_prefix est le nom d'un port sans le numéro de canal, tel que 'alsa_pcm:capture_' (pour -i adc), ou 'alsa_pcm:playback_' (pour -o dac).

Notes sur les tailles de tampon

Les données audio sont reçues de et envoyées vers le serveur JACK par Csound au moyen d'un tampon circulaire qui est contrôlé par les options -b et -B. -B est la taille totale du tampon, tandis que -b est la taille d'une période. Ces valeurs sont arrondies de façon à ce que la taille totale soit un multiple entier de la taille de la période et supérieure à cette dernière. La différence de taille entre le tampon de Csound et la période doit être supérieure ou égale à la taille de la période de JACK.

Si l'on utilise en même temps -iadc et -odac, l'option -b doit être fixée à une valeur multiple de ksmps.

Exemple de réglage de tampon pour obtenir une faible latence sur un système rapide :

	  jackd -d alsa -P -r 48000 -p 64 -n 4 -zt &
	  csound -+rtaudio=jack -b 64 -B 256 [...]

avec temps-partagé pour le (en tant que root) :

	  jackd -R -P 90 -d alsa -P -r 48000 -p 64 -n 2 -zt &
	  csound --sched=80,90,10 -d -+rtaudio=jack -b 64 -B 192 [...]

Pour améliorer les performances, utiliser des valeurs de ksmps comme 32 ou 64.

Le taux d'échantillonnage de l'orchestre doit être le même que celui du serveur JACK.

Utilisation de pulseaudio

Le support de Pulseaudio a été ajouté dans Csound 5.09. Vous pouvez spécifier les réglages suivants :

  1. Noms de sortie : il est possible d'utiliser un nombre à la place du nom complet, ainsi -odac:1 sélectionne votre second périphérique (le compte commence à 0).
  2. Nom du serveur : il est possible de se connecter à un serveur spécifique en utilisant -+server=<server_string> où server_string est le nom d'un serveur ou une chaîne plus complexe de sélection de serveur (voir pulseaudio.org sur les chaînes de serveur). Ceci est transparent sur un réseau et permet les connexions à des machines distantes.
  3. Noms de flot : il est possible d'étiqueter les flots générés par csound, en utilisant -+output_stream=<stream-name> et -+input_stream=<stream-name>

Voici un exemple de ligne de commande :

csound -odac:1 examples/trapped.csd -+rtaudio=pulse -+server=unix:/tmp/pulse-victor/native -+output_stream=trapped