Maison interface Web js tutoriel Comment utiliser Canvas de H5 pour dessiner un spectrogramme circulaire musical

Comment utiliser Canvas de H5 pour dessiner un spectrogramme circulaire musical

Mar 12, 2018 pm 03:11 PM
canvas html5 音乐

Cette fois, je vais vous montrer comment dessiner un spectrogramme d'anneau musical à l'aide du Canvas de H5. Quelles sont les précautions pour dessiner un spectrogramme d'anneau musical à l'aide de H5Canvas. cas. Jetons un coup d’oeil.

Beaucoup de nos amis de Station B ont dû voir la vidéo montrant l'utilisation du lecteur de musique visuel créé par AE pour jouer de la musique. Cela a l'air très cool et excitant.

Comment utiliser Canvas de H5 pour dessiner un spectrogramme circulaire musical

Aujourd'hui, je vais donc utiliser Canvas pour créer un simple spectrogramme en anneau.

Alors~ ヾ(o・ω・)ノ Commençons !

1. Dessinez d'abord l'effet de statique

effet statique

Dessiner l'effet statique est très simple. Il suffit de partir d'un point. et tracez des lignes sous un certain angle. Tracez ensuite un cercle pour couvrir la ligne en partant du milieu

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<canvas id="wrap" height="800" width="800"></canvas><script>

    var wrap = document.getElementById("wrap");    var cxt = wrap.getContext("2d");

    (function drawSpectrum() {

        cxt.clearRect(0, 0, wrap.width, wrap.height);        //画线条

        for (var i = 0; i < 360; i++) {            var value = 8;

            cxt.beginPath();

            cxt.lineWidth = 2;

            cxt.moveTo(300, 300);             //R * cos (PI/180*一次旋转的角度数) ,-R * sin (PI/180*一次旋转的角度数)

            cxt.lineTo(Math.cos((i * 1) / 180 * Math.PI) * (200 + value) + 300, (- Math.sin((i * 1) / 180 * Math.PI) * (200 + value) + 300));

            cxt.stroke();

        }        //画一个小圆,将线条覆盖

        cxt.beginPath();

        cxt.lineWidth = 1;

        cxt.arc(300, 300, 200, 0, 2 * Math.PI, false);

        cxt.fillStyle = "#fff";

        cxt.stroke();

        cxt.fill();

    })();</script>

Copier après la connexion

2. Appelez AudioAPI pour dessiner le spectrogramme de la musique

Dessinez le spectrogramme de la musique

Étape 1 Une fois terminée, la deuxième étape est très simple Modifiez la longueur de la ligne en appelant l'AudioAPI pour obtenir les modifications audio.

Attention ! ! ! Le dernier navigateur Chrome devra peut-être s'exécuter sur un serveur http~

Vous pouvez vous référer à l'article pour dessiner le spectrogramme de la musique (à l'aide du nœud Analyseur)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

<input type="button" onclick="audio.play()" value="播放" /><input type="button" onclick="audio.pause()" value="暂停" /><canvas id="wrap" height="800" width="800"></canvas><script>

    var wrap = document.getElementById("wrap");    var cxt = wrap.getContext("2d");    //获取API

    var AudioContext = AudioContext || webkitAudioContext;    var context = new AudioContext;    //加载媒体

    var audio = new Audio("demo.mp3");    //创建节点

    var source = context.createMediaElementSource(audio);    var analyser = context.createAnalyser();    //连接:source → analyser → destination

    source.connect(analyser);

    analyser.connect(context.destination);    //创建数据

    var output = new Uint8Array(360);

    (function drawSpectrum() {

        analyser.getByteFrequencyData(output);//获取频域数据

        cxt.clearRect(0, 0, wrap.width, wrap.height);        //画线条

        for (var i = 0; i < 360; i++) {            var value = output[i] / 8;//<===获取数据

            cxt.beginPath();

            cxt.lineWidth = 2;

            cxt.moveTo(300, 300);            //R * cos (PI/180*一次旋转的角度数) ,-R * sin (PI/180*一次旋转的角度数)

            cxt.lineTo(Math.cos((i * 1) / 180 * Math.PI) * (200 + value) + 300, (- Math.sin((i * 1) / 180 * Math.PI) * (200 + value) + 300));

            cxt.stroke();

        }        //画一个小圆,将线条覆盖

        cxt.beginPath();

        cxt.lineWidth = 1;

        cxt.arc(300, 300, 200, 0, 2 * Math.PI, false);

        cxt.fillStyle = "#fff";

        cxt.stroke();

        cxt.fill();        //请求下一帧

        requestAnimationFrame(drawSpectrum);

    })();</script>

Copier après la connexion

Gauche synchrone. et affichage à droite de l'anneau

Après avoir pratiqué l'étape 2, vous avez en fait fait plus de la moitié, mais les amis prudents constateront qu'il y a beaucoup de différence entre les lignes à l'extrémité droite de l'anneau.

Il existe de nombreuses façons de le gérer. Nous utilisons l'un des moyens les plus simples pour le gérer, qui consiste à le faire afficher symétriquement.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

<input type="button" onclick="audio.play()" value="播放" /><input type="button" onclick="audio.pause()" value="暂停" /><canvas id="wrap" height="550" width="800"></canvas><script>

    var wrap = document.getElementById("wrap");    var cxt = wrap.getContext("2d");    //获取API

    var AudioContext = AudioContext || webkitAudioContext;    var context = new AudioContext;    //加载媒体

    var audio = new Audio("demo.mp3");    //创建节点

    var source = context.createMediaElementSource(audio);    var analyser = context.createAnalyser();    //连接:source → analyser → destination

    source.connect(analyser);

    analyser.connect(context.destination);    //创建数据

    var output = new Uint8Array(361);

    (function drawSpectrum() {

        analyser.getByteFrequencyData(output);//获取频域数据

        cxt.clearRect(0, 0, wrap.width, wrap.height);        //画线条

        for (var i = 0; i < output.length; i++) {            var value = output[i] / 10;            //绘制左半边

            cxt.beginPath();

            cxt.lineWidth = 1;

            cxt.moveTo(300, 300);

            cxt.lineTo(Math.cos((i *0.5 + 90) / 180 * Math.PI) * (200 + value) + 300, (- Math.sin((i *0.5 + 90) / 180 * Math.PI) * (200 + value) + 300));

            cxt.stroke();            //绘制右半边

            cxt.beginPath();

            cxt.lineWidth = 1;

            cxt.moveTo(300, 300);

            cxt.lineTo( (Math.sin((i *0.5) / 180 * Math.PI) * (200 + value) + 300),-Math.cos((i *0.5) / 180 * Math.PI) * (200 + value) + 300);

            cxt.stroke();

        }        //画一个小圆,将线条覆盖

        cxt.beginPath();

        cxt.lineWidth = 1;

        cxt.arc(300, 300, 200, 0, 2 * Math.PI, false);

        cxt.fillStyle = "#fff";

        cxt.stroke();

        cxt.fill();        //请求下一帧

        requestAnimationFrame(drawSpectrum);

    })();</script>

Copier après la connexion

4. Ajouter un graphique de forme d'onde

Essayons enfin d'ajouter un graphique de forme d'onde dans le cercle

Vous pouvez vous référer à l'article pour dessiner le graphique de forme d'onde de musique (en utilisant Analyzer Node)

Exemple

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

<input type="button" onclick="audio.play()" value="播放" /><input type="button" onclick="audio.pause()" value="暂停" /><canvas id="wrap" height="550" width="800"></canvas><script>

    var wrap = document.getElementById("wrap");    var cxt = wrap.getContext("2d");    //获取API

    var AudioContext = AudioContext || webkitAudioContext;    var context = new AudioContext;    //加载媒体

    var audio = new Audio("demo.mp3");    //创建节点

    var source = context.createMediaElementSource(audio);    var analyser = context.createAnalyser();    //连接:source → analyser → destination

    source.connect(analyser);

    analyser.connect(context.destination);    //创建数据

    var output = new Uint8Array(361);    //计算出采样频率44100所需的缓冲区长度

    var length = analyser.frequencyBinCount * 44100 / context.sampleRate | 0;    //创建数据

    var output2 = new Uint8Array(length);

    (function drawSpectrum() {

        analyser.getByteFrequencyData(output);//获取频域数据

        cxt.clearRect(0, 0, wrap.width, wrap.height);        //画线条

        for (var i = 0; i < output.length; i++) {            var value = output[i] / 10;            //绘制左半边

            cxt.beginPath();

            cxt.lineWidth = 1;

            cxt.moveTo(300, 300);

            cxt.lineTo(Math.cos((i * 0.5 + 90) / 180 * Math.PI) * (200 + value) + 300, (- Math.sin((i * 0.5 + 90) / 180 * Math.PI) * (200 + value) + 300));

            cxt.stroke();            //绘制右半边

            cxt.beginPath();

            cxt.lineWidth = 1;

            cxt.moveTo(300, 300);

            cxt.lineTo((Math.sin((i * 0.5) / 180 * Math.PI) * (200 + value) + 300), -Math.cos((i * 0.5) / 180 * Math.PI) * (200 + value) + 300);

            cxt.stroke();

        }        //画一个小圆,将线条覆盖

        cxt.beginPath();

        cxt.lineWidth = 1;

        cxt.arc(300, 300, 200, 0, 2 * Math.PI, false);

        cxt.fillStyle = "#fff";

        cxt.stroke();

        cxt.fill();        //将缓冲区的数据绘制到Canvas上

        analyser.getByteTimeDomainData(output2);        var height = 100, width = 400;

        cxt.beginPath();        for (var i = 0; i < width; i++) {

            cxt.lineTo(i + 100, 300 - (height / 2 * (output2[output2.length * i / width | 0] / 256 - 0.5)));

        }

        cxt.stroke();        //请求下一帧

        requestAnimationFrame(drawSpectrum);

    })();</script>

Copier après la connexion

Je pense que vous maîtrisez la méthode après avoir lu le cas dans cet article. Pour des informations plus intéressantes, veuillez prêter attention aux autres articles connexes sur. le site PHP chinois !

Lecture connexe :

Comment utiliser la toile pour créer une planche à dessin de graffitis utile

Comment utiliser s-xlsx pour mettre en œuvre l'importation et l'exportation de fichiers Excel (Partie 2)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
4 Il y a quelques semaines By DDD
Musée à deux points: toutes les expositions et où les trouver
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Tableau imbriqué en HTML Tableau imbriqué en HTML Sep 04, 2024 pm 04:49 PM

Ceci est un guide des tableaux imbriqués en HTML. Nous discutons ici de la façon de créer un tableau dans le tableau ainsi que des exemples respectifs.

Bordure de tableau en HTML Bordure de tableau en HTML Sep 04, 2024 pm 04:49 PM

Guide de la bordure de tableau en HTML. Nous discutons ici de plusieurs façons de définir une bordure de tableau avec des exemples de bordure de tableau en HTML.

Marge gauche HTML Marge gauche HTML Sep 04, 2024 pm 04:48 PM

Guide de la marge HTML gauche. Nous discutons ici d'un bref aperçu de la marge gauche HTML et de ses exemples ainsi que de son implémentation de code.

Disposition du tableau HTML Disposition du tableau HTML Sep 04, 2024 pm 04:54 PM

Guide de mise en page des tableaux HTML. Nous discutons ici des valeurs de la mise en page des tableaux HTML ainsi que des exemples et des résultats en détail.

Liste ordonnée HTML Liste ordonnée HTML Sep 04, 2024 pm 04:43 PM

Guide de la liste ordonnée HTML. Ici, nous discutons également de l'introduction de la liste et des types HTML ordonnés ainsi que de leur exemple respectivement.

Déplacer du texte en HTML Déplacer du texte en HTML Sep 04, 2024 pm 04:45 PM

Guide pour déplacer du texte en HTML. Nous discutons ici d'une introduction, du fonctionnement des balises de sélection avec la syntaxe et des exemples à implémenter.

Espace réservé d'entrée HTML Espace réservé d'entrée HTML Sep 04, 2024 pm 04:54 PM

Guide de l'espace réservé de saisie HTML. Nous discutons ici des exemples d'espace réservé d'entrée HTML ainsi que des codes et des sorties.

Bouton HTML onclick Bouton HTML onclick Sep 04, 2024 pm 04:49 PM

Guide du bouton HTML onclick. Nous discutons ici de leur introduction, de leur fonctionnement, des exemples et de l'événement onclick dans divers événements respectivement.

See all articles