API JavaSound

Table des matières

Résumé. 3

Introduction. 4

Java Sound. 5

Univers de développement de Java Sound. 5

Utilisation de Java Sound. 6

Création d’un nouveau projet Maven. 6

Création de la partie Enregistreur 8

La classe AudioRecorder 9

La méthode d’initialisation. 9

La méthode Run. 10

Accesseurs sur la classe. 11

Création de la partie Lecture. 12

La classe AudioReader 12

La méthode d’initialisation. 13

La méthode Run. 13

Accesseurs sur la classe et fin de classe. 14

Résumé

The Java Sound API is a low-level API for handling input / output audio streams. It allows the capture, playback of audio streams and manipulation of them (effects, mixing ...). It also offers possibilities for synthesis and sequencing sounds (MIDI). Java Sound is only dedicated to sound and allows full control over it.

Java Sound is an API written in Java allowing to be integrated in many applications used in sound processing and post processing.

In this contribution we will discuss some simple examples of using this API, including reading and recording an audio file through a Java program.

Introduction

Le Java, langage de programmation inventé par la société Sun Microsystems[1], est un langage orienté objet permettant de développer de nombreuses applications utilisables sur une grande variété de plates-formes comme des systèmes embarqués, téléphones mobiles, ordinateurs, serveurs et superordinateurs.

Java étant à l’origine un langage, il a ensuite évolué en un ensemble de technologies appliquées dans l’informatique autant dans le web que dans le développement informatique au sein d’applications au travers de frameworks, serveurs d’applications diverses, jeux et autres outils de développements.

Java est compris par tous les systèmes d’exploitation tels que Linux, Mac OS et Windows[2]. Il permet ainsi de développer une application qui soit cross plateforme et ainsi gommer tous les problèmes de compatibilité intersystèmes. Le langage Java fut créé en même temps que le web et permet de dialoguer et d’échanger des informations au travers d’internet.

De nombreux frameworks[3] virent ensuite le jour afin d’implémenter différentes fonctionnalités plus rapidement, ainsi que d’effectuer différents tests sur un code en cours de développement. Nous pouvons citer JUnit nous permettant d’effectuer des tests unitaires dans le code Java et ainsi vérifier que toutes les fonctionnalités souhaitées dans notre code fonctionnent correctement.

Nous pouvons également rajouter à la liste des frameworks Google Guava qui est divisé en trois domaines fournissant différents outils permettant de la programmation fonctionnelle, la gestion des caches ainsi que des immutables et du hachage d’informations.

L’API Java Sound permet donc au travers de s’intégrer à l’ensemble de ces framework afin de manipuler des fichiers audio. Elle permet ainsi l’enregistrer et la lecture de fichier audio ainsi que la manipulation de ceux-ci au travers de flux audio. L’API permet également de créer des séquences, de mixer les différents flux audio et de les convertir en en sons MIDI.

Nous allons dans cette contribution découvrir cette API ainsi que certaines de ses fonctionnalités au travers de deux différents codes permettant d’enregistrer un fichier audio à partir d’un flux entrant et la lecture du fichier enregistré.

Java Sound

L' API Java Sound est une API de bas niveau permettant d'effectuer et de contrôler l'entrée et la sortie de supports audio, y compris des données audio et des données MIDI (Musical Instrument Digital Interface). L'API Java Sound fournit un contrôle explicite sur les fonctionnalités normalement requises pour l'entrée et la sortie audio, dans un cadre favorisant l'extensibilité et la flexibilité.

L'API Java Sound fournit le niveau sonore le plus bas sur la plate-forme Java. Il fournit aux programmes d’application une grande quantité de contrôle sur les opérations sonores et est extensible.

Par exemple, l'API Java Sound fournit des mécanismes pour installer, accéder et manipuler des ressources système telles que des mélangeurs audio, des synthétiseurs MIDI, d'autres périphériques audio ou MIDI, des lecteurs et graveurs de fichiers et des convertisseurs de format audio.

L'API Java Sound n'inclut pas d'éditeurs de son sophistiqués ni d'outils graphiques, mais fournit des fonctionnalités sur lesquelles de tels programmes peuvent être construits. Il met l'accent sur le contrôle de bas niveau au-delà de ce que l'utilisateur final attend habituellement.

Les programmes axés sur le son peuvent tirer parti de l'API Java Sound, en particulier s'ils nécessitent des fonctionnalités plus avancées, telles que la possibilité de contrôler soigneusement la lecture audio en mémoire tampon ou de manipuler directement un synthétiseur MIDI. Parmi les autres API Java présentant des aspects sonores, citons Java 3D et des API pour la téléphonie et la parole.

Nous allons donc dans cette contribution découvrir deux fonctionnalités qu’offre l’API Java Sound : l’enregistrement d’un fichier audio au travers d’un flux entrant ainsi que la relecture du fichier audio.

Univers de développement de Java Sound

Java Sound, étant développé sous Java, peut être exécuté sur n’importe quelle plateforme compilant le langage Java. Afin de compiler Java, il est nécessaire de posséder une plateforme de développement (JDK) et d’exécution (JRE) afin que tout puisse fonctionner correctement. L’IDE IntelliJ faisant partie de la communauté Java, l’IDE intègre tout ce qui nous est nécessaire afin de développer nos différents modules à l’aide de l’API Java Sound. Nous allons donc développer sous IntelliJ afin de profiter de la compilation du Java directement au sein de l’IDE et ainsi pouvoir développer sans problèmes de compilation.

Afin de pouvoir profiter pleinement de Java Sound dans IntelliJ, il va falloir ajouter les différents paquets dans l’IDE afin d’avoir accès aux paquets et fonctionnalités de Java Sound. Passons donc à la phase d’installation afin de commencer à développer notre premier exemple.

Utilisation de Java Sound

Création d’un nouveau projet Maven

Afin de pouvoir utiliser les librairies de Java Sound et donc de pouvoir coder notre lecteur et enregistreur de son, il nous faut au préalable créer un nouveau projet Maven dans l’IDE IntelliJ (Ou Eclipse).

Pour ceci, ouvrez l’IDE et sélectionnez « créer un nouveau projet ». IntelliJ va alors vous demander quel type de projet créer. Sélectionnez alors Maven comme dans l’exemple ci-dessous.

IntelliJ va alors lister l’ensemble des archétypes disponibles : n’en sélectionnez aucun, ici nous n’en avons pas besoin. Cliquez simplement sur Next pour continuer les étapes d’installation.

Il va falloir sur la suite, renseigner les différentes informations relatives à votre projet comme le groupeId, le nom de votre et la version. Renseignez les différents champs comme suit ou alors à votre convenance.

Cliquez ensuite sur Next pour continuer vers la dernière étape d’installation.

La dernière étape d’installation consiste à donner un nom à votre projet ainsi qu’a lui donner la localisation sur votre machine. Vous pouvez renseigner les champs de la dernière étape comme suit :

Terminez l’installation en cliquant sur Finish.

Création de la partie Enregistreur

Afin de rendre le code plus structuré, nous allons commencer par créer un package « enregistreur » permettant d’accueillir la classe AudioRecorder qui nous permettra d’implémenter notre code de l’enregistreur.

Dans l’arborescence de votre projet, créer un nouveau package « enregistreur ».  Créez ensuite dans ce package une nouvelle classe AudioRecorder. Cette classe va accueillir les différentes méthodes permettant d’enregistrer un flux entrant.

La classe AudioRecorder

La classe AudioRecorder va donc nous permettre d’enregistrer un flux entrant dans un fichier audio à l’aide de différentes méthodes : une méthode d’initialisation qui va configurer l’API suivant les réglages désirés, une méthode run permettant d’effectuer l’enregistrement et différents accesseur sur des éléments de notre classe.

La classe AudioRecorder commence donc de la manière suivante en implémentant l’interface Runnable :

Il nous faut effectuer différentes déclarations qui nous seront utiles pour la suite du code, notamment la déclaration en variable globale du type de fichier audio.

La méthode d’initialisation

La méthode d’initialisation va donc nous permettre d’initialiser l’API en y renseignant les paramètres techniques de l’enregistrement du son comme le sampleRate, le nombre de bit pour l’enregistrement, etc...

Le format audio sera également renseigné à ce moment là et l’API sera configurée à partir de ces différentes informations.

Le code de la méthode d’initialisation est présenté ci-dessous.

La méthode Run

La méthode Run, appelée après la méthode d’initialisation va nous permettre d’effectuer l’enregistrement du son grâce aux informations précédemment renseignée lors de la phase d’initialisation.

La méthode Run se présente donc comme suit :

L’enregistrement d’un flux entrant est donc très simple à effectuer : l’ensemble des actions sont effectuées sur la ligne en cours. La ligne est démarrée, nous créons un nouveau Stream entrant que nous passons en paramètres à l’API en écriture avec le format audio déclaré en variable globale et au fichier configuré dans lequel nous souhaitons enregistrer le flux entrant.

Une fois l’enregistrement terminé, la ligne est arrêtée puis fermée.

Accesseurs sur la classe

La classe AudioRecorder possède deux accesseurs : un sur le fichier et un sur la ligne permettant diverse manipulation :

Le setFile nous permet de choisir le fichier à configurer. Il faudra donc, au préalable créer un nouveau fichier. Le getLine permet de récupérer la ligne en cours.

Création de la partie Lecture

Nous allons maintenant passer à la classe Lecture.

Dans l’arborescence de votre projet, créer un nouveau package « lecteur ».  Créez ensuite dans ce package une nouvelle classe AudioReader. Cette classe va accueillir les différentes méthodes permettant d’enregistrer un flux entrant.

La classe AudioReader

La classe AudioReader va donc nous permettre de lire un fichier audio externe ou précédemment enregistré à l’aide différentes méthodes : une méthode d’initialisation qui va configurer l’API, une méthode run permettant d’effectuer la lecture du fichier, une méthode stop pour stopper la lecture du fichier et des accesseurs de classe.

La classe AudioReader commence donc de la manière suivante en implémentant l’interface Runnable :

Différentes déclarations nous sont nécessaires pour les traitements suivant dans le code.

La méthode d’initialisation

La méthode d’initialisation va nous permettre ici de passer le fichier audio en mode lecture et donc de pouvoir accéder à son contenu. La lecture de celui-ci ne sera pas effectuée ici. Il ne s’agit que de la mise en lecture du fichier qui est nécessaire avant la lecture réelle.

Le code de la méthode d’initialisation est présenté ci-dessous.

La mise en lecture du fichier est effectuée par la récupération de la ligne sur le fichier en cours. Nous passons donc, pour cela, le fichier en flux entrant puis nous en récupérons le format du fichier. Enfin, pour terminer la récupération de la ligne, nous utilisons un accesseur de classe afin de récupérer la ligne courante.

La méthode Run

La méthode Run, appelée après la méthode d’initialisation va nous permettre d’effectuer la lecture de la ligne récupérée lors de la phase d’initialisation et ainsi de pouvoir effectuer la lecture du fichier.

La méthode Run se présente donc comme suit :

La ligne précédemment récupérer avec les informations du fichier est donc ouverte pour pouvoir entamer la lecture. La ligne est ensuite démarrée.

Un nouveau table de byte est crée ce qui nous permet d’écrire en mode buffer pour ensuite lire les bytes un à un. Cela aura pour effet de lire le fichier au travers de la ligne.

Une fois la lecture terminée, la ligne est refermée et la lecture du fichier et terminée.

Accesseurs sur la classe et fin de classe

La classe AudioReader possède deux accesseurs ainsi qu’une méthode Stop que l’on peut écrire en ligne par sa simplicité :

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *