Jouer plusieurs notes de musique avec un seul son

Retrouvez ici la doc et les guides en français pour vous aider.
Avatar du membre
joqlepecheur
Contact :
Messages : 35
Enregistré le : mar. 11 avr. 2017 16:59

Jouer plusieurs notes de musique avec un seul son

lun. 22 mai 2017 22:21

Bonjour amis musiciens et néophytes,

Pour mon dernier projet, j'ai beaucoup joué avec une fonction de GameMaker :
audio_sound_pitch(index_de_votre_son, pitch_to_set)

Cette fonction permet de jouer un son plus ou moins rapidement et est souvent utilisée pour mettre un peu de variété dans vos sons, bruit de pas entre autres.
Changer la vitesse, c'est rendre plus aigu ou plus grave un son.

J'ai décidé de pousser un peu plus le concept, et de jouer une note spécifique en modulant le pitch (c'est le concept des logiciels de module).
Et à vrai dire, c'est plus simple que ça en à l'air.

Un octave se définit ainsi (en très simplifié):
- le son est une vibration ayant une fréquence "fondamentale"
- considérons deux sons distincts, la note la plus aiguë à une fréquence 2x plus élevée que la note la plus grave

Moralité, pour que GameMaker utilise le même son un octave plus haut ou plus bas, il faut utiliser une valeur de pitch shifting de 2 ou 0.5
Le LA du diapason est bien connu pour sa fréquence de 440 le LA de l'octave supérieur à une fréquence de 880, 220 pour l'octave inférieur.

Imaginons un octave allant de DO à DO
=>DO RE MI FA SOL LA SI DO
La gamme musicale simplifiée (ou l'on considère que dièse == bémol j'y reviendrais) comporte en réalité les notes suivantes:
=>DO DO# (dièse) RE RE# MI FA FA# SOL SOL# LA LA# SI DO
Vous remarquerez qu'il n'y a pas de dièse après le RE et le SI.

Maintenant, comment cela se traduit-il au niveau du pitch ? C'est encore très simple:
On considère qu'il y a 12 intervalles séparant équitablement chaque note, donc le coefficient multiplicateur entre deux notes est de 1.05946 puisque le coefficient multiplicateur entre deux octaves est de 2
Les notes qui se suivent sont séparées par un coefficient de 1.05946 entre DO et DO#, puis DO# et RE, RE et RE#, RE# et MI, MI et FA, etc.

Si votre son enregistré dans GameMaker est un DO et que vous voulez jouer un MI:
- pitch de mi par rapport à do, donc 4 intervalles de distance DO-DO#-RE-RE#-MI
- pitch pour jouer un mi = 1.05946 puissance 4
- 1.25990

En tenant compte de ces valeurs, vous pouvez basculer un son d'ambiance ou un effet sonore de manière mélodieuse !
Bien sur plutôt que faire des puissances de dingo entre deux notes très éloignées, par exemple DO et un RE de l'octave supérieur séparés par 14 intervalles, faites 2*1.05946*1.05946

La musique est bien sûr potentiellement beaucoup plus complexe, ainsi l'intervalle peut être légèrement changé pour favoriser un son plus harmonieux ou avec une personnalité un peu différente. Do# n'étant pas exactement l'égal de MIb. La norme la plus répandue veut que deux notes DO et RE soient séparées par 9 "comas" (autre intervalle plus petit), un dièse étant 5 comas au dessus d'une note et un bémol 4 comas en dessous.
Il existe ainsi des intervalles "justes" qui se basent sur des fractions très précises, mais bon allez fouiner si vous êtes à l'aise avec ce qui précède.

Voilà le site qui m'a beaucoup aidé et qui pousse beaucoup plus l'explication pour les curieux. Il y a même directement les valeurs qui séparent les notes.
http://www.phy.mtu.edu/~suits/notefreqs.html

Quel est l'intérêt ?
Jouer plusieurs sons correspondants à des notes spécifiques, le tout avec un seul son enregistré dans votre projet !
Vous pourrez aisément concevoir un script à 2 arguments (je mets un truc à l'arrache, vous pouvez faire plus malin):

Code : Tout sélectionner

/*
scr_note
argument0 = sound_to_play
argument1 = note to play
*/
var pitch_to_set ; pitch_to_set = 1 ;
switch(argument1)
{
	case 0: pitch_to_set = 1 ; break ;
	case 1: pitch_to_set = 1.05946 ; break ;
	case 2 : pitch_to_set = 1.12246 ; break ;
	case 12 : pitch_to_set = 2
}
audio_sound_pitch(argument0, pitch_to_set) ;
if audio_is_playing(argument0)
{
	audio_stop_sound(argument0) /* à vous de voir ce que vous voulez si le son joue déjà, 
	changer sa hauteur ou l'arrêter pour jouer un nouveau à la nouvelle hauteur car changer le pitch s'applique à tous les sons à cet index actuels ou futurs */
}
audio_play_sound(argument0, priority, loops) //priority à vous de voir, et loops true or false)
exit ;
Voilà, n'hésitez pas si vous voulez des éclairages !
Modifié en dernier par joqlepecheur le mar. 23 mai 2017 11:34, modifié 1 fois.
Avatar du membre
Hephep
Messages : 157
Enregistré le : dim. 11 sept. 2016 14:21

Re: Jouer plusieurs notes de musique avec un seul son

mar. 23 mai 2017 08:08

Ah cool, super utile ça, pour décliner des sons sans bricoler dans des logiciels! Excellent tutos.
Avatar du membre
victor000_1
Contact :
Messages : 32
Enregistré le : dim. 13 nov. 2016 11:41

Re: Jouer plusieurs notes de musique avec un seul son

mar. 23 mai 2017 08:35

Je n'en suis pas encore à l'intégration sonore mais c'est très intéressant à lire.

Ça me fait penser à un effet qui était très sympas dans "hyper light drifter" au moment de sélectionner le nom de son personnage et qui doit découler d'une technique similaire.

En tout cas, merci pour ce tutoriel. Il est très complet et bien détaillé :)
Avatar du membre
Leifer
Contact :
Localisation : Occitanie
Messages : 317
Enregistré le : ven. 9 sept. 2016 13:30

Re: Jouer plusieurs notes de musique avec un seul son

mar. 23 mai 2017 11:15

Excellent tutoriel :) ça donne plein d'idée d'utilisation :D et surtout ça allège le poids du jeu :D
Avatar du membre
joqlepecheur
Contact :
Messages : 35
Enregistré le : mar. 11 avr. 2017 16:59

Re: Jouer plusieurs notes de musique avec un seul son

mar. 23 mai 2017 11:52

Merci !

N'hésitez pas à partager vos utilisations :)

Deux cas pratiques si vous voulez vous amuser à manipuler un peu le son:

1)
-ingrédient requis: une musique pour un niveau, un peu grave et posée et un petit jingle
-quand la musique est finie, jouez un petit jingle
-rejouez la même musique avec un pitch x2
=> cheap super mario bros style

2)
-ingrédient requis: dans un menu, un son est utilisé quand le curseur bouge
-à chaque fois que le curseur bouge:

Code : Tout sélectionner

var i ; i = irandom(3)
var pitch_shift ; pitch_shift = 1 ;
if i == 1 pitch_shift = 1.25 ;
if i == 2 pitch_shift = 1.5 ;
if i == 3 pitch_shift = 2 ;
if audio_is_playing(votre_son) audio_stop_sound(votre_son) ;
audio_sound_pitch(votre_son, pitch_shift) ;
audio_play_sound(votre_son, 20, false) ;
=> menu mélodique pas cher

Retourner vers « [GameMaker] Guides & Tutoriels »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité