ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Swan's Quest 第2章:音の時間
Swift Playgroundsはすべての世代に向けて4章から成るインタラクティブな冒険、"Swan's Quest"をお届けします。第2章では、ヒーローがSwan's scrollでデコーディングするのを助けてもらいたがっています。あなたの持てる最大の音声能力を呼び起こしてください。きっと必要になります。 Swift PlaygroundsをTone Generatorにコンバートする方法を見つけましょう。そうすればあなたは、ヒーローが失われたメッセージを見つけ・・・次のクエストへと向かう手助けができるかもしれません。 Swan's QuestはiPadとMacのSwift Playgroundsのために作成されており、Sonic Workshop、Sensor Arcade、Augmented RealityなどのPlaygroundsの多くで教育的体験を生むフレームワークとリソースを統合しています。Playgroundを作成するには、"Create Swift Playgrounds content for iPad and Mac"をご覧ください。 Developer Forumに立ち寄るのも忘れずに。Swan's Questへのご意見をぜひお聞かせください。
リソース
関連ビデオ
WWDC20
-
ダウンロード
こんにちは WWDCへようこそ “Swan's Quest 第2章:音の時間” こんにちは Swan's Questへようこそ 司会のロブです 旅の第2章の内側をご案内します 第1回のチャレンジは お楽しみいただけましたか アクセシブルなインターフェイスについて 少し学びました 第2章では トカゲのところへ戻り― スワンの巻物の謎解きを 手伝ってもらいます 見てのお楽しみですが― このチャレンジをクリアするには スワンのために 一連の 音を奏でる必要があるとだけお伝えします
音を演奏するための 2種類のAPIをご紹介します ToneOutputとTimerです 十分詳しく見ていきますので― スワンにアピールできるでしょう 最後は サイドクエストで― もっとアドベンチャーを お楽しみいただけます まず 音を演奏する方法について お話ししましょう 使うのは ToneOutputタイプです ToneOutputは Sonic Workshopでご紹介しました Sonic Createにも入っていますので 皆さんのプロジェクトでも使えます ToneOutputを 詳しく見てみましょう ToneOutputタイプには 分かりやすいAPIがあります トーンの値から生成された 信号を演奏するものです 1秒間に44100回の サンプリングを行います これで 別々のパルスではなく 連続した音に聞こえるのです 主要なインスタンスメソッドの play(tone:)を 呼び出して 信号を作成します
トーンの定義も 等しく 分かりやすいものです ピッチはDoubleで表される周波数です ボリュームもDoubleで表記されます
実際にはこのようになります この例では ToneOutputのインスタンスを作成し― これに 440Hzの周波数 すなわち 基本の“ラ”である “middleA”を渡します このコードをPlaygroundで実行すると トーンが聞こえます 緊急放送システムのような感じです Playgroundのコードを停止するまで ずっと鳴り続けます スティーブンと一緒に 複数の音を演奏する方法を見てみましょう
ありがとう ロブ 説明があったように ToneOutputのサンプルは 連続して再生され― 停止するまで続きます ToneOutputインスタンスを― 停止するには stopTonesを呼び出します
この例では DispatchasyncAfterを 呼び出しています これが stopTonesを 400ミリ秒後に呼び出します 音は短時間再生され その後停止します このアプローチは 複数の音を 演奏するときには機能しません
timerの使用をお勧めします より分かりやすいAPIで― あらかじめ決められた間隔で ループを繰り返すのが簡単です 例を更新して 複数の音を 演奏してみましょう
ここで“middle A”“middle B” そして“middle C”の周波数を設定しました これらを順番に 連続して 再生するには timerを使います トーンの配列をイテレートして― 400ミリ秒ごとに 次の音を演奏します 配列の最後まで来たら ToneOutputでstopTonesを呼び出し― タイマーを無効化して 繰り返しを停止します
最後に endPerformanceを 呼び出して― 課題を完成させます この呼び出しは 残りのチャレンジでも 同じように使い 演奏が終わったことを スワンに知らせます 以上が タイマーを使って 連続して複数の異なる音を― 演奏する方法です
ありがとう スティーブン 先へ進む前に 私からご忠告
このサイドクエストには チャレンジの ネタバレがあります 先にチャレンジを完成させたい皆さんは ビデオを一時停止して― チャレンジが完成してから 再開してください 幸運を!
では サイドクエストを 行う準備はできましたか? スワンのチャレンジは Cメジャースケールの演奏で 周波数はすべて 与えられていましたね そのコードを適用して Fメジャースケールを 演奏できるか見てみましょう 考えてみると すでに必要な周波数は たくさん手に入れています まず Fメジャースケールは F4で開始します この音は スワンからもらいました 次に Cメジャースケールから コードを再利用できます 最後に 1オクターブ上げる場合は 周波数を2倍にします つまり A5はA4から計算できます 440Hzを2倍して 880Hzです “Bフラットの周波数” そうでした Bフラットの 周波数も必要でしたね
このエピソードでは― Swan's Questの2回目のチャレンジの ヒントを差し上げました ToneOutputをご紹介し― Swift Playgroundsにおいて 周波数で ピッチを演奏する方法を学びました 次に timerを使って一定の時間の長さで 音を変更する方法を説明しました 明日は 注目のチャレンジです 見逃さないでくださいね 幸運を祈ります そしてぜひ― フォーラムに参加して 皆さんの サイドクエストの答えを共有してください お待ちしています
-
-
1:09 - ToneOutput.swift
// ToneOutput.swift public class ToneOutput : AURenderCallbackDelegate { let sampleRate = 44100.0 public func play(tone: Tone) { /**/ } public func stopTones() { /**/ } // ... }
-
1:30 - Inside the Tone type
// ToneOutput.swift public struct Tone: Codable { public var pitch: Double public var volume: Double // ... }
-
1:45 - Play a middle A
// Play a middle A import SPCAudio let toneOutput = ToneOutput() let middleA = Tone(pitch: 440.0, volume: 0.3) toneOutput.play(tone: middleA)
-
2:21 - Play a middle A for 0.5 seconds
// Play a middle A import SPCAudio let toneOutput = ToneOutput() let a4 = Tone(pitch: 440.0, volume: 0.3) toneOutput.play(tone: a4) DispatchQueue.main.asyncAfter(deadline: .now() + DispatchTimeInterval.milliseconds(400)) { toneOutput.stopTones() }
-
2:51 - Play more than one tone
// Play more than one tone let toneOutput = ToneOutput() let tones = [ Tone(pitch: 440.00, volume: 0.3), Tone(pitch: 493.88, volume: 0.3), Tone(pitch: 523.25, volume: 0.3) ] var toneIndex = 0 Timer.scheduledTimer(withTimeInterval: 0.4, repeats: true) { timer in guard toneIndex < tones.count else { toneOutput.stopTones() timer.invalidate() owner.endPerformance() return } toneOutput.play(tone: tones[toneIndex]) toneIndex += 1 }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。