hinapippi’s New story

駆け出しiOSエンジニアの発表会場です(^-^)/~

swift3でマイクの録音レベルを検知する

「録音レベルを検知する」についての記事が少なく書き方の違いに苦労したためここにメモ(swift3)

ソースコード

// フレームワークをimportする
import AudioToolbox

// 録音の必要はないので AudioInputCallback は空にする
private func AudioQueueInputCallback(
    inUserData: UnsafeMutableRawPointer?,
    inAQ: AudioQueueRef,
    inBuffer: AudioQueueBufferRef,
    inSrartTime: UnsafePointer<AudioTimeStamp>,
    inNumberPacketDescriptions: UInt32,
    inPacketDescs: UnsafePointer<AudioStreamPacketDescription>?) {
}

class ViewController: UIViewController {

    // 音声入力用のキューと監視用タイマーの準備
    var queue: AudioQueueRef!
    var recordingTimer: Timer!

    override func viewDidLoad() {
        super.viewDidLoad()
        // 録音レベルの検知を開始する
        self.startUpdatingVolume()
    }

    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        // 録音レベルの検知を停止する
        self.stopUpdatingVolume()
    }

    // 以下の処理を実行したいタイミングでタイマーをスタートさせるだけで録音レベルが検知できる

    // MARK: - 録音レベルを取得する処理
    func startUpdatingVolume() {
        // 録音データを記録するフォーマットを決定
        var dataFormat = AudioStreamBasicDescription(
            mSampleRate: 44100.0,
            mFormatID: kAudioFormatLinearPCM,
            mFormatFlags: AudioFormatFlags(kLinearPCMFormatFlagIsBigEndian |
                kLinearPCMFormatFlagIsSignedInteger |
                kLinearPCMFormatFlagIsPacked),
            mBytesPerPacket: 2,
            mFramesPerPacket: 1,
            mBytesPerFrame: 2,
            mChannelsPerFrame: 1,
            mBitsPerChannel: 16,
            mReserved: 0
        )
        // オーディオキューのデータ型を定義
        var audioQueue: AudioQueueRef? = nil
        // エラーハンドリング
        var error = noErr
        // エラーハンドリング
        error = AudioQueueNewInput(
            &dataFormat,
            AudioQueueInputCallback,
            UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque()),
            .none,
            .none,
            0,
            &audioQueue
        )
        if error == noErr {
            self.queue = audioQueue
        }
        AudioQueueStart(self.queue, nil)
        
        var enabledLevelMeter: UInt32 = 1
        AudioQueueSetProperty(
            self.queue,
            kAudioQueueProperty_EnableLevelMetering,
            &enabledLevelMeter,
            UInt32(MemoryLayout<UInt32>.size)
        )
        
        self.recordingTimer = Timer.scheduledTimer(
            timeInterval: 1 / 30,
            target: self,
            selector: #selector(self.detectVolume(timer:)),
            userInfo: nil,
            repeats: true
        )
        self.recordingTimer?.fire()
    }
    
    // 録音レベル検知処理を停止
    func stopUpdatingVolume() {
        // Finish observation
        self.recordingTimer.invalidate()
        self.recordingTimer = nil
        AudioQueueFlush(self.queue)
        AudioQueueStop(self.queue, false)
        AudioQueueDispose(self.queue, true)
    }
    var levelMeter = AudioQueueLevelMeterState()
    func detectVolume(timer: Timer) {
        var propertySize = UInt32(MemoryLayout<AudioQueueLevelMeterState>.size)
        
        AudioQueueGetProperty(
            self.queue,
            kAudioQueueProperty_CurrentLevelMeterDB,
            &levelMeter,
            &propertySize)
        
        // 取得した録音レベルに応じてimageを切り替える
        self.statusImage.isHidden = (levelMeter.mPeakPower >= -1.0) ? false : true
        print(levelMeter.mPeakPower)        
        }
    
    // 録音レベルの値によって行いたい処理(サンプル)    
    func setLabelText () {
            if levelMeter.mPeakPower > -40.0 {
                label.text = "会話しています"
            } else {
                label.text = "誰も会話していません"
            }
        }
    }
}

参考記事

以下の記事を参考に実装しました

iSensorSwift/AudioViewController.swift at master · koogawa/iSensorSwift · GitHub

AudioToolbox | Apple Developer Documentation

ソースコードの読み方

ソースコードを読めるようになりたい!!!

エンジニアとして勉強をする時の最初の壁だと思います
読めと言われても見たことがない英単語や、文章が続きよくわからないけど
所々色も違う….。
グーグル先生に聞いても全然いい記事が出てこない……。

みんなどうやって読めるようになってんのーーーーー!!!

と、発狂しそうなそこのあなたにソースコードを読めるようになるポイントをまとめました!

ポイント

ソースコードを読むポイントは以下の3点です。

  • とにかく翻訳
  • グーグル先生に相談
  • クイックヘルプ

上記を行なっていればある程度、読むことならできます。
まず最初は理解しようとしなくていいのです。
ただひたすら読んでソースコードに慣れることが重要です。

とにかく翻訳

おいおいふざけるな。ただの翻訳で読めるようになるなら誰も苦労しねぇよ。

わかります。その気持ち。
私はそうでした。嘘つけよー。なんか他のことやってるだろー。
と思ってただ眺めるだけの時間が続きましたw
あれが一番無駄な時間でしたねw

確かに記号など翻訳できないものは検索かけなければならないので
ある程度の記号をここに書いておきます!

= → 左辺に右辺を代入
例:A = B → AにBを代入

. → ~の
例:Aクラス.メジェドさん → Aクラスのメジェドさん

というようになります。

この二つを一旦覚えれば簡単なソースコードならすぐに読めます

とにかく翻訳でやることは「読む」ことです。
いいですか?
「読むこと」 です

理解をすることではありません。
わからない単語はどんどん翻訳してください!!

ソースコードが英語単語だから読めないだけで
日本語の単語であればなんとなく内容は理解できるはずです。


let button = UIButton!
変数のボタンにUIButtonを代入

これが翻訳を使ったソースコードの読み方になります。
ボタンにボタンを代入する?と思うかもしれませんが、
letやvarの後ろに書かせている英単語は単なる名詞、名前でしかないのです。
その名前が本当はどういったものなのか説明しないと
たとえボタンと書いてあってもコンピュータはただのローマ字としか認識できないのです


これは レオンという名前の カメレオン です

let button = UIButton!
これはボタンという名前のボタンです

という例を見ていただければコードがなにを書いているのかわかりやすいと思います

「レオン」というだけではそれが動物なのかすらわからないですよね?

最初はこんな感じでいいので根気よく翻訳を続けましょう!!

グーグル先生に相談

翻訳をかけてもただのカタカナでしか表示されない場合も当然あります。
そう言った場合はグーグル先生に相談をしましょう。

この時気をつけて欲しいのは 検索ワード です。

必ず自分の言語を入れて検索するようにしましょう!

一回、一回検索するのは面倒だと思いますが
癖がついてしまえばなんてことないです。

先ほどの文でいうUIButtonですね。
さっそく「swift UIButton」などで検索してみましょう!

クイックヘルプ

翻訳をしても、グーグル先生に聞いても
いい答えが出てこない

1時間もたった。どうしよう。

そんな時は、クイックヘルプさんを活用しましょう。

いいですか。
自分を陥れた英単語にカーソルを当てましょう
右上の小さな?のアイコンを選択すると英文がたくさんでます。
これを丸々翻訳にかけてしまいましょう
f:id:MHT-dog-hinapippi:20170913000914p:plain

これだけでなんとなくその単語がなんなのかわかると思います
なぜこのポイントを最後に持ってきたかというと
クイックヘルプは書かれているときとそうでない時があるからです

まとめ

いかがだったでしょうか。
ソースコードを読むにあたって上記3つを根気よくやり続ければ
理解はできなくても読むことは可能になってきます。
読むことが可能になると理解も自然とできてきます。
最初はわからない単語ばかりで「向いていない」と思ってしまうかもしれませんが
少しでもできるようになる手段を知っているだけで
できなかったことができるようになってきます
諦めず騙されたと思ってやってみてください!!

セミナーの初講師

【無料】swiftでTableViewを使ってメモアプリを作成しよう

内容


mht-code.connpass.com

TableViewとNavigationControllerを使って

delegate,dataSourceメソッドを説明しながら簡単なメモアプリを作成しました!

なぜメモアプリにしたか。

単純に私がTableViewで躓いたからですw

え。なんでこいつだけボタンとかと違うの?

delegateってなに?

dataSourceってなに?

delegateとdataSourceのちがいってなに?

もーやだーーーーー!

って自分自身投げ出したものだったからですw

前々から近い目標としてセミナーの講師を掲げていましたが

始めたばかりで自分の口で説明できるものはすごく限られていたのと

swiftのセミナーで本当に初心者向けのセミナーって少ないなと思っていました。

自分になにができるかな。

と考えるうちに私自身が

講師をするにあたり気をつけたこと

まず私は文章を組み立ててゆっくり話すことが苦手です。

なので気をつけたこととしては以下です。

・ゆっくり話すこと

・相手が子供だと思って説明をする

・話の頭か最後に結論をいう

・失敗なんてない、参加者さんと楽しい時間を作る

この4つです。

ゆっくり話す

これに関しては当たり前ですねw

もともと早口 + 緊張で早口

になってしまうのでこれは常に意識をして参加者さんが

聞き逃しをしてしまわないように気をつけました。

相手が子供だと思って説明をする

決して参加者さんをバカにしているわけではありません!

これは自分がバカだったからですwww

セミナーの内容が簡単でも説明が用語ばかりで結局何をしてたのかわからなかった

という自分の経験があり

そういう思いを参加者さんにはしてほしくなかったのです。

なので、

たとえ話でもみんなが共通して思い浮かべられるようなものをあげるよう

心がけました。

話の頭か最後に結論をいう

難しいように聞こえますが簡単なことですw

私は話の構成を組み立てるのが苦手なので

話す前に

あ、これ話長くなりそうだな

と感じたら、必ず結論をさきに言っておく

「ここで言っていることは」

話がまとまっていないまま話し始めてしまった

または、話の途中で長く話しすぎてるな

と思ったら話の最後に結論を言う

「最終的になにが言いたいかって言うと」

「長くなっちゃったんですけど結論」

というように話の中で一番聞いて欲しいのは「結論」です。

なので説明と結論を切り離す感覚で

必ず何が言いたいのかを伝えるように心がけました。

失敗なんてない、参加者さんと楽しい時間を作る

実際これが一番大事。

アプリがどんなに簡単でも

説明がどんなに簡単でも

そのときに楽しいと思えなければ

内容は頭に入って来ません。

前日から当日まですんごい緊張していましたが

そのとき社長から

「失敗なんてない、参加者さんと楽しい時間を作る」

と言われて(矢沢風にw)

あー。楽しくなきゃ聞く気しないし覚えてられないよな。

と実感できました。

なので

あ。シーンとしてきたな。

と感じたら

「どうです?楽しいですか??」

と声かけから始め、ちょっとした小話や

「ここまでできたら頭の上で丸作ってくださーい!」

と体も使っていただいて全身で体験してもらうように意識しました。

参加者さんもとても暖かくて

笑顔で対応してくださいました!

体を使えば使うほど頭だけでなく

体で覚えることもできるので効果的なのでは?

と思っていますw

ありがとうございましたw

反省点

具体的に書くと長くなるので自分のメモ程度に書きますw

・シミュレータの起動を忘れた

・スライドで最初の手順が抜けていた(どこを選択するか)

・時間の配分を考えていなかった

上の3つが大きな反省点です。

シミュレータの起動は完全に緊張で飛んでましたw

スライドで最初の手順が抜けていたのは

スライドを作成しているときは口で説明できると思ってました。

→修正します。

時間配分を考えていなかった

完全に準備不足です。

→時間の配分はスライド作成後に考える

感想

結論!

めっちゃ楽しかった!!!!!!

ただ、楽しかったです。

反省点はもちろんあるけど

初めてのセミナーであそこまで楽しめたのは

すごく価値のある体験だったと思う。


今後、もっとレベルをあげたセミナーも実践していきたいと思うけど
今回意識したポイントとか意識とかはぶれずにチャレンジしていきたいなと思いました。


参加者さんも補助役の先輩たちにも
たくさん協力したからこそできたセミナーであることも忘れずに
来月も?やるかもしれないので
早めに資料を修正して
次に繋げていきたいなと思います!


長くなりましたがこれで今回のブログを終わります!!!



興味のある方はぜひ参加してみてください!

SNOWで集合写真もとれちゃうかも?!



お待ちしています!!

TableViewについて

前置き

お久しぶりです!ぴっぴです。
すっかり更新が遅くなってしまいました....。

今回は初の技術に関しての記事になります。
自分が最初に「は?」って思った場所なので
2度と「は?」ってならないようにこちらに残しておきますw

そ・れ・に!
今回こちらに書く内容についてセミナーもやらせていただくので
超初心者向けですが、どなたかの力になれれば幸いです。w
詳しくはconnpassで!



TableViewとは??

はい。みなさんご存知tableView。
きっと初心者の人は必ず最初「は?」
って思うところなんじゃないかなと思います。

まず、TableViewがいまいち頭に浮かばない方は
iPhoneの設定画面を想像していただけるとわかると思います。
HOME画面の背景とか変更するときや、アップデートするときに開く画面ですね!

どんなものかわかる方も多いと思いますが、
たくさんの項目を一覧で表示させるもの!
っていうイメージですかね!

TableViewって紐づけると落ちる

第一の「は?」ポイントですねw
なんでか知らないけど紐づけてRunしたらそく落ちる。
みたいな。

あれを初めて見た時はマジでテンパりましたw


しかしこれは普通の動きなので安心してください!

TableViewを使用する上で必要なこと

正しくTableViewを使用するために書かなければならないことがあります!
それは、
delegateメソッド
・dataSouseメソッド

簡単にいうとこの二つです!

これさえしっかり書けば落ちる心配はない!!....はずw


delegateメソッド、dataSouseメソッドとは?

はい。第二の「は?」ポイントですねw

急にそんなこと言われてもわからんしー
しらんしー
調べてもよくわかんねーんだけど?!?!?!?!?!?!?!?!?!?!


私が思ったことです。失礼しましたw

ではではそれについて説明をさせていただきます!

delegateメソッド

delegateメソッド = 視覚的にどのような動きをしてもらうか
ex) numberOfRowsInSection = cellの個数

をお願いするメソッドです!
これがないと、TableView側は
「紐づけられてるけど何個セル表示させたらいいの〜〜〜(ToT)」
って感じになってしまいます。w

dataSouseメソッド


dataSouseメソッド = どんなデータを管理させるか
ex) cellForRowAt = cellに表示させたい値

をお願いするメソッドです!
これがないと、TableView側は
「個数決まってっけどなに表示してたらいいんだよ!(☝︎ ՞ਊ ՞)☝︎」
ってグレますw


改めてdelegateメソッド、dataSouseメソッドとは?

TableViewはViewControllerからしたらペットのようなものです!
何の芸を覚えていて、それがどんな芸なのか!

それをしっかりしつけして教えてあげないと
ただの野良と一緒なのでいうことを聞けずアプリを落とす厄介物になってしまいます_:(´ཀ`」 ∠):

そのしつけのために必要なのがdelegateメソッド、dataSouseメソッドということです。

しっかりしつけをしていればすごくいいやつになってくれる!....はずw

まとめ

今回はかなりざっと解説をさせていただいたのですが、
delegateメソッド、dataSouseメソッドは
TableViewだけの話ではなく様々な場面で出てきます。

かつ、今回の記事で紹介した
numberOfRowsInSectionやcellForRowAt以外にも
メソッドはたくさんあります!

暇なときに一覧ページなども検索すると出てくるので
調べてみるとおもしろいかも?⇦お前もやれw

自己紹介

自己紹介

初めまして!こんにちは!!
今回は初のブログ更新ということで、簡単な自己紹介をしますw
少し緊張しておりますが頑張って書くので最後まで読んで頂けたら嬉しいです(*^-^*)

名前

pippi = ぴっぴ ........ですw
年齢は19歳です!
会社の方に名付けていただきましたが、由来は特にありません !!!!

職業

iOSシステムエンジニアでアプリ開発をしています!

はい。
と言っても3月に始めたので経歴としてはまだ1ヶ月ほどですw
まだまだわからないことが多いですが自分なりに勉強をして
この場をお借りして復習、メモという形でブログを更新していこうと思っています!
なのでもし間違っていたり、情報が古い!ということがあればぜひコメントをいただければと思います!!

経歴

えっと今のお仕事に就くまでの流れになりますが、
ここまで読んでくださるとお分かりだとは思います。
はい。大学には進学していません!!
そしてなんと、高校はsoftballの推薦でしたので
普通科ではなく体育科になります。
そうです。学力は平均の高卒以下だと思っていただければ大丈夫ですwww
はい。
ここで終わりだと思うではないですか。
まだあるのです。疑問に感じている方もいることでしょう。
高卒なのにiOSエンジニアになったのは最近?
1年間何してたの?

はい。フリーターをやっておりました!!!

エンジニアに関して頭がよくないとできないと思われている方からしたら
「なに意味わかんないこと言ってんだ」
と思う方もいらっしゃるでしょう。

でもですね、みなさん、なれるんですよ。
やろうと思えば。
証拠?

私のブログを読み続けていただければそれがわかると思います。
私が経歴なんて関係なくエンジニアになれることを証明いたします!

私が普段学んだこと、意識していること、楽しかったと思えたこと。
全部ここに残します。

なのでぜひ!
駆け出しエンジニアのひよっこが
成長していく姿をみていただければと思います!!!

たまにコメント等で助けていただけるととっても嬉しいです.....。


終わり

最初の自己紹介なのに長くなってしまいましたが
私は同じような境遇の方が見やすく、理解しやすい、
簡単で、励みになれるようなブログを書いて行きたいなと思ってます!

何度も同じことを書いてしまいますが、
ぜひ!!コメントをください!!!!
間違っている、もっといい方法ある、もう少し詳しく知りたい、
仲良くなりたい!!
どんどんお寄せください!!!

最後まで読んでいただきありがとうございます!
改めまして、
よろしくお願いします(^-^)

..................。
終わり❤️