2011/11/19

Music Sequence についての内容 ※間違いが含まれている場合があるので注意

CABarBeatTime

#if TARGET_OS_IPHONE
// CAClock is currently not supported on iOS, so we include the definition of this structure here 
// (otherwise we include the CAClock header
/*!
    @struct     CABarBeatTime
    @abstract   A display representation of a musical time in beats.
    
    @field  bar
                A measure number.
    @field  beat
                A beat number (1..n).
    @field  subbeat
                The numerator of the fractional number of beats.
    @field  subbeatDivisor
                The denominator of the fractional number of beats.
    @field  reserved
                Must be 0.
    @discussion
                A clock's internal representation of musical time is in beats based on the
                beginning of the timeline. Normally, such times should be displayed to the user
                in terms of bars, beats, and subbeats (sometimes called "units" or "parts per
                quarter" [PPQ]). This data structure is such a display representation.

                By convention, bar 1 is the beginning of the sequence. Beat 1 is the first beat
                of the measure. In 4/4 time, beat will have a value from 1 to 4. Music
                applications often use beat divisions such as 480 and 960.
*/
struct CABarBeatTime {
    SInt32              bar;
    UInt16              beat;
    UInt16              subbeat;
    UInt16              subbeatDivisor;
    UInt16              reserved;
};
typedef struct CABarBeatTime CABarBeatTime;
#else
    #include 
#endif

iOS は現在 CAClock に対応していないので、CABarBeatTime を利用する。 その名の通り、CoreAudio を小節・拍の時間を扱うもの。

  • bar - 小節
  • beat - 拍
  • subbeat -サブ拍
  • subbeat -サブ拍の区切り
  • subbeatDivisor
  • reserved - 未使用

MusicSequenceUserCallback

[ccp] typedef struct OpaqueMusicPlayer *MusicPlayer; typedef struct OpaqueMusicSequence *MusicSequence; typedef struct OpaqueMusicTrack *MusicTrack; typedef struct OpaqueMusicEventIterator *MusicEventIterator;

/! @typedef MusicSequenceUserCallback @discussion See MusicSequenceSetUserCallback */ typedef void (MusicSequenceUserCallback)( void *inClientData, MusicSequence inSequence, MusicTrack inTrack, MusicTimeStamp inEventTime, const MusicEventUserData *inEventData, MusicTimeStamp inStartSliceBeat, MusicTimeStamp inEndSliceBeat);

/*! @enum MusicPlayerErrors @constant kAudioToolboxErr_InvalidSequenceType @constant kAudioToolboxErr_TrackIndexError @constant kAudioToolboxErr_TrackNotFound @constant kAudioToolboxErr_EndOfTrack @constant kAudioToolboxErr_StartOfTrack @constant kAudioToolboxErr_IllegalTrackDestination @constant kAudioToolboxErr_NoSequence @constant kAudioToolboxErr_InvalidEventType @constant kAudioToolboxErr_InvalidPlayerState @constant kAudioToolboxErr_CannotDoInCurrentContext */ enum { kAudioToolboxErr_InvalidSequenceType = -10846, kAudioToolboxErr_TrackIndexError = -10859, kAudioToolboxErr_TrackNotFound = -10858, kAudioToolboxErr_EndOfTrack = -10857, kAudioToolboxErr_StartOfTrack = -10856, kAudioToolboxErr_IllegalTrackDestination = -10855, kAudioToolboxErr_NoSequence = -10854, kAudioToolboxErr_InvalidEventType = -10853, kAudioToolboxErr_InvalidPlayerState = -10852, kAudioToolboxErr_CannotDoInCurrentContext = -10863 }; シーケンサー利用時のユーザ定義コールバック関数型 シーケンサーにMusicEventUserData が存在する場合、呼び出される。 MusicSequence、MusicTrack、MusicTimeStamp、MusicEventUserData 対応 MusicPlayerErrorsを 持つ

MusicTrackProperties

/*!
    @enum MusicTrackProperties
    @discussion Property values are always get and set by reference
    
    @constant   kSequenceTrackProperty_LoopInfo
        read/write  - MusicTrackLoopInfo
        The default looping behaviour is off (track plays once)
        Looping is set by specifying the length of the loop. It loops from
            (TrackLength - loop length) to Track Length
            If numLoops is set to zero, it will loop forever.
        To turn looping off, you set this with loop length equal to zero.

    @constant   kSequenceTrackProperty_OffsetTime
        read/write  - MusicTimeStamp
        offset's the track's start time to the specified beat. By default this value is zero.
        
    @constant   kSequenceTrackProperty_MuteStatus
        read/write  - Boolean
        mute state of a track. By default this value is false (not muted)
        
    @constant   kSequenceTrackProperty_SoloStatus
        read/write  - Boolean
        solo state of a track. By default this value is false (not soloed)

    @constant   kSequenceTrackProperty_AutomatedParameters
        read/write  - UInt32
        Determines whether a track is used for automating parameters.
        If set to != 0 the track is used to automate parameter events to an AUNode.
        The track can only contain parameter events and these events are interpreted 
        as points in the automation curve
        
    @constant   kSequenceTrackProperty_TrackLength
        read/write  - MusicTimeStamp
        The time of the last event in the track plus any additional time that is allowed for fading out of ending notes
        or round a loop point to musical bar, etc.
        
        If this is not set, the track length will always be adjusted to the end of the last active event in a track and 
        is adjusted dynamically as events are added or removed.
        
        The property will return the max of the user set track length, or the calculated length
        
    @constant   kSequenceTrackProperty_TimeResolution
        read only   - SInt16 (only valid on the Tempo track)
        
        This retrieves the time resolution value for a sequence. This time resolution can be the resolution that
        was contained within the midi file used to construct a sequence. If you want to keep a time resolution
        when writing a new file, you can retrieve this value and then specify it when creating a new file from a sequence.
        
        It has no direct baring on the rendering or notion of time of the sequence itself (just its representation in file
        formats such as MIDI files). By default this is set to either:
            480 if the sequence is created manually
            some_value based on what was in a MIDI file if the sequence was created from a MIDI file        
*/
enum
{
    kSequenceTrackProperty_LoopInfo = 0,
    kSequenceTrackProperty_OffsetTime = 1,
    kSequenceTrackProperty_MuteStatus = 2,
    kSequenceTrackProperty_SoloStatus = 3,
    // added in 10.2
    kSequenceTrackProperty_AutomatedParameters = 4,
    // added in 10.3
    kSequenceTrackProperty_TrackLength = 5,
    // added in 10.5
    kSequenceTrackProperty_TimeResolution = 6
};

プロパティの値は、常に参照によるgetter、setter を用意している。 コンスタント kSequenceTrackProperty_LoopInfo = ループ情報。デフォルトのループは OFF(1回だけ再生) kSequenceTrackProperty_OffsetTime = 指定したビートにトラックのスタート時間(MusicTimeStamp)へオフセットする。デフォルトは0 kSequenceTrackProperty_MuteStatus = トラックのミュート状態。デフォルトは無効 kSequenceTrackProperty_SoloStatus = トラックのソロ状態。デフォルトは無効

MusicTrackLoopInfo

/*!
    @struct     MusicTrackLoopInfo
    @discussion Used to control the looping behaviour of a track
*/
typedef struct MusicTrackLoopInfo
{
    MusicTimeStamp      loopDuration;
    SInt32              numberOfLoops;
} MusicTrackLoopInfo;

loopDuration = ループの長さ numberOfLoops = ループの回数

  2011/11/18

GDD 2011 では Web Audio API の反響が良かったですね。

ドラムサンプル

基調講演ででもしてたサンプル WebAudio Drum HTML5 で作るっていう点ではかなり注目でした。 テンポも変えられるし、何よりデザインがかっこいい!

リアルタイムセッション

Plink by Dinahmoe (Web Audio API) YAMAHA でもネットワークセッションのネタが話題になりましたが、これも結構凄いと思いました。 DAW やってる人ならわかるかと思いますが、レイテンシーって凄くシビアなんですよね。 それをネットワークでやるってのは想像以上に大変そう。 プロユースには難しいかと思いますが、ユーザのコミュニティには十分かと思いました。

ピアノサンプル

Sound Toy 楽器アプリも簡単に!? というか、各楽器の音を波形を自ら作ってるんですかこれ?

Chordlead でサンプリング方式で再生機能をつけてますが、FM音源方式はちょっと大変そう。。。

ちょっとだけ、ソースを見てみたけど、オーディオバッファや音程等は webkitAudioContext で全て管理してるようです。


SoundToy.prototype.noteOn = function( note )
{
    var id = this.mId;

    note += this.mOctave*12;

    this.mId = (this.mId+1) % 8;

    // copy data
    var dbuf = this.mBuffer[id].getChannelData(0);
    var num = this.mSLen;
    var sbuf = this.mSamples[note];
    for( i=0; i

MIDI シーケンサーは自作っぽいです。 ライブラリとかあるんですかね?

音声認識サンプル

inputタグに「x-webkit-speech」をつけると音声を認識します。 webkitspeechchangeイベントリスナーで、音声認識の結果を出力しています。

マイクボタンを押して話しかけて下さい。

ソース




          document.getElementById("speech-input-textbox").addEventListener("webkitspeechchange", function(event) {
            var speechresults = document.getElementById('speech-results');
            speechresults.innerHTML = '';
            for (var res in event.results) {
              speechresults.innerHTML += 'Utterance: ' + event.results[res]['utterance'] + '
Confidence: ' + event.results[res]['confidence'] + '

'; } }, false);

HTML5 オフライン機能

資料

  2011/11/17

【Google Developer Day 2011 Japanレポート】

HTML5 最前線

Google App Engine の最新情報

Google クラウド技術を駆使した統合アプリケーションの構築

クラウド上でイケてるゲームを構築しよう

資料

Playn

今までにないサイトを作る:HTML5 による最新ウェブアプリ

資料

DJ Break Point

io-reader

■MVCフレームワーク - Sproutcore - backbone.js - Ext-JS4(Sencha)

■参考サイト [GDD2011][HTML5]今までにないサイトを作る:HTML5 による最新ウェブアプリ

Web Audio API

Getting Started with Web Audio API

  2011/11/17
Drop in images from your desktop

  2011/11/17

  2011/11/17

Titanium Studio の設定をもう少しカスタマイズしたいと思うも、Eclipse 標準設定やらAptana Studio の設定やらが混在していてちょっとわかりにくいので個人メモ。

「Titanium Studio > Preferences...」でほとんど設定できるかと思います。 Titanium Studio

タブスペース設定

個人的にはタブは嫌いなので、半角スペースに置き換えます。 まずグローバルな設定は、General > Editors > Text Editors で 【Insert spaces for tabs】 にチェック。 タブ幅は、Displayed tab with で「2」にしました。 ※一部ファイル種別によっては個別に指定する事もできます

カラー設定

色々アップデートしてたら、js ファイルだけセンテンスが真っ黒に! Titanium Studio

グローバルの設定だとテーマ設定ができます。 Titanium Studio

が、自分は js ファイルだけおかしいようなので個別に設定してみる。 JavaScript > Syntax Coloring を開く。 Titanium Studio

Appearance color options: 欄があるので、ここでカラーを設定 Titanium Studio

  2011/11/17

GDD DevQuiz 2011 をやらずじまいだったので、ちょっとチェックしてみた。 そしたら、Google App Scripts なるものを今更知りました。。。

Google App Scripts は、Excel の VBA にあたるもので、Google Spreadsheet で利用できます。 JavaScript なので Web系の人にはすんなり入れるかと。

外部 JSON データを読み込んでみるサンプル


function loadCityData() {
    var data = UrlFetchApp.fetch(url); 
    var json = Utilities.jsonParse(data.getContentText());
    ...
}

そして、デバッガーまでついてます! これは、デベロッパーじゃなくて一般の人でも覚えておいてよい技術じゃないでしょうか?

「できるExcel!」から「できる Google Spreadsheet! 」みたいな

  2011/11/16

会社の組織上、サポート部隊が社外に常駐しているのでコミュニティがとりにくい!

それを解決してくれるのが、社内SNSです。 うちの会社でも Yammer を導入してみました。

記事は古いですが、Yammer、SMART、Chatter~代表的な3つの社内 Twitter サービスを使ってみた で比較が書かれています。 今では日本語も対応してるし、Pagesの機能が良いですね。 利用実績の面から見ても、Yammer がとりあえず無難かな?と。 ただ管理機能とかは有料になるので、そこら辺がひっかかります。

あと、開発用のAPIも公開されています。

Yammer Developer

https://www.yammer.com/company/api

http://developer.yammer.com/

Yammer 標準の Air アプリもこのAPIを使って通信してるんですね(多分) これで、オリジナルアプリと連動も可能だ!

  2011/11/10

IDE 環境の選択にずっと迷ってたけど、Titanium Studio の選択もありかな?と思うようになりました。 Aptana Studio でもあり、Eclipse ベースですしね。

vimプラグイン

[Eclipse] Vrapper でvim風にする でも書いた通り、Vrapper を利用。

Vrapper

SVN

本当は、標準の Git で良いのだが、会社で SVN の資産が大きいのでインストール Aptana のSubversion ページでインストール方法が記載されている。

デフォルトだとURLが登録されていないようなので、Eclipse Helios Update Site を追加して検索 SVN

「SVN」で検索して Team Provider をインストール SVN

で、終わりと思ったら、エラーでそのまま使えない模様(Eclipseのバージョン影響?) 再度インストール選択していく。 SVN

SVN

  2011/11/10

たまには雑感な日記でも。

昨日、FlexUG に言って知ったのですが・・・。 特に驚きもありませんが、Adobe は HTML5、AIR にいっそう注力できて逆に良いんじゃないでしょうか?

スマフォやりたい Flasher さんは AIR でとりあえず生き残れるわけですし

同じような ECMA Script ですしね。

スマフォの3Dアニメーション系に関しては Flash は消えたので、ネイティブで OpenGL、Unityでアプリを作るのがやはり標準化でしょうか?

HTML5 となると WebGL が標準になるでしょうが、今はまだ Windows95時代のような空気ですので、端末やネットワークの性能向上に比例していくんだと思います。

ただ開発ツールにおいては業界標準になるソリューションがなく、混沌としてるので良い意味では今は色んなやり方でお金なる、悪く言えば今は生産性が低くなる傾向があるので、エンジニアの能力に凄く左右されるな?と身が引き締まる思いです。 先日の GGD でも HTML5 のサンプルは高レベルなアプリの紹介がありましたが、それを物語ってました。

これから、HTML5 に関する情報は今まで以上にチェックしないといけない時代になった事は確かでしょうが、ブラウザ戦争の終戦を実に願うところです。

HTML Rocks の WebGL デモ

WebGL demo roundup

Mojito, Manhattan

米Yahoo!がJavaScriptフレームワーク「Mojito」と、Node.jsのホスティング環境「Manhattan」発表。同一コードをブラウザ、サーバ、iOSアプリで実行可能

FireFox アドオン「Tilt」

まるで映画!? Webページを3Dで表示するFirefoxアドオン登場

Mozilaの HTML5 & Friends

MozilaのHTML5サンプルダッシュボード

Soundcloud HTML5化

areweplayingyet.org

Google Chrome Deveoper Tools ネタ

「Google Chrome Deveoper Tools」はこう使う!

pngファイルの軽量化
Google DriveのIconを再起的に削除
php-markdownでバニラPHPなコードブロック処理
laravel-ffmpeg を使う
2021年版 Ubuntu + certbot + Let's Encrypt でサーバ証明書設定
GihHub のデフォルトでない master ブランチを checkout する
マルチログインで未認証のリダイレクト
Homebrew で Redis をインストール
CSS だけでスムーズスクロール
EC-CUBE4 で Gmail の smtp を利用する
Amazon Linux 2 の amazon-linux-extras とは
UNIQUE カラムのバリデーションで自分自身を除外して更新
フォーム有効期限切れで Page Expired をリダイレクト
ログを日付でローテーションやクリアや削除
Homebrew で PHP8.0 から PHP7.4 にダウングレード
Big sur で zsh 移行と Homebrew アップグレード
Mac に minikube をインストール
途中から .gitignore に追加する
Larevel 6.x から Laravel 8.x にバージョンアップ
Composer で Allowed memory size (メモリ不足)エラー
Blade でカスタムクラスを利用する
git push git pull にブランチ指定せずに実行する
git pull や git push できなくなったとき
Docker のコンテナからホストOS に接続
Mac で ローカル IP アドレス(ipv4)のみを表示する
ホストOS から Docker の MySQLコンテナに接続
caching_sha2_password のエラー
node-config で環境設定ファイルを利用する
rootパスワードを初期化(再設定)する
Git から clone したときのエラー対処
Mac に MySQL をインストール
Mac に PostgreSQL をインストール
Laravel 環境構築 - Mac ネイティブ編
Firebase 入門 - Firebase とは
Firebase 入門 - CLI インストールとデータベースの設定
AWS 無料枠(t2.micro)で容量とメモリエラー
Cloud9 を起動する -初心者編-
gcloud で GCEインスタンスを起動してみる
AWS CLI と jq でインスタンス一覧を整形して表示
React と Laravel7 のプロジェクトを作成する
Homebrewインストール-2020年版
3直線で囲まれた範囲塗りつぶし
PuLP で線形最適化問題を解く
カスタムのペジネーションを作る
node-sass を使って sass をコンパイルする
Log ファサードでSQLログを分離して書き出す
いちから始める Docker - 複数のコンテナを使う - (2020年)
いちから始める Docker - docker-compose を使う - (2020年)
AWS ECR を使ってみる
Laravel7 でマルチ認証