DTMF — DTMF と自作アプリの軌跡 #yidev

378 Views

June 23, 13

スライド概要

DTMF の基本を、それにまつわる自作アプリの軌跡と絡めて、2013/06/22 に開催された yidev@渋谷勉強会 第一回 で発表してきました。

※ Docswell での公開に移行する直前の Slideshare での閲覧数は 4,582 でした。

profile-image

正統派趣味人プログラマー。プログラミングとは幼馴染です。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

DTMF - Dual-Tone Multi-Frequency - 〜 DTM Fと 自作ア プリ の軌跡 〜 EZ-‐‑‒NET  熊⾕谷友宏 @EasyStyleGK http://program.station.ez-‐‑‒net.jp/

2.

⾃自⼰己紹介 EZ-‐‑‒NET  熊⾕谷友宏 http://program.station.ez-‐‑‒net.jp/ @EasyStyleGK iOS  アプリ 制作中 EZ-‐‑‒NET  IP  Phone ⾳音で再配達ゴッド ⾳音で再配達 ⾳音でダイヤル いつもの電卓 for  iPad いつもの電卓 for  iPhone

3.

これらのアプリにまつわるお話 EZ-‐‑‒NET  IP  Phone ⾳音で再配達ゴッド ⾳音で再配達 ⾳音でダイヤル いつもの電卓 for  iPad いつもの電卓 for  iPhone

4.

テーマは DTMF

5.

はじまり 題⽬目 1. DTMF  との出逢い 2. アイデアとの出逢い 3. そして神アプリへ

6.

第1章 DTMF との出逢い

7.

電話アプリを制作していたときのこと • 通話中の番号ボタンが必要になる • 番号ボタンといえば ピ・ポ・パ • ピ・ポ・パ といえば DTMF

8.

何気なく使っている DTMF そういえば どうやって送ってるの? ⾳音としてそのまま送信

9.

DTMF  ってどんな⾳音? 特徴 1. ふたつの正弦波で構成される⾳音 2. 正弦波の組み合わせによって 0 ~∼  9,  #,  *,  A ~∼  D と呼ばれる 3. 秒間 8  数字以上の転送が可能

10.

DTMF  ってどんな⾳音? 送信のルール 1. ひとつの⾳音の⻑⾧長さは 最低 50ms  以上(信号送出時間) 2. ⾳音と⾳音の間は間隔を開ける 最低 30ms  以上(ミニマムポーズ) 3. 信号送出時間とミニマムポーズで 合計 120ms  以上の時間を取ること

11.

DTMF  ってどんな⾳音? 正弦波の組み合わせ ⾼高群 1209 697 低 群 ㎐ 770 852 941 1336 ㎐ 1477 1633

12.

DTMF  ⾳音を作る 正弦波の基本形 y=sinθ  で表現される波形 y θ 1周期は 2π 範囲は -1 から +1

13.

DTMF  ってどんな⾳音? θ  はラジアン単位の⾓角度度 1. 弧の長さで角度を表現する方法 2. 半径 1  の円で、弧の⻑⾧長さが 1  になるときの⾓角度度が 1  ラジアン 3. 半円の弧の⻑⾧長さを π と定義する • 180° は π ラジアン • 半分の 90 ならπ/2 1 1 1

14.

DTMF  ってどんな⾳音? πは円周率率率と呼ぶ 1. 半径が1の半円の弧の⻑⾧長さ 2. 半径倍すればその円の弧の⻑⾧長さ 3. π= 3.14159 26535 89793 … π 1

15.

DTMF  ってどんな⾳音? sin 関数 1. 半径が 1  の円における 引数の⾓角度度が作る弧の y  座標 • θ=0π(0 ) は y=0 • θ=π/2 (90 ) のときは y=1 2. 半径 1 の単位円なので y は -1 から 1 になる 3. θ=2π(360 )で 1周して元に戻る(2π周期) y θ 1

16.

DTMF  ⾳音を作る 周波数 1Hz  とは 1  秒間に 1  周期が現れる波形 y 1秒 θ 1周期は 2π 範囲は -1 から +1

17.

DTMF  ⾳音を作る 周波数が 770Hz  なら 1  秒間に 770  周期の波形 つまり 1/770  秒で 1  周期の波形 y 1/770  秒 θ 1周期は 2π 範囲は -1 から +1

18.

DTMF  ⾳音を作る 770Hz  の正弦波を式で表すと y=sin(770×θ)   y 1/770  秒 θ 1周期は 2π/770

19.

DTMF  ⾳音を作る DTMF  の ʻ‘5ʼ’  を鳴らしたいなら 770Hz と 1336Hz の 正弦波を合成する

20.

何気なく使っている DTMF 正弦波って どうやって合成するの? それぞれを計算して 普通に⾜足し合わせるだけ

21.

DTMF  ⾳音を作る つまり y  =  sin(770×θ)  +  sin(1336×θ) y θ 範囲は最大でも -2 から +2

22.

DTMF  ⾳音を作る このようにして DTMF  波形は作られている

23.

DTMF  ⾳音の再⽣生⽅方法 DTMF  波形の 再⽣生⽅方法

24.

DTMF  ⾳音の再⽣生⽅方法 DTMF  波形を再⽣生する⽅方法としては 1. DTMF  波形をプログラムで 計算して⽣生成する⽅方法 2. サウンドファイルを ⽤用意して再⽣生する⽅方法

25.

DTMF  ⾳音の再⽣生⽅方法 1. DTMF  波形をプログラムで 計算して⽣生成する⽅方法

26.

DTMF  波形を⽣生成する⽅方法 Remote  IO  を使って 波形データを⽣生成する

27.

DTMF  波形を⽣生成する⽅方法 詳細は割愛 Remote  IO  について 詳しく知りたい⼈人には この書籍が超お勧め! 絶版らしいのが悲しい

28.

DTMF  波形を⽣生成する⽅方法 超お勧めの Web  サイト Objective-‐‑‒Audio Mac  と iPhone  でオーディオプログラミング http://objective-audio.jp/ ⼤大変お世話になっております。

29.

DTMF  波形を⽣生成する⽅方法 概要としては 1. Audio Unit を初期化する 2. コールバック関数を登録する 3. Audio Unit を実行する 4. コールバック関数が呼ばれたら 波形データを計算してバッファに書 く

30.

DTMF  波形を⽣生成する⽅方法 波形データの書き込み 1. バッファに何秒目から何秒間のデータを 書き込むかはプログラマが管理する 2. バッファが何秒間のデータかは サンプリングレートで判断できる 3. サンプリングレートとは 何個のデータで 1 秒の音を作るかを示す

31.

DTMF  波形を⽣生成する⽅方法 Remote  IO  って ちょっと難しい

32.

DTMF  波形を⽣生成する⽅方法 Remote  IO  の利利点 1. 波形データを直接扱える 2. タイミングの細やかな調整が可能 3. 音声フォーマットの変換も可能 ⾳音声データをネットワーク経由で 送信したいときにも威⼒力力を発揮する

33.

DTMF  ⾳音の再⽣生⽅方法2 2. サウンドファイルを ⽤用意して再⽣生する⽅方法

34.

サウンドファイルで再⽣生する⽅方法 DTMF  サウンドファイルの ⽤用意の仕⽅方としては… 1. サウンドエディタを使って生成する 2. インターネットでダウンロードする

35.

サウンドファイルで再⽣生する⽅方法 0  〜~ 9,  *,  # だけで良良ければ サウンドファイルが iPhone  内に⽤用意されている

36.

サウンドファイルで再⽣生する⽅方法 /System/Library/Audio/UISounds • dtmf-0.caf • dtmf-6.caf • dtmf-1.caf • dtmf-7.caf • dtmf-2.caf • dtmf-8.caf • dtmf-3.caf • dtmf-9.caf • dtmf-4.caf • dtmf-pound.caf • dtmf-5.caf • dtmf-star.caf

37.

サウンドファイルで再⽣生する⽅方法 サウンドファイルは System  Sound  Services を使って再⽣生する

38.
[beta]
サウンドファイルで再⽣生する⽅方法

1.AudioToolbox.framework を組み込む
#import <AudioToolbox/AudioServices.h>

2.DTMF  ファイルのパスを取得する
NSString* path = @"/System/Library/
Audio/UISounds/dtmf-1.caf"];
NSURL* url = [NSURL
fileURLWithPath:path];

39.

サウンドファイルで再⽣生する⽅方法 3.再⽣生終了了時にサウンドのリリース処理理を 実⾏行行する関数を⽤用意する void soundCompletion(SystemSoundID sound, void* clientData) { AudioServicesDisposeSystemSoundID( sound); }

40.

サウンドファイルで再⽣生する⽅方法 4.URL  からシステムサウンドを⽣生成する SystemSoundID sound; AudioServicesCreateSystemSoundID( (__bridge CFURLRef)url, &sound); 5.再⽣生終了了時に実⾏行行する関数を割り当てる AudioServicesAddSystemSoundCompletio n(sound, NULL, NULL, soundCompletion, NULL);

41.

サウンドファイルで再⽣生する⽅方法 6.サウンドを再⽣生する AudioServicesPlaySystemSound(sound);

42.

DTMF  を再⽣生する このような知識識を使って DTMF  を再⽣生する

43.

DTMF  を鳴らすアプリを作ってみた • 電話アプリに組み込む前に ⾳音だけ鳴らすテストアプリを作成 • DTMF 記号を押すとその⾳音がなる • 信号送出時間と ミニマムポーズを調整可能

44.

DTMF  活⽤用例例 そういえば!

45.

DTMF  活⽤用例例 どこかの探偵アニメで DTMF を発声して電話をかける エピソードがありました

46.

DTMF  活⽤用例例 ⾳音の信号だから 実現可能

47.

DTMF  活⽤用例例 iPhone  の電話帳を使って 固定電話で発信できそう

48.

DTMF  を鳴らすアプリを改良良してみた テストアプリの機能強化 • 電話帳から番号を選択可能にした • 販売したら買う⼈人もいるかも? ➡ テストアプリがお⼩小遣いになった

49.

DTMF  活⽤用例例 DTMF  Dialler  が 完成しました。 iPhone  の電話帳を使って 固定電話で電話がかけられます

50.

フィードバック そんなある⽇日、 外国の⽅方からのフィードバックが アイデアは良良いけど pause が使えないぜ! オレは連絡先の番号に pause を使ってるのさ。 ※  意訳

51.

DTMF  の付加価値 pause … (´́・ω・`)? なにそれ

52.

RFC  3601 Dial  Sequences  and  GSTN  /  E.164  Address 【pause】 • ⼀一時停⽌止を表す記号 • 記号は “p”  で表記する • 通常は 1  秒間の休みを取る ⼀一般的には “ , ”  が使われる…?

53.

RFC  3601 Dial  Sequences  and  GSTN  /  E.164  Address 【tonewait】 • こちらも⼀一時停⽌止を表す記号 • 記号は “w”  で表記する • 次に進む段階が来るまで待つ ⼀一般的には “ ;; ”  が使われる…?

54.

公開は宝物 公開するって 勉強になりますね

55.

第2章 アイデアとの出逢い

56.

アイデアとの出逢い あれはたしか 第3回 iphone_̲dev_̲jp 東京 iPhone/Mac  懇親会 での出来事

57.

神がかったアイデア光臨臨 これで再配達の 申し込みがしたい! これこそまさに 技術を出発点にしない発想

58.

再配達アプリに緊急着⼿手 感銘を受けて 翌⽇日さっそく 再配達アプリ制作に着⼿手

59.

再配達アプリ完成 「⾳音で再配達」が 完成しました。 再配達の伝票がトーン⾳音になるので それを固定電話に聞かせて⼿手配完了了

60.

再配達アプリ完成 しかしまさかの iPhone  と iPod  touch  では スピーカーの⾳音が少し違うようで… iPod  touch  を愛⽤用の さんには 使ってもらえないことが判明

61.

再配達アプリ完成 iPod  touch  でも 外部スピーカーを繋げば 使えたりします たとえば iHome  iHM63  とか

62.

第3章 そして神アプリへ

63.

再配達アプリもおかげさまで • 週刊アスキー PLUS  に 掲載されました • そしておかげさまで 外からの声が届いて参りました

64.

何気ないご意⾒見見 iPhone  のみで 操作が完結できたら 神アプリじゃない?

65.

気になるご意⾒見見 神アプリ…ですと!?

66.

でも気になるご意⾒見見 さすがにそれは無理理でしょう

67.

それでも気になるご意⾒見見 こういうときこそ逆転の発想 それがもし 実現できるとしたら? …って考えると良良いって どこかで聞いた事がある気がする

68.

今こそ… Think different.

69.

実現性の模索索1 そういえば DTMF  Dialler  のフィードバックで iPhone  の電話帳に pause  を⼊入れて使ってるよ! とおっしゃる⼈人が居ましたね

70.

実現性の模索索2 pause といえば DTMF

71.

実現性の模索索3 DTMF って そもそも電話の仕様でしたね…

72.

実現性の模索索4 iPhone  って 電話でしたよね

73.

わかったぞ…! 全ての謎が ⼀一本の線で繋がった !!

74.

iPhone  の電話でも 普通に DTMF が使えるはず!

75.

使えました

76.

iPhone  で DTMF  を使う iPhone  に DTMF  を送信する NSURL* tel = [NSURL urlWithString: @"tel:05037869625,,,,1111”]; [[UIApplication sharedApplication] openURL:tel]; tel: スキームを使って 番号と⼀一緒に “  , ”  や “  ;; ”  を使うだけ

77.

iPhone  で DTMF  を使う tel:  スキーム使⽤用時の留留意点 1. iPhone  の pause  は 3  秒間の待ち 2. “*”  と “#”  は、それぞれ “%2a”  と “%23”  に置き換えて使う

78.

iPhone  で DTMF  を使う 重要な制約 tel:  を呼び出すと 制御が電話アプリに遷る 1度度だけの呼び出しで DTMF  を遂⾏行行させる必要がある

79.

こうして…

80.

神アプリが 完成しました

81.

神アプリ完成 神アプリなので… 「⾳音で再配達ゴッド」 再配達の伝票を DTMF  にして 必要な⼿手続きを⾃自動化します

82.

まとめ

83.

まとめ DTMF  とは 1. DTMF  は電話の仕様 2. ふたつの正弦波の合成⾳音 3. pause  と tonewait  がある 4. iPhone  の電話でも使⽤用可能

84.

まとめ 制約としては 1. tel:  を呼び出したら アプリには帰って来れない 2. tel:  を使わないなら 電話⼝口に⾳音を聞かせる必要がある iPhone  のヘッドフォン端⼦子で外部と連携できれば 制約もまた違ってくるかもしれません

85.

まとめ 電話の⽂文化としては 広く普及している技術ではあるので 条件が揃えば新しい何かに 応⽤用できるかもしれません

86.

まとめ できないかも 知れないですけど できるかは神のみぞ知る