タグ「iOS」が付けられているもの

ライブエフェクト EQ(イコライザー) スペアナ搭載のiPhone音楽プレーヤーアプリ iOS Colatplayer Music App v2.0 の新機能

バージョン2.0の新機能
1. iPad Pro / mini4 / Air2 Split View, Slide Over(マルチタスキング)対応
iOS9から搭載された新機能Split View, Slide Over(Multitasking)に対応しました
Colat Music Player V2 iPad mini 4 Multitasking SplitView

2. Apple Watch対応 (WatchOS2)
a.再生コントロール
ColatPlayer2 Apple Watch

b.簡単再生 (ランダム,履歴,再生回数より30曲を自動選択)(アートワーク部分をタッチ)
ColatPlayer2 Apple Watch Quick Select Random 30

c.DSP プリセットの選択, 簡易調整
ColatPlayer2 Apple Watch DSP Control

d.PEQ プリセットの選択, 簡易調整
ColatPlayer2 Apple Watch PEQ Control

3. ウィジェット(Today Extension)対応
Widgetから簡単曲選択を行い再生します
ColatPlayer v2 TodayExtension (Widget)

4.3D Touch対応 (iPhone6s,6sPlus)
アイコン強押しによるショートカットメニューからの簡単再生を行います。
ColatPlayer v2 3DTouch

5.アルバムアートの拡大表示
アルバムアートを拡大して表示できるようになりました。
Colat Music Player V2 iPad Pro Multitasking SplitView

6.Styleカラーの追加
Styleで選択できるカラーが追加されました。
ColatPlayer v2 W-Pink

7. DSPプリセットの追加
Watchから簡単に設定が変更出来るようにプリセット機能が追加されました


8. PEQプリセットの追加
Watchから簡単に設定が変更出来るようにプリセット機能が追加されました


9. スリープタイマー
スリープタイマー機能が追加されました
Colat Music Player V2 iPad Multitasking SplitView
Colat Music Player V2 Sleep Timer

ダウンロードはこちら
音楽プレーヤー ColatPlayer (コラットプレーヤ,コラプレ) - ライブエフェクト/イコライザ/スペアナアプリー

動画はこちら


Colatplayer (コラプレ) v1.5で追加された機能についてはこちら
ライブエフェクト EQ(イコライザー) スペアナ搭載のiPhone音楽プレーヤーアプリ Colatplayer v1.5 の新機能

バージョン1.5の新機能
1. ステレオ スペクトラムアナライザー(スペアナ)ピークホールド付き ・レベルメータ
昔のバブルコンポに付いていたスペアナを再現
colatplayer v1.5

2. iPhone6 Plus Landscapeモード対応(横向き)
iPhone6 Plus Landscapeモードに対応、横向きのまま使えます。 colatplayer v1.5
colatplayer v1.5 iPhone6 Plus Landscape

3. デザイン(壁紙)の選択機能
簡単に壁紙選択や、色の変更が可能になりました。
colatplayer v1.5 StyleSelect

4. Facebook,twitter,LINEへ現在再生中の曲を投稿する機能
現在聴いてる曲の情報をソーシャル投稿共有 nowplaying
colatplayer v1.5 Share

5. iOS8バグ修正 Swipeで簡単に選曲可能な機能のiOS8での不具合修正
iOS8でスワイプで簡単に曲選択可能な機能のレイアウトが崩れていました。
修正長らくお待たせしました。
ColatPlayer Swip Add Playlist

ダウンロードはこちら
音楽プレーヤー ColatPlayer (コラットプレーヤ,コラプレ) - ライブエフェクト/イコライザ/スペアナアプリー

動画はこちら

[vDSP,メモ] vDSP関数の使い方4

vDSP関数の使い方について忘れないようにメモってみます。

この記事は、vDSP関数の使い方3の続きです。

今回はvDSP関数を一気に確認してゆきます。
使い方は関数にリファレンスへのリンクを張っているのでそちらで確認してください。
サンプルと実行結果を確認できます。

vDSP_vclip
float inVector1[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float outVectorVclip[8];
float low = 3;
float high = 6;
vDSP_vclip(inVector1, 1, &low, &high, outVectorVclip, 1, 8);
vdsp4-vclip.png

vDSP_vthres
float inVector1[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float outVectorVthres[8];
float lower_threshold = 4;
vDSP_vthres(inVector1, 1, &lower_threshold, outVectorVthres, 1, 8);
vdsp4-vthres.png

vDSP_vrvrs
この様に入力値を上書きするタイプの関数をin placeと言います。
反対にout of placeと記述があるものは出力を別に書き出します。
in placeとout of placeは重要なので覚えておきましょう。
float inVector1[8] = {1, 2, 3, 4, 5, 6, 7, 8};
vDSP_vrvrs(inVector1, 1, 8);
vdsp4-vrvrs.png

vDSP_vsort
float inVector1[8] = {1, 21, 13, 41, 15, 86, 7, 48};
vDSP_vsort(inVector1, 8, 1);  // ascending
vDSP_vsort(inVector1, 8, -1); // descending
ascending
vdsp4-vsort-asc.png
descending
vdsp4-vsort-desc.png

vDSP_vsma
第一引数のベクトルに第三引数の値を掛けたベクトルと第四引数を足す
一度に複数の計算を行うタイプの関数です。
似たような関数名が多いので注意しましょう。
float inVector1[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float inVector2[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float outVectorVsma[8];
float mul = 10;
vDSP_vsma(inVector1, 1, &mul, inVector2, 1, outVectorVsma, 1, 8);
vdsp4-vsma.png

vDSP_vdist
float inVector1[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float inVector2[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float outVectorVdist[8];
vDSP_vdist(inVector1, 1, inVector2, 1, outVectorVdist, 1, 8);
vdsp4-vdist.png

vDSP_maxv
float inVector1[8] = {1, 21, 13, 5, 12, 3, 7, 18};
float outMaxv;
vDSP_maxv(inVector1, 1, &outMaxv, 8);
vdsp4-maxv.png

vDSP_minv
float inVector1[8] = {10, 21, 13, 5, 12, 3, 7, 18};
float outMinv;
vDSP_minv(inVector1, 1, &outMinv, 8);
vdsp4-minv.png

vDSP_vindex
float inVector1[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float inVector2[8] = {7, 6, 5, 4, 2, 2, 1, 0};
float outVectorVindex[8];
vDSP_vindex(inVector1, inVector2, 1, outVectorVindex, 1, 8);
vsdp4-vindex.png

vDSP_vfill
float fill = 10;
float outVectorVfill[8];
vDSP_vfill(&fill, outVectorVfill, 1, 8);
vdsp4-vfill.png

vDSP_vclr
float outVectorVclr[8];
vDSP_vclr(outVectorVclr, 1, 8);
vdsp4-vclr.png

vDSP_vdbcon
vDSP_vsaddの関数は入力と出力同じものを使えます。
これを覚えておくとわざわざ出力用のベクトルを用意する手間が省けます。
float inVector1[8] = {0, 1, 0.9, 0.5, 0.2, 0.1, 0.04, 0.01};
float outVectorVdbcon[8];
float mAdjust0DB;
mAdjust0DB = 1.5849e-13,
vDSP_vsadd(inVector1, 1, &mAdjust0DB, inVector1, 1, 8);
float one = 1;
vDSP_vdbcon(inVector1, 1, &one, outVectorVdbcon, 1, 8, 0);
vsdp4-vdbcon.png

参考サイト
Forever For Now - Vectorizing with vDSP and vecLib
dBとリニア値を変換する - Objective-Audio

[vDSP,メモ] vDSP関数の使い方3

vDSP関数の使い方について忘れないようにメモってみます。

この記事は、vDSP関数の使い方2の続きです。

今回は、関数の引数について詳しくみてゆきます。

前回学習したvDSP_vaddの引数のうち__vDSP_stride1と__vDSP_stride2について1を指定しました。
このストライドと呼ばれる引数についてみていきましょう。
vDSP_vaddの引数をリファレンスで確認してみます。
void vDSP_vadd (
   const float __vDSP_input1[],
   vDSP_Stride __vDSP_stride1,
   const float __vDSP_input2[],
   vDSP_Stride __vDSP_stride2,
   float __vDSP_result[],
   vDSP_Stride __vDSP_strideResult,
   vDSP_Length __vDSP_size
);
よりストライド1の引数を2に変更して実行してみます。
float inVector1[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float inVector2[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float outVectorAdd[8];
vDSP_vadd(inVector1, 2, inVector2, 1, outVectorAdd, 1, 8);
結果は次のようになります。
vdsp-add.png
ストライドの引数は、配列を何個おきに処理するかの指定です。
今回は、2を指定したので配列が1つおきに処理されます。

図に表すと次のようになります。
vdsp3-zu1.png

第一引数の配列が1つおきに処理されている事がわかります。

どんな時に使えるか?
インタリーブドの音声データなどは、LRの信号が交互に一つの配列に配置されています。
ストライドをうまく利用する事により右側の音声だけ処理するといった事が可能になります。

注意点
ストライドの値を大きくすると、読み込む配列の大きさが が処理の回数を越えてしまう事があります。
そのような場合は、予期せぬ値が返る可能性があるので注意して使う必要があります。

次回に続きます。

参考サイト
vDSPを使う(加減乗除編) | なんてこったいブログ
vDSPについてのメモ - 2:仙台単身赴任生活:So-net blog

[vDSP,メモ] vDSP関数の使い方2

vDSP関数の使い方について忘れないようにメモってみます。

この記事は、vDSP関数の使い方1の続きです。

前回は、ベクトルとベクトルの計算と命名規則について確認しました。
ベクトルとベクトルの計算について他にどのようなものがあるか確認してみる事にしましょう。

引き算
float inVector1[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float inVector2[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float outVectorSub[8];
vDSP_vsub(inVector1, 1, inVector2, 1, outVectorSub, 1, 8);
結果は次のようになります。
vdsp2-sub.png

掛け算
float inVector1[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float inVector2[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float outVectorMul[8];
vDSP_vmul(inVector1, 1, inVector2, 1, outVectorMul, 1, 8);
結果は次のようになります。
vdsp2-mul.png

割り算
float inVector1[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float inVector2[8] = {1, 2, 3, 2, 5, 3, 3, 2};
float outVectorDiv[8];
vDSP_vdiv(inVector1, 1, inVector2, 1, outVectorDiv, 1, 8);
結果は次のようになります。
vdsp2-div.png

ここで、命名規則を見てみましょう。
vDSP_vadd  vectorの足し算
vDSP_vsub  vectorの引き算
vDSP_vmul  vectorの掛け算
vDSP_vdiv   vectorの割り算
のようになってる事が確認できます。

ベクトルとスカラーの計算
ベクトルの値を一律に変更したい場合、ベクトルとスカラーの計算を行います。
vDSP_vsadd について詳しく見てみましょう。

リファレンスには、
void vDSP_vsadd (
   float *__vDSP_A,
   vDSP_Stride __vDSP_I,
   float *__vDSP_B,
   float *__vDSP_C,
   vDSP_Stride __vDSP_K,
   vDSP_Length __vDSP_N
);
Parameters
__vDSP_A
Single-precision real input vector
__vDSP_I
Stride for A
__vDSP_B
Single-precision real input scalar
__vDSP_C
Single-precision real output vector
__vDSP_K
Stride for C
__vDSP_N
The number of elements to process
Adds scalar B to each element of vector A and stores the result in the corresponding element of vector C.
とあり、スカラーBをベクターAにそれぞれ足し結果をベクターCで返す事がわかります。
それでは実際にこの関数を使ってみましょう。

足し算
float inVector1[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float outVectorVsadd[8];
float a = 10;
vDSP_vsadd(inVector1, 1, &a, outVectorVsadd, 1, 8);
結果は次のようになります。
vdsp2-vsadd.png

ベクトルの各値に、スカラー値が加算されている事が確認できます。

その他にも
足し算 / Vector-Scalar Addition
vDSP_vsadd
掛け算 / Vector-Scalar Multiplication
vDSP_vsmul
割り算 / Vector-Scalar Division
vDSP_vsdiv
などがあります。

命名規則
ベクトルとスカラーの計算では、vs(Vector-Scalar)が使われています。
ex) vDSP_vsadd

vDSP関数は数が多いのですが、命名規則を覚えてゆく事によって
関数の意味が名前から直感的に理解できるようになるでしょう。

次回に続きます。

[vDSP,メモ] vDSP関数の使い方1

vDSP関数の使い方について忘れないようにメモってみます。

vDSP関数は、ベクトルや行列の計算
フーリエ解析、窓の生成などを最適化して行なってくれるフレームワークです。

事前準備
このフレームワークを使う場合
Accelerate.frameworkを以下のように追加します。
vDSP1.png

ヘッダーファイルに
#import <Accelerate/Accelerate.h>
と記述しフレームワークをimportします。

実際につかってみよう
実際にどのように使うのかテストしてみましょう。
まずは、ベクトルとベクトル同時の計算を確認してみます。
// 計算したい2つのベクトルを準備する
float inVector1[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float inVector2[8] = {1, 2, 3, 4, 5, 6, 7, 8};

// 計算結果を入れる配列を準備する
float outVectorAdd[8];

// ベクトル同時の足し算を行う
vDSP_vadd(inVector1, 1, inVector2, 1, outVectorAdd, 1, 8);
結果は次のようになります。
vDSP-vadd.png

実際にこの関数について、リファレンスで調べてみましょう。
iOS版のvDSPのリファレンスは次のURLから確認する事ができます。
iOS Developer Library vDSP Reference

vDSP_vaddについて詳しくみてみましょう。
void vDSP_vadd (
   const float __vDSP_input1[],
   vDSP_Stride __vDSP_stride1,
   const float __vDSP_input2[],
   vDSP_Stride __vDSP_stride2,
   float __vDSP_result[],
   vDSP_Stride __vDSP_strideResult,
   vDSP_Length __vDSP_size
);
ベクトルとして、float型の配列を2つ渡して結果をfloat型の配列に返す
事がわかります。

関数の命名規則
iOS Developer Library vDSP Referenceをみると沢山の関数があります。
関数の数は多いのですが、命名規則があります。
どのような命名規則があるのでしょうか?
関数一覧を見てみましょう。

vDSP-D.png
この一覧を見るとまず、
vDSP_vadd
vDSP_vaddD
とDが付いているもの、付いていないもの
2つがある事が確認できます。

vDSP_vaddDについて、詳しく見てみましょう。
void vDSP_vaddD (
   const double __vDSP_input1[],
   vDSP_Stride __vDSP_stride1,
   const double __vDSP_input2[],
   vDSP_Stride __vDSP_stride2,
   double __vDSP_result[],
   vDSP_Stride __vDSP_strideResult,
   vDSP_Length __vDSP_size
);
ベクトルとして、doublet型の配列を2つ渡して結果をdoublet型の配列に返す
事がわかります。

関数名の最後にDがついているものはdoublet型を渡し、
何もついていないものはfloat型を渡すという命名ルールになっている事が確認できます。

この命名規則は、
vDSP Programming Guide Naming and Data Type Conventions
から確認する事ができます。

その他の命名規則は、
vDSPについてのメモ - 2:仙台単身赴任生活:So-net blog
が大変参考になります。

次回は、実際に他の関数も試してみます。


参考サイト
Forever For Now - Vectorizing with vDSP and vecLib