File: spectrum.html

package info (click to toggle)
gr-framework 0.73.14%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 11,600 kB
  • sloc: ansic: 87,413; cpp: 45,348; objc: 3,057; javascript: 2,647; makefile: 1,129; python: 1,000; sh: 991; yacc: 855; pascal: 554; fortran: 228
file content (105 lines) | stat: -rw-r--r-- 3,719 bytes parent folder | download
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<!doctype html>
<html lang="en-us">

<head>
    <meta charset="utf-8">
</head>

<body>

    <canvas id="canvas" width="500" height="500"></canvas>
    <script type="text/javascript" src="gr.js"></script>

    <script type="text/javascript">
        var gr = new GR(gr);

        var audioCtx = new(window.AudioContext || window.webkitAudioContext)();
        // fork getUserMedia for multiple browser versions, for those
        // that need prefixes

        navigator.getUserMedia = (navigator.getUserMedia ||
            navigator.webkitGetUserMedia ||
            navigator.mozGetUserMedia ||
            navigator.msGetUserMedia);

        var fs = 44100;
        var SAMPLES = 4096;

        var f = new Array(Math.floor(SAMPLES / 2));
        for (var j = 0; j < Math.floor(SAMPLES / 2); j++) {
            f[j] = fs / SAMPLES * j;
        }

        function parabolic(x, f, i) {
            var xe = 1 / 2. * (f[i - 1] - f[i + 1]) / (f[i - 1] - 2 * f[i] + f[i + 1]) + x;
            var ye = f[i] - 1 / 4. * (f[i - 1] - f[i + 1]) * (xe - x);
            var result = new Array(2);
            result[0] = xe;
            result[1] = ye;
            return result;
        }

        function startRecord() {
            navigator.getUserMedia(
                // constraints: audio and video for this app
                {
                    audio: true,
                    video: false
                },
                // Success callback
                function(stream) {
                    // Create a MediaStreamAudioSourceNode
                    // Feed the HTMLMediaElement into it
                    var source = audioCtx.createMediaStreamSource(stream);
                    window.source = source;
                    // Create a biquadfilter
                    var analyser = audioCtx.createAnalyser();
                    analyser.fftSize = 4096;
                    var bufferLength = analyser.frequencyBinCount;
                    console.log(bufferLength);
                    var dataArray = new Uint8Array(bufferLength);
                    source.connect(analyser);

                    function analyze() {
                        requestAnimationFrame(analyze);
                        analyser.getByteFrequencyData(dataArray);
                        console.log('.');
                        gr.clearws();
                        gr.setviewport(0.1, 0.95, 0.1, 0.95);
                        gr.setwindow(50, 23000, 0, 255);
                        gr.setscale(1);
                        gr.setlinewidth(1);
                        gr.setlinecolorind(1);
                        gr.grid(1, 10, 50, 0, 1, 2);
                        gr.axes(1, 10, 50, 0, 1, 2, -0.008);
                        gr.setcharheight(0.020);
                        gr.text(0.47, 0.965, "1 kHz");
                        gr.text(0.15, 0.965, '100 Hz');
                        gr.text(0.79, 0.965, '10 kHz');
                        gr.setlinecolorind(4);
                        gr.polyline(dataArray.length - 2, f.slice(1, dataArray.length - 1), dataArray.slice(1, dataArray.length - 1));
                        gr.updatews();
                    }
                    analyze();
                },

                // Error callback
                function(err) {
                    console.log('The following gUM error occured: ' + err);
                }
            );

        }

        GR.ready(function() {
            if (navigator.getUserMedia) {
                console.log('getUserMedia supported.');
                startRecord();
            } else {
                console.log('getUserMedia not supported on your browser!');
            }
        });
    </script>
</body>

</html>