せっかく届いたTouch Barの使いみちが思い浮かばなかったのでPPAPでサンプルを作った

# つまりなにしたの
MacBook Proに搭載されたTouchBarをシンプルに使ったサンプルを作った。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">MacBookProが届いたのにTouchBarの使い道が思い浮かばなかったので、TouchBarでPPAPアプリを作った <a href="https://t.co/gKLsaKuvwW">https://t.co/gKLsaKuvwW</a> <a href="https://twitter.com/YouTube">@YouTube</a>さんから</p>&mdash; 🍖えんせき🍣 (@EnsekiTT) <a href="https://twitter.com/EnsekiTT/status/800366911477321728">2016年11月20日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# 概要
Cocoaのプロジェクトを新規作成
TouchBarを使うための設定をAppDeligate.Swiftに行う
StoryBoardにTouchBarを配置する
WindowControllerクラスを作成する
TouchBarのActionを拾えるようにする
音を鳴らす関数を用意する
PPAPを細切れにして格納
PPAPして楽しむ

# 環境
* MacBook Pro (13-inch, Late 2016, Four Thunderbolt 3 Ports)
* macOS Sierra 10.12.1（16B2657）←このバージョン大事（2016/11/21）
* Xcode Version 8.1（8b62）

# 参考
https://developer.apple.com/reference/appkit/nstouchbar
https://developer.apple.com/reference/avfoundation/avaudioplayer
http://dev.classmethod.jp/smartphone/iphone/xcode-8-1-touch_bar-sample-code-part-1/
↑こちらはシリーズで参考にさせていただきました。

# 実装
github: https://github.com/EnsekiTT/PPAPBar
※ 音源は含まれていません
## Cocoaのプロジェクトを新規作成
XCodeを立ち上げて 「Create a New Xcode Project」
macOSタブを選択して「Cocoa Application」
好きな名前をつける。仮に「PPAPBar」

PPAPBarプロジェクト
　　PPAPBarディレクトリ
　　　　AppDeligate.swift
　　　　ViewController.swift
　　　　Assets.xcassets
　　　　Main.storyboard
　　　　info.plist
   Productsディレクトリ
みたいなプロジェクトが立ち上がるはず

## TouchBarを使うための設定をAppDeligate.Swiftに行う
TouchBarが使える環境でのみ実行するためのコードを追加する
func applicationDidFinishLaunching(_ aNotification: Notification) {
の中に以下を入れる。

```swift:AppDeligate.swift

if NSClassFromString("NSTouchBar") != nil {
   NSApplication.shared().isAutomaticCustomizeTouchBarMenuItemEnabled = true
}

```

## StoryBoardにTouchBarを配置する
Main.storyboardに移って
Object LibraryからTouchBarやそのButtonを選んでWindowControllerに配置した。
<img width="1512" alt="スクリーンショット 2016-11-21 1.54.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/20091/83ea7721-56a9-3035-fa70-024d920fd698.png">

## WindowControllerクラスを作成する
無精してViewController.swiftの中にWindowControllerを用意しました。

```swift:ViewController.swift

class WindowController: NSWindowController, AVAudioPlayerDelegate {

}

```

これをWindowControllerSceneのWindowControllerのCustomClassに適用する。

## TouchBarのActionを拾えるようにする
先程のWindowControllerの中に

```swift

    @IBAction func startAction(_ sender: NSButton){
        print("start")
        soundPlay(fileName: "start")
    }

```

を起こしたいActionの数だけ作る

```swift:WindowController.class
    
    @IBAction func startAction(_ sender: NSButton){
        print("start")
        soundPlay(fileName: "start")
    }
    
    @IBAction func pen1Action(_ sender: NSButton){
        print("Pen")
        soundPlay(fileName: "pen1")
    }
    
    
    @IBAction func pineAplleAction(_ sender: NSButton){
        print("pineapple")
        soundPlay(fileName: "pineapple")
    }
    
    @IBAction func appleAction(_ sender: NSButton){
        print("apple")
        soundPlay(fileName: "apple")
    }

    @IBAction func pen2Action(_ sender: NSButton){
        print("pen")
        soundPlay(fileName: "pen2")
    }

    @IBAction func endAction(_ sender: NSButton){
        print("end")
        soundPlay(fileName: "end")
    }

```

今回はPPAP用に6つ用意してみた。
StoryBoardのTouchBar各ボタンからCtrl+ドラッグで各アクションに接続する
![ctrlpd.png](https://qiita-image-store.s3.amazonaws.com/0/20091/4912d69a-9cd4-2d38-dc07-533a7df6174c.png)


## 音を鳴らす関数を用意する
今のままだとsoundPlayが警告を発するはずなので音を鳴らす関数をWindowControllerに用意した

```swift:ViewController.swift
import AVFoundation
```

音を鳴らすためのAVFoundationをインポートして以下の関数と変数を追加する。

```swift:WindowController.Class
    var audioPlayer:AVAudioPlayer!
    
    func soundPlay(fileName: String) {
        // 再生する audio ファイルのパスを取得
        let audioPath = Bundle.main.path(forResource: fileName, ofType: "mp3")!
        let audioUrl = URL(fileURLWithPath: audioPath)
        print(audioUrl)
        
        
        // auido を再生するプレイヤーを作成する
        var audioError:NSError?
        do {
            audioPlayer = try AVAudioPlayer(contentsOf: audioUrl)
        } catch let error as NSError {
            audioError = error
            audioPlayer = nil
        }
        
        // エラーが起きたとき
        if let error = audioError {
            print("Error \(error.localizedDescription)")
        }
        
        audioPlayer.delegate = self
        audioPlayer.prepareToPlay()
        audioPlayer.play()
    }
```

## PPAPを細切れにして格納
Audacityとかを使ってPPAPの音源を細切れにして

```bash
start.mp3
pen1.mp3
pineapple.mp3
apple.mp3
pen2.mp3
end.mp3
```

の6音源を用意する。
（中身はなんでも良いので心の弱さから時事ネタに飛びついた）
これをPPAPディレクトリ直下のViewController.swiftと同レベルのところに全部放り込む。

## PPAPして楽しむ
![IMG_3268.JPG](https://qiita-image-store.s3.amazonaws.com/0/20091/488c70ef-45d8-4019-5c12-a34e94594344.jpeg)

# TouchBarの感想
すごくさわり心地がいい
思いの外反応がいい
AppleのアプリだとTrackpadの利用頻度が結構下がるレベルに便利な機能がある
ターミナルのときだけFunctionキー設定などができるのがよかった
（買ってしまった以上褒めちぎるしかない）

# これから
ネイティブアプリにも慣れていきたい。