井原プロダクトのBLOG

Since 2013。個人でアプリ作っています。

Smart Metronome TAPテンポ検出のプログラム

Smart Metornomedでは、6回のタップの平均間隔を計算してテンポ設定しています。以下ソースコード

//
//  ViewController.m
//  tapTempo
//
//  Created by Tomohiro Ihara on 2019/07/20.
//  Copyright © 2019 Tomohiro Ihara. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *myLabel;

@end

@implementation ViewController

NSDate *taptimeSave;  //最後にtapされた時間を保存
NSMutableArray *tapsave; //tap間隔を保存
NSInteger tapCounter, tapdataCounter;

- (void)viewDidLoad {
    [super viewDidLoad];
    taptimeSave = [NSDate date];
    tapCounter = 0;
    tapdataCounter = 0;
    tapsave = [NSMutableArray array];
    for (int i=0; i<6; i++) {
        [tapsave addObject:@"0"];
    }
}


- (IBAction)tap:(UIButton *)sender {
    //**********  タップしたテンポを表示する
    float x, ave;
    NSDate *now = [NSDate date];
    x = [now timeIntervalSinceDate:taptimeSave];
    taptimeSave = now;
    //前回のTAPから3秒以上経っていたら最初から計測
    if (x < 3) {
        [tapsave replaceObjectAtIndex:tapCounter withObject:[NSString stringWithFormat:@"%f",x]];
        //平均値を求める(値が0は除く)
        float sum  = 0;
        tapdataCounter = 0;
        for (int i=0; i< tapsave.count; i++) {
            if ([tapsave[i] floatValue] > 0) {
                sum += [tapsave[i] floatValue];
                tapdataCounter ++;
            }
        }
        if (tapdataCounter > 0){
            ave = 60/sum  * tapdataCounter;
            NSLog (@"ave:%f", ave);
            NSLog (@"sum:%f", sum);

            //最大値最小値補正
            if (ave > 999) {
                ave = 999;
            }
            if (ave < 1){
                ave = 1;
            }
            //カウンター更新
            tapCounter++;
            if (tapCounter > tapsave.count-1){
                tapCounter = 0;
            }
            _myLabel.text = [NSString stringWithFormat:@"%ld",(long)ave];
        }
    } else {
        //最初なので全部クリア
        for (int i=0; i< tapsave.count; i++) {
            tapsave[i] = @"0";
        }
    }
}

@end

Smart Metronome Ver7.0 リリースしました

今回のアップデートは、主に以下の2点。

  • 連続タイマー機能
  • 小数BPMの設定

自分の課題に対して日々練習を積み重ねることって大事だと思うのですが、いざ練習を始めてみるとひとつのできない事(曲)に時間を費やしてしまって他のことができずに終了、なんて事よくあるのではないでしょうか。1日の練習は、時間割をつくって一通りおさらいしましょう、というのが今回のご提案です。
f:id:ihatomo:20190619190911p:plain:w300


つくってみるとメトロノームと連続タイマーの組み合わせって意外とありまして、例えば自転車のトレーニング。オプションで時間になるとBPMが変わる機能を実装しましたので、回転数をイージー、ハードと設定することによって心肺負荷の科学的トレーニングを行うことができます。繰り返しもできるので、タバタ式などにも便利だと思います。

f:id:ihatomo:20190619191610p:plain:w300


読書にも有効です。一ページ、または一行あたりのBPMとタイマーを設定して集中してみてください。結構はかどると思います。また、1ページあたりどれくらいで読むかというのに、よりきめ細かい時間が設定できる様に小数点以下2桁まで設定できる様にしました。例えば1ページを40秒で読みたい場合、60/40+1.5BPMということになります。

f:id:ihatomo:20190619191842p:plain:w300


どうぞ、ご活用ください。

拍子記号のフォント

f:id:ihatomo:20190328133843g:plain


楽譜って独特のフォントが使われていて、その中でも拍子の数字フォントってかなりユニークです。

1234567890

普通にこれらの数字を使っても、それが拍子であることが伝わりません。色々調べたのですが、よくわからなくて、画像でフォントを調べてくれるサービスを使ってみたところClearfaceが似ているということで使っています。欲を言うと2と7の横線が波打っていて欲しいのですが、、。

f:id:ihatomo:20190328134304p:plain


もしこれだ!というのをご存知の方がいらっしゃったらぜひコメント欄にお願いします。

Firebase 5.18.0にアップデートしたらadMobでエラーになる件

何気に pod updateしたら Firebaseもアプデ来まして、ビルドしたらエラーを吐いて止まるようになってしまいました。あいたたた。

2019-03-19 15:53:31.672796+0900 hogehogehoge[6653:6945823] *** Terminating app due to uncaught exception
 'GADInvalidInitializationException', reason: 'The Google Mobile Ads SDK was initialized incorrectly. Google AdMob 
publishers should follow instructions here: https://googlemobileadssdk.page.link/admob-ios-update-plist to include 
the AppMeasurement framework, set the -ObjC linker flag, and set GADApplicationIdentifier with a valid App ID.
 Google Ad Manager publishers should follow instructions here: https://googlemobileadssdk.page.link/ad-manager-ios-update-plist'


ところが運の良い私は、つい先日別件の調べものでadMobでtweeterサーチをかけてまして、以下のようなtweetがあったっけなーというのが頭の隅にあったわけです。


見事infoplistにitem追加したら直りました。意味は後で。

MacBook Air 2018 買っちゃった

f:id:ihatomo:20190222155737p:plain

普通に考えてエンジニア的には絶対Macbook Proを選ぶべきなんですよ。スペックは比べるまでもないし、Touch Barなしだと8000円しか変わらないし、重さも120gしか変わらない。Airだと動画編集はキツイし、アプリ開発コンパイルも遅い。そもそも軽さを求めるなら1Kgを切っているMacbookがあるし、どうにもAirにする決め手に欠ける。

でも、理性ではなく感性でAirを欲しがっている自分がいました。カッコいいんですよね、単純に。Macbook ProAirを並べて比較してどちらを所有したいかと言うと、どうしてもAirになっちゃう。そりゃFinalCutProは動かないかもしれないけれど、そんな事よりシュッとした美しいフォルム、小脇に抱えた時にヒンジ側に重心が寄っている感じ、そしてAirが放つアーティスティックなオーラに魅せられてしまいました。

「どうせなら自分の好きなものがいいですよ。だったらAirじゃないですか。」

Apple Storeのお姉さんが最後にとどめを刺してくれました。というわけで、ムフフフとにやけながらこのBlogをタイピングしています。ご機嫌です!

Smart Metronome :バレンタインデーのVersionUpはセットリストの使い勝手

こんにちは。

Smart Metronomeバージョンアップしました(無料版のみ、有料版は明日以降になります)。今日は巷ではバレンタインデーらしいので、季節のメトロノーム画面を期待された方もいらっしゃると思いますが、バレンタイン私には全く関係ないし、同じ様な境遇の方の気持ちをおもんばかってバレンタインデーデザインを用意するのは辞めました。そもそもLoveLoveな方は、いまごろメトロノーム使って練習なんかせずにどこかにごはんでも食べに行っているんじゃないでしょうか。いやー、こんなデザインにしたら非リア充激おこでしょ(クリスマスも結構怒られたし)。

f:id:ihatomo:20190214195502p:plain:w300

そんな恨み節はさておき、今回はセットリストの使い勝手を改善しました。実は、この件、以前から構想はあったのですが、ちょっと複雑なロジック変更と検証が必要なため後回しになっていました。どういう変更かと言うと、例えば以下の様なSetListを作ったとします。

f:id:ihatomo:20190214191647p:plain:w300

今までは、Song1を選択して実行しているとき、次にSong2を選択するには、一度メトロノームを止めて、このメニュー画面を表示して再度曲をセレクトしなければなりませんでした。

でも、これからは、メイン画面から次の曲、前の曲って移動できます。下の画像をご覧ください。テンポの数字の左右に < > のボタンがありますが、これをタップするとSetList中の前後の設定ファイルを読み出します。メトロノーム再生中でもOKです。ドラマーの方は特に便利だと思うのですが、練習中などに「はい、じゃ次の曲」ってなっても、これですぐにテンポ出しができますね。

f:id:ihatomo:20190214191949p:plain:w300


ちなみに今回の開発は、ユーザーさんからもご要望のメールを頂いたのですが、「次のバージョンでやりますね」と回答したところ、2月17日がライブだから緊急!ってお返事を頂きまして、普段のんびり仕事している私のお尻にも火が付いたのでした。Yさんありがとうございました!

というわけで、新しいバージョンもよろしくお願いします。

iPhoneの3D Touchを組み込んでみたの続き

これの続き。
ihatomo.hatenablog.com


すでにちょっと時間が経っているのですが、Smart Metronomeの3D Touch 無事リリースできました。
3D Touchの部分、こちらソースコードを公開していますので良かったら参考にしてください。


3D Touch、またはForce Touchは、使い方によっては大変便利なのですが、最大の欠点はそのボタンが3D Touchを搭載しているかどうかがわからないということで、その使い方をユーザーさんにどうやって知らしめるかが課題でした。で、前回のBlogでは説明動画をつくるかどうか、もう少し具体的に言うと説明動画をつくるために動画編集ソフトのFinal Cut Pro (Blog書いている今現在 ¥34,800)を買うかどうか?という点で頭を悩ませていたのですが、結局買いました。そして、買ってから知ったのですが、Final Cut Proは動画編集ソフトなので、素材そのものを作ることはできないわけです。なので、iPhoneの画面をタッチしている様なアニメーションをつくる場合、さらに他のソフトが必要で、それにはMotion(同 ¥6,000)が良いとのことで、それも買いました。そして当然ながら買っただけでは使えないので、本も買いました。Motionは、YouTubeで学びました。


で、制作費44256円かけてできた動画がこちら。改めてみると、もう少しスピード感が欲しいですね。ごめんなさい。

youtu.be


なんだかもったいないから、これだけで終わらせずに動画編集方面、少しなにかしないとなぁ。


今回のバージョンアップで、広告会社も今までadMob一択だったのをもう一社追加しまして、自前サーバーにてA社/B社の配信比率をコントロールできる様にしています。単にアプリ起動時に自前サーバーにHTTPアクセスして設定ファイルを読み込んでいるだけですが、収入源を二社に分けることができるというのは、収益の最大化とリスクヘッジの意味で大変安心ですね。

早く動画制作費の元とってもらわねば。ではでは