Comment programmer un séquenceur de musique simple pour Android (Java)


Ce que je veux faire:

Je voudrais programmer un séquenceur de musique très simple pour Android. Mais je n'ai jamais travaillé avec l'audio sur Android ou en Java, respectivement.

Ce que l'application doit faire:

  • lire des échantillons (fichiers WAVE / OGG)
  • jouer plusieurs canaux audio simultanément (par exemple, la trompette et la flûte devraient jouer simultanément, maximum de 10 instruments)
  • changer la hauteur des échantillons (par exemple, la trompette Le fichier WAVE doit être lu en hauteur normale (c4) et en hauteur inférieure/supérieure (e2/g6) et ainsi de suite)

C'est ce que l'application devrait pouvoir faire en général.

De quels composants ai-je besoin? Un lecteur multimédia normal (AudioManager?) ne fonctionnera pas, non?

Il y a déjà quelques applications qui font ce à quoi je pense:

  • FingerBeat pour iOS
  • FL Studio Mobile pour iOS
  • Uloops Studio pour Android

Merci d'avance pour de votre aide!

Author: caw, 2011-10-19

5 answers

Il existe un séquenceur de rythme open source très simple pour Android appelé SoundFuse. Ils ont une description et des captures d'écran sur la page.

Voici le dépôt github.

 6
Author: Lycha, 2011-10-23 10:37:15

Vous n'avez pas une exigence simple, mais trois exigences très différentes.

  1. La lecture de WAV doit être prise en charge par le JRE à l'aide des classes de javax.son.échantillonné, il jsut nécessite du code pour le câbler (pas trop sûr d'Android).

  2. Jouer OGG n'est pas pris en charge hors de la boîte. Il existe une implémentation open source pour OGG appelée jOrbis, voir leur site Web . Encore une fois cela peut nécessiter un code de câblage pour se connecter votre application.

  3. Pour un séquenceur, vous pouvez simplement utiliser MIDI. Encore une fois, il devrait être pris en charge par le JRE, et s'il n'est pas sur votre plate - forme, vous pouvez utiliser Gervill-un pur séquenceur MIDI Java (Project web site).

  4. Il y a aussi un ModPlayer qui peut jouer bon vieux Soundtracker et quelques autres. Cela peut également être abusé en tant que séquenceur si vous connaissez le format du module Soundtracker ou Screamtracker (format ancien, mais les descriptions sont toujours disponible sur le net). Le joueur avec la source peut être trouvé ici. Les formats de suivi ne sont pas si anciens d'ailleurs, certains des moteurs de jeu d'aujourd'hui les utilisent encore.

  5. Si vous voulez vraiment, vous pouvez cuisiner votre propre séquenceur, tous les trucs de base s'il y a dans javax.son.échantillonner. Cela nécessite juste quelques connaissances de base sur le son numérique et beaucoup de code de câblage.

Il n'y a pas de solution unique pour tous vos besoins, vous devrez point vous possédez l'ensemble de la construction gratuitement.

 2
Author: Durandal, 2011-10-25 16:27:28

Je ne serai pas en mesure de fournir une réponse complète, mais je vous indiquerai la bonne direction.

Android prend en charge .wav et .ogg de décodage. Selon: http://developer.android.com/guide/appendix/media-formats.html

Je n'ai aucune expérience en audio, mais votre meilleur pari semble être la classe SoundPool, elle vous permet d'ajuster la hauteur et le volume et elle semble être capable de lire plusieurs sons simultanément: "Notez que l'appel de play () peut provoquer un autre son à arrêtez la lecture si le nombre maximum de flux actifs est dépassé." http://developer.android.com/reference/android/media/SoundPool.html

Il y a aussi une classe MediaPlayer, mais c'est pour une utilisation plus simple. Je ne pense pas que cela permette le contrôle de la hauteur.

 2
Author: Boude, 2011-10-27 18:02:45

J'ai fait quelque chose de similaire pour mon application (jouer de l'échantillon de trombones). Après beaucoup d'expérience, j'ai trouvé que la meilleure solution était d'utiliser AudioTrack. Jetez un oeil à mon code source: http://code.google.com/p/trombonino/source/browse/trunk/src/com/trombonino

En particulier

Http://code.google.com/p/trombonino/source/browse/trunk/src/com/trombonino/Trombone.java http://code.google.com/p/trombonino/source/browse/trunk/src/com/trombonino/WavFile.java

 2
Author: gadjou, 2011-10-28 10:00:02

Vous aurez des problèmes avec votre timing sur le système Android. Pour éviter que votre thread de séquenceur ne soit interrompu par la récupération de place, vous devez probablement écrire le séquenceur en natif à l'aide du ndk.

Il est probablement préférable de lire les sons en utilisant également le ndk.

Jetez un oeil à https://code.google.com/p/high-performance-audio/

Dans l'exemple Soundfuse ci-dessus, le séquenceur utilise SystemClock.sleep() ce n'est jamais une bonne idée. Vérifiez Pourquoi en utilisant le système.Le filetage.Fil.Sleep() est une mauvaise pratique?.

Réalisé que cette question est vraiment ancienne mais y répondra de toute façon car aucune réponse ne mentionne le NDK.

 1
Author: JonasE, 2017-05-23 12:30:51