Bassbox (audio + opengl visual plugins)

Contenu du snippet

Titre: BassBox
Description: Audio + OpenGL visualisations
Auteur : Patrice Terrier
Sujet : OpenGL, Librairie Audio BASS.DLL, GDIPLUS, VISTA DWM
Langage : PowerBASIC, C, VB6 (using low level SDK programming style)
Plateforme : Windows XP, 2003, VISTA
Technologie : Win32, GDI+, OpenGL
Audience : Dev
Niveau : Expert


1 - Introduction

BassBox est un player multimedia participatif, qui combine audio et effets visuels OpenGL.

Le projet couvre différents aspects de la programmation bas niveau en mode SDK.
Idéalement chaque code source aurait dû faire l'objet d'un article distinct, mais cela m'aurait pris beaucoup trop de temps, alors je vous livre la totale a vous de faire votre marché.

Comme BassBox est hébergé sur un forum ou l'anglais est la langue de travail, la documentation (fichier CHM) est aussi dans cette langue, néanmoins je vous conseille de la lire pour compléter cet article.

Chaque plugin BassBox illustre un aspect différent de l'API OpenGL, en s'efforcant de produire la meilleure interaction entre audio et 3D, tout en privilégiant le coté artistique visuel de la scène.
L'interface spécifique a nécessité la création de différents éléments graphiques (créés avec photoshop) pour les composants du Skin, les images de fond du player et les différentes textures OpenGL.

Mon but, en postant BassBox sur ce forum, est de trouver de nouveaux contributeurs qui acceptent de partager leurs connaissances en OpenGL pour agrandir la liste des plugins proposés.

Le projet complet est hébergé ici :
http://www.jose.it-berater.org/smfforum/index.php?board=179.0

Note : Pour télécharger la dernière version, vous devrez tout d'abord vous enregistrer en utilisant votre nom réel.
Le forum de mon ami Jose Roca, comporte également de nombreux articles destinés aux programmeurs SDK bas niveau illustrés par de nombreux codes sources.
(anglais obligatoire).

La partie audio du projet s'appuie sur l'excellente librairie BASS.DLL de Ian Luck (www.un4seen.com).

Actuellement tous les plugins visuels sont écrits en OpenGL. Le support de DirectX est prévu, mais is sera mis en place lorsque les specs DX10 seront mieux connues.

BassBox est composé de 2 parties principales :

- Le Kernel, "BassBox.exe" qui est écrit en mode Win32 SDK natif en PowerBASIC.
- Les plugins, qui doivent être de véritables DLLs Win32.
BassBox fonctionne avec XP et VISTA, il est 100% compatible DWM en mode AERO "Blur" ou "Crystal" (mode GDImage).

Le code utilise uniquement GDIPLUS en mode "flat API", pour des raisons d'optimisation et de compatibilité avec DWMAPI.DLL, ce qui permet à BassBox de dessiner directement en mode AERO GLASS natif sous VISTA.

Le player utilise une interface skinnée dont le code source se trouve dans "zSkin.inc" et dont l'utilisation est expliquée en détail sur le forum de José Roca dans la section "SDK programming" qui se trouve ici :
http://www.jose.it-berater.org/smfforum/index.php?board=151.0


2 - Utilisation du player

- Décompresser le ZIP en préservant l'arborescence des répertoires.
- Créer un raccourci vers BassBox.exe sur le bureau de Windows.
- Faire un "tiré-déplacé" d'un dossier contenant des fichiers audio, ou des sous-dossiers imbriqués, depuis 'Explorateur vers l'icône du bureau ou directement sur le player, si celui-ci est déjà entrain de jouer.
- Utiliser les boutons de navigation pour passer d'une musique à l'autre lorsque plusieurs fichiers sont séléctionnés.
- Les boutons "Play" et "pause" permettent de démarrer ou suspendre le flux audio.
- Le curseur de volume permet d'ajuster le niveau sonore.
- Effets DirectSound : reverberation, chorus, flanger, echo, sound rotation.
- Presser la touche F1 ou l'icône située dans le coin supérieur gauche pour afficher l'aide au format CHM.

Format audio supportés :
- De type stream, aif, mp1, mp2, mp3, ogg, wav, wma.
- De type SoundTracker, mo3, it, xm, s3m, mtm, mod, umx.

Play list extension :
.bbp (BassBox Playlist) c'est un texte au format ASCII comportant une liste de fichiers audio avec leur chemin local complet (full qualified path)
Il est également possible d'indiquer dans la liste une URL au format "http" ou "ftp" pour effectuer du streaming internet.
En mode streaming internet, BassBox créé un répertoire local dans lequel il sauvegarde automatiquement les fichiers mp3 joués "en live".


3 - Origine du projet

BassBox est une refonte complète du projet C# "BlackBox" qui se trouve ici :
http://www.codeproject.com/script/Articles/list_articles.asp?userid=1378591
Il comporte également différents éléments de mes démos C# OpenGL qui sont ici :
http://www.zapsolution.com/winlift/ccorner.htm

Vous vous demandez surement pourquoi, alors que mes contributions antérieures étaient en C#, j'ai choisi d'écrire le Kernel en PowerBASIC ?
Tout d'abord je voulais être sûr de m'affranchir des problèmes générés par le GC (garbage collector) lorsqu'on utilise du code API bas niveau (mode unsafe, haha!).
Ensuite j'ai choisi celui qui me paraissait le plus adpaté pour faire du temps réel et qui utilise une syntaxe de type procédurale que tous les programmeurs peuvent comprendre.
Et puis j'ai aussi pensé aux VBistes qui seront ici en pays de connaissance.

Concernant OpenGL, fort heureusement la syntaxe est toujours la même quel que soit le langage, tant que l'on utilise le modèle procedural.

Pour le reste, vous pouvez consulter l'historique complet du projet ici :
http://www.jose.it-berater.org/smfforum/index.php?topic=1364.0


4 - Utilisation du code

zSkin.inc (fichier include) contient le code source du Skin Engine et de l'API Kernel utilisée par le projet.
AudioFX.inc (fichier include) l'interface DirectSound pour les effets Bass audio.
BBPlugin.inc (fichier include) contient les déclarations de structures et l'API (helper) de base des plugins.
BassBox.bas (Main section) Le programme principal dénomé le "kernel".
BassBox.zsk (Skin UIS) La charte graphique de l'application "User Interface Specification".
Pour plus de détails sur chacun des différents modules, merci de consulter le fichier d'aide au format CHM.

BassBox utilise la même technique que GDImage pour dessiner en mode "composited" sur la section "glass" de l'interface VISTA AERO.
Tout est expliqué dans la démo "Crystal" qui se trouve ici :
http://www.jose.it-berater.org/smfforum/index.php?topic=1372.0

Et tant que vous y êtes, essayez aussi "XP AERO GLASS is alive!" qui se trouve là :
http://www.jose.it-berater.org/smfforum/index.php?topic=1263.0
Ce code source explique non seulement comment utiliser l'API DWM de VISTA, mais aussi comment émuler le mode AERO GLASS sous XP !!!.


6 - Quelques points d'intérêt

Avec VISTA, BassBox utilise une region DWM négative pour créer l'aspect "Crystal", voir dans "zSkin.inc" la procédure :
- zSetCrystalBehindMode

A voir dans les différents plugins :
- La façon dont le signal audio est "postprocessed" pour amplifier le signal FFT à l'aide de la fonction SQR.

A voir aussi dans BBPlugin.inc :
- La création de textures OpenGL à partir de n'importe quel format graphique compatible GDIPLUS.
- La façon de convertir des fontes True Type pour pouvoir les utiliser avec OpenGL.
- La façon de lire un fichier séquentiel en utilisant uniquement l'API I/O bas niveau.

7 - Historique

L'historique complet de BassBox peut être consulté ici :
http://www.jose.it-berater.org/smfforum/index.php?topic=1364.0


8 - Captures d'écrans

Vous pouvez voir quelques captures d'écrans de plugins visuels ici :
http://www.powerbasic.com/support/pbforums/showthread.php?t=35346


9 - Fichiers audio "libre de droits"

Vous en trouverez queques uns spécialement sélectionnés pour BassBox ici :
http://www.jose.it-berater.org/smfforum/index.php?board=191.0


10 - Télécharger la dernière version

Je vous invite a consulter régulièrement le site de Jose Roca qui héberge le projet BassBox, afin de télécharger les mises à jour ou les nouveaux plugins disponibles.


J'aimerai créer un "Space theme" complet basé sur l'album "The songs of Distant Earth" de Mike Oldfield.
Par exemple le plugin "HAL" est destiné a illustrer le morceau intitulé "In the Begining", "Genesis" est conçu pour "Hibernaculum" et "Day One" pour "The Chamber" etc.

Source / Exemple :


5 - Plugin section
 
Note : Certaines cartes graphiques ont des problèmes de compatibilité avec OpenGL.
Si vous rencontrez un problème lorsque vous utilisez un plugin spécifique, retirez-le (ou renommez-le) du dossier "BBPlugin\", puis redémarrez BassBox.
 
Tous les plugins sont rangés dans le sous-dossier "BBPlugin\" 
Les ressources utilisées par les plugins sont stockées dans les 2 sous-dossier "Texture\" et "Include\". 
Chaque plugin est une petite DLL Win32 qui exporte une seule fonction nommée "BBProc". 
La procédure exportée "BBProc" permet de communiquer avec le Kernel en utilisant un pointeur In/Out vers une structure de type BBPLUGIN (passage par référence).

La procédure BBProc fonctionne exactement comme une procédure SDK WinProc standard, à la seule différence qu'elle reçoit ses messages du Kernel en temps réel et non pas depuis la file d'attente de Windows.
 
Toutes les tâches triviales sont gérées par le Kernel, de telle façon que le plugin ait juste à s'occuper de dessiner dans le buffer OpenGL, c'est tout.
 
TYPE BBPLUGIN                   '// 256 bytes
    Msg          AS LONG        '// The plugin's message (see above constant list).
    ParentWindow AS LONG        '// The parent window handle.
    DC           AS LONG        '// The parent window DC (while in play mode).
    RC           AS LONG        '// The parent OpenGL RC (while in play mode).
    Lpeak        AS WORD        '// The left audio channel peak value (while in play mode).
    Rpeak        AS WORD        '// The right audio channel peak value (while in play mode).
    Title        AS ASCIIZ * 32 '// Plugin's name or title.
    Author       AS ASCIIZ * 64 '// Plugin's author name.
    Version      AS DWORD       '// LOWRD major, HIWRD minor.
    RenderTo     AS LONG        '// BBP_GDIPLUS, BBP_OPENGL, BBP_DIRECTX.
    BackARGB     AS LONG        '// Default ARGB color background.
    FFTdata      AS DWORD       '// DWORD pointer to the FFT() AS SINGLE array.
    FFTsize      AS WORD        '// Size of the FFT array.
    WinMsg       AS LONG        '// True Windows message.
    wParam       AS LONG        '// wParam 
    lParam       AS LONG        '// lParam
    Reserved     AS ASCIIZ * 110'// Reserved for future extension.
END TYPE
 
'// The main exported plugin's function would be bbProc, like this:
FUNCTION BBProc ALIAS "BBProc" (BYREF BBP AS BBPLUGIN) EXPORT AS LONG
    LOCAL nRet AS LONG
    nRet = BBP_SUCCESS
    SELECT CASE LONG BBP.Msg
    CASE BBP_RENDER
         '// Draw the scene using BBP.LeftPeak and BBP.RightPeak
    CASE BBP_CREATE
         '// Retrieve plugin details
         BBP.Title    = "My BB plugin"
         BBP.Author   = "My Name"
         BBP.Version  = MAKDWD(1, 0) '// Version 1.0"
         BBP.RenderTo = BBP_OPENGL   '// or BBP_GDIPLUS, or BBP_DIRECTX
    CASE BBP_INIT
         '// Do your code initialisation there
    CASE BBP_SIZE
         '// The size of the view port has changed.
    CASE BBP_KEYBOARD
         '// Handle all Windows keyboard messages there
         Msg = BBP.WinMsg
         wParam = BBP.wParam
         lParam = BBP.lParam
    CASE BBP_MOUSE
         '// Handle all Windows mouse messages there
         Msg = BBP.WinMsg
         wParam = BBP.wParam
         lParam = BBP.lParam
    CASE BBP_DESTROY
         '// Free up your resources there
    CASE ELSE
        nRet = BBP_ERROR
    END SELECT
    FUNCTION = nRet
END FUNCTION

Conclusion :


Comme ce site n'accepte pas les ZIP de plus de 1 Mo et que le projet complet fait 2880 Ko, vous pouvez télécharger la version complète en utilisant le lien vers le forum de José roca qui figure au début de cet article ou en cliquant sur le lien direct qui figure ci-dessous :
http://www.zapsolution.com/BassBox/BassBox.zip


Patrice Terrier
www.zapsolution.com

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.