投稿

[Swift] Music Sequenceで再生しているMIDIデータの情報を表示

Music Sequenceを使ってMIDIデータを再生している時に、なっている音を鍵盤で表示したい! ということで、色々調べてたのですが、多いのは、MIDIのInputPortまたはOutputPortにCallbackを仕込んで通知する方法でしたが、この方法だと、バックグランドモードを有効化しないと動作してくれない。 試行錯誤の結果、バックグランドモードを無効にしたまま、MIDIの再生データを表示することが出来たのでご紹介。 環境 Xcode 10.2 ターゲットOS iOS 9.0 コールバック用の関数定義 クラスの関数として実装 func musicSeqenceCallback(sequence: MusicSequence, track: MusicTrack, eventTime: MusicTimeStamp, data: UnsafePointer&ltmusiceventuserdata&gt, startSliceBeat: MusicTimeStamp, endSliceBeat: MusicTimeStamp) -> Void { // 処理したい内容 let dat = data.pointee.data let idx = Int(eventTime) print(String(format: "%d - %d",dat, idx)) } コールバック関数の割り当て クラスのinit()内で実装 func seqCallback(inClientData: UnsafeMutableRawPointer?, inSequence: MusicSequence, in...

[Other] QNAPのセキュリティ設定について

イメージ
つい最近、見慣れないIPアドレスから管理コンソールへのログインが試されたようで、IPブロックリストに上がってました。 3秒間隔でリトライされてたようなので、ハッキングを受けてた可能性があります。 自宅外からNASにアクセスすることはないため、外出時はネットワークを切ってるのですが、自宅にいるときはネットワークが繋がってるので、真面目に対策を行うきっかけになりました。 セキュリティーカウンセラーの導入 QNAPのセキュリティ状況を診断してくれるツールがあるようで、とりあえず導入してみました。 ポリシーは、どれがいいのか分からなかったので、Intermediateで設定してみました。 セキュリティチェックをした結果、「高リスク」って出るんですよね。 ネットワークアクセス保護 何が高リスクになっているかというと、ネットワークのアクセス保護の設定のようです。 ネットワークのアクセス保護の設定はというとですね、無効になっててさわれないんですよね。 今のネットワーク設定はというと、自宅外から使うことはないので、 自宅のセグメントを許可リストに追加して、その他をブロックしてます。 アクセス元が限定的な場合は、拒否リストを作るよりも、許可リスト作る方が確実な気がしてます。 許可リストを作ると、ネットワーク保護が無効になり設定ができない。 拒否リストを作ると、ネットワーク保護が有効になるが拒否リストから漏れると、攻撃を受ける可能性が出てくる。 セキュリティという意味では、許可リストが最強な気がするのですが、 この設定では「高リスク」と判定される。 なんか納得ができない結果です。 アプリケーションのインストール設定 「QNAPストア以外のアプリをインストールできなくする」 これは、非公認アプリのインストールをブロックする設定ないので、良いと思ったのですが、これにも問題がありましてね。。。 このアプリは、マルウェアを検知して、隔離してくれるそうなのですが、 「QNAPストアからインストールされたものではない」と識別されます。 アプリの説明を見ると、作成者は、「QNAP Systems, Inc.」となってるのですけどね。 ...

[Other] QNAP TS231+ のHDDを交換

イメージ
先日、NASのHDDから異常が検知されました。 HDD2本でRAID1を組んでたので、データが消えたわけではないのですが、このまま放置するわけにも行かないので、同じモデルのHDDを調達して入れ替えを行いました。 HDD準備 Western Digital Red 4TB まさか、79日程度で交換することになるとは思いませんでした。 HDDの取り外し 障害が出ているディスクを選んで、 「アクション>取り外し」 で、RAIDグループから取り外します。 取り外すと、「ディスクが存在しません」となります。 これで、NASからHDDを取り出します。 新しいHDDを取り付けて、はめ込むと安心の緑ランプが転送しました。 再構築 HDDを取り付けでしばらくすると、HDDの取り付けを自動で認識して、再構築(リビルド)が始まります。 あとは、とりあえず待つだけです。 自動で色々やってくれるのは便利ですねー。 今回、壊れたHDDは、WD Red ですが、このモデルはNAS用で24時間365日稼働を想定したものらしいのです。 故障率は低いそうですが、運が悪かったのか、使い方が悪かったのか。。。 基本的に日中は家にいないので、電源は落としてたりします。 稼働しているのは週末だけ の使い方が悪かったのかもしれないですね。 今度は、24時間電源を付けっ放しにしてみようと思います。

[Other] T-POINTで購入したミックスナッツ

イメージ
期限付きのT-POINTが期限切れ間近で、失効するのも勿体無いので、ポイントで買えるものを探してみました。 aemotion - ミックスナッツ : 500g 普段、近所のお店で購入しているミックスナッツとは違って、 この商品には、【黒大豆】と【レーズン】が入ってます。 黒大豆の色が結構目立って、見た目には暗い色合いになりますが、黒大豆が香ばしくて美味しい。 ナッツの中にレーズンが混ざることで、良いアクセントになってます。 今回は、お試しで購入してみましたが、黒大豆が私的には当たりです。 他のミックスナッツでは、みたことない気がします。 また、ポイントが溜まったら購入しようと思います。 あと、気になる点としては、 今回、T-POINTで全額支払いしたのですが、 お店にお金がどう流れているのか? です。 カード決済だと、 1. カード会社からお店 2. 購入者からカード会社 で、お金は流れますが、ポイントの場合だとお金が動いてないので、 会計仕訳とかどうなるのでしょうかね〜。

[Swift] MIDIデータの再生

先日のApp審査の却下を受けて、UIBackgroundModes Keyをオフにして再生する方法を調査。 結論としては、AudioKitのフレームワークは使用せず、Appleが提供しているフレームワークで実現することにしました。 シーケンサー MIDIデータを再生するために、下記のオブジェクト利用。 var musicSequence : MusicSequence? var musicPlayer : MusicPlayer? var musicTrack : MusicTrack? これだけだと、サウンドフォントを使った再生がうまくできなかったので、AUGraphも使いました。 var processGraph : AUGraph? var chordUnit : AudioUnit? var ioUnit : AudioUnit? var chordNode = AUNode() var ioNode = AUNode() まずは、初期化。 init() { NewAUGraph(&processGraph) NewMusicPlayer(&musicPlayer) NewMusicSequence(&musicSequence) MusicSequenceNewTrack(musicSequence!, &musicTrack) MusicSequenceSetAUGraph(musicSequence!, processGraph) MusicPlayerSetSequence(musicPlayer!, musicSequence) setup() loadSF2Preset(unit: chordUnit!) } private func setup() { var cd:AudioComponentDescription = AudioComponentDescri...

[iOS] Appの審査

イメージ
先日、Appを審査に出したら、Rejectされました。 Rejectの理由 申請したAppは、バックグランドモード有効(Audio)となっているが、バックグランドモードにしても音がならないよ! ってことらしい。 はい。 フォアグランドの利用しか想定していないので、バックグランドモードでは音がならなくても問題ないです。 では、なぜ、バックグランドモードを有効にしたのか? 答えは、エラーを回避するため です。 Appで何が起きているのか Background Modesをオフにします。  で、Appを実行してみます。 AKMIDISampler()の実行前 AKMIDISampler()の実行後 AKMIDI.swift:init():63:Initializing MIDI CheckError.swift:CheckError:179:Error: kMIDINotPermitted: Have you enabled the audio background mode in your ios app? フレームワーク(AudioKit)でエラーが発生します。 バックグランドモードが有効になってない! だって。 kMIDINotPermitted・・・は、CoreMIDIのエラーのようなので、AudioKitのエラーというよりは、Appleで提供されているモジュールのエラーと思われます。 バックグランドモードを有効にすると、このエラーは出なくなります。 バックグランドで再生はしないので、できることならバックグランドモードは無効にしたい。 一方で、AppleのDocumentには、 Beginning in iOS 6, apps need to have the   audio   key in their   UIBackground Modes   in order to use CoreMIDI’s   MIDISource Create(_: _: _:)   and   MIDIDestination Create(_: _: _: _: _:) ...

[Swift] UISliderをカスタマイズしてみる

イメージ
iOSの標準コントロールに、UISliderというのがありますが、現在の値を表示したいと思ったことはないでしょうか。 プロパティを探してもそれらしいものが見つけられなかったので、UISliderを継承してオブジェクトを作ってみました。 UISlider 今回作成するオブジェクト 環境 MacOSX 10.14 Xcode 10.1 Swift 4 Target iOS 9.0 実現する内容 スライダーの値を表示する スライダーの上に見出し(タイトル)を表示する 増加量(ステップ量)を指定できるようにする 実装 SUISlider UISliderを継承して、SUISliderを作成します。 ソースの全体像は下記の通りです。 import UIKit public class SUISlider : UISlider { var labelTitle: UILabel var valueWidth: CGFloat = 60 var stepValue : Float = 0 private var labelValue: UILabel private let SPACING: CGFloat = 8 public override init(frame: CGRect) { labelTitle = UILabel() labelValue = UILabel() labelValue.textAlignment = NSTextAlignment.right super.init(frame: frame) self.addSubview(labelTitle) self.addSubview(labelValue) self.addTarget(self, action: #selector(self.onValueChanged(sender: )), ...