質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Web Audio

Web Audioは、音声を処理・合成するためのWebアプリケーション向けJavaScript APIです。HTML5から導入されました。オーディオソースの選択、エフェクト・ビジュアライゼーションの追加、パンニングなど特殊効果の適用など多くの機能を持ちます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1764閲覧

ブラウザで音声入力をリアルタイムに可視化するサイトを作りたい

cfds

総合スコア4

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Web Audio

Web Audioは、音声を処理・合成するためのWebアプリケーション向けJavaScript APIです。HTML5から導入されました。オーディオソースの選択、エフェクト・ビジュアライゼーションの追加、パンニングなど特殊効果の適用など多くの機能を持ちます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2021/10/06 09:24

前提・実現したいこと

ブラウザで音声入力をリアルタイムに可視化するサイトを作りたいと考えていて、サンプルコードを実行しました。

発生している問題

for文の後の式が理解できません。
valueは何を表しているのでしょうか?consoleに表示させると128と出てきました。
またこの4行の式の意味を教えていただけると幸いです。

const value = array[i];
const percent = value / 255;
const height = ch * percent;
const offset = ch - height;

該当のソースコード

言語:JavaScript/jQuery/html

<body> <canvas id="canvas"></canvas> <div> <button id="start">録音開始</button> <button id="stop" disabled>録音終了</button> </div> <script> const start = document.querySelector('#start'); const stop = document.querySelector('#stop'); const canvas = document.querySelector('#canvas'); const drawContext = canvas.getContext('2d'); const cw = canvas.width; const ch = canvas.height; let mediaRecorder = null; let mediaStream = null; start.addEventListener('click', () => { start.disabled = true; stop.disabled = false; const chunks = []; mediaRecorder = new MediaRecorder(mediaStream, { mimeType: 'audio/webm' }); mediaRecorder.addEventListener('dataavailable', e => { if (e.data.size > 0) { chunks.push(e.data); } }); mediaRecorder.addEventListener('stop', () => { const a = document.createElement('a'); a.href = URL.createObjectURL(new Blob(chunks)); a.download = 'test.webm'; a.click(); }); mediaRecorder.start(); }); stop.addEventListener('click', () => { if (mediaRecorder === null) { return; } start.disabled = false; stop.disabled = true; mediaRecorder.stop(); mediaRecorder = null; }); navigator.mediaDevices.getUserMedia({ audio: true }).then(stream => { mediaStream = stream; const audioContext = new AudioContext(); const sourceNode = audioContext.createMediaStreamSource(stream); const analyserNode = audioContext.createAnalyser(); analyserNode.fftSize = 2048; sourceNode.connect(analyserNode); function draw() { const array = new Uint8Array(analyserNode.fftSize); analyserNode.getByteTimeDomainData(array); const barWidth = cw / analyserNode.fftSize; drawContext.fillStyle = 'rgba(0, 0, 0, 1)'; drawContext.fillRect(0, 0, cw, ch); for (let i = 0; i < analyserNode.fftSize; ++i) { const value = array[i]; const percent = value / 255; const height = ch * percent; const offset = ch - height; drawContext.fillStyle = 'lime'; drawContext.fillRect(i * barWidth, offset, barWidth, 2); } requestAnimationFrame(draw); } draw(); }).catch(error => { console.log(error); }); </script> <style> canvas { width: 100%; height: 256px; } button { padding: 0.5em 1em; border-width: 0; border-radius: 0.25em; font-size: 1em; background-color: #dfdfdf; color: #333; } button[disabled] { color: #aaa; } </style> </body>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

言葉で説明するより図で説明した方が分かりやすいかと思い図を描いてみました。

画像で説明

javascript

1const value = array[i]; // array は音データの配列(0~2048)。1つの音は0~255で表される。 2const percent = value / 255; // 0~255 をパーセント(0~100%)で表現。128の場合は50%(0.5)で表現。 3const height = ch * percent; // ch は canvas の高さ。プロットするY座標の位置を算出。 4const offset = ch - height; // Canvas は左下ではなく 左上が (0,0) 原点である為、上下を反転

投稿2021/10/06 15:18

cx20

総合スコア4633

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cfds

2021/10/09 09:32

画像に説明を書いてくださり、ありがとうございます! とても分かりやすかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問