mieki256's diary



2013/09/02(月) [n年前の日記]

#1 [haxe] Haxeで音を鳴らす実験

FlashDevelop + Haxe3 + OpenFL とやらで音が鳴らせるか実験中。一応鳴らせたように見えるけど…。

_Flash版
_html5版 (Firefox、Google Chrome、Opera は鳴る。IE10 と Safari は鳴りません)

サウンドファイルは、assets/sound/以下に入れておくとして。
.
├─assets
│  │  openfl.svg
│  │
│  ├─img
│  └─sound
│          bgm.mp3
│          bgm.ogg
│          bgm.wav
│          se1.mp3
│          se1.ogg
│          se1.wav
│          se2.mp3
│          se2.ogg
│          se2.wav

application.xml
<?xml version="1.0" encoding="utf-8"?>
<project>
    <!-- NMML reference: https://gist.github.com/1763850 -->
    
    <!-- metadata, make sure 'package' is at least 3 segments (ie. com.mycompany.myproject) -->
    <meta title="haxe_openfl_sound" package="haxeopenflsound" version="1.0.0" company="mieki256" />
    
    <!-- output -->
    <app main="Main" file="haxeopenflsound" path="bin" />
    
    <window background="#CCCCCC" fps="60" />
    <window width="640" height="360" unless="mobile" />
    <window orientation="landscape" vsync="false" antialiasing="4" if="cpp" />
    
    <!-- classpath, haxe libs -->
    <source path="src" />
    <haxelib name="openfl" />
    <haxelib name="actuate" />
    
    <!-- assets -->
    <icon path="assets/openfl.svg" />
    <assets path="assets/img" rename="img" />
    <assets path="assets/sound" rename="sound" />
    
    <assets path="assets/sound/se1.mp3" id="se1" if="flash" />
    <assets path="assets/sound/se2.mp3" id="se2" if="flash" />
    <assets path="assets/sound/bgm.mp3" id="bgm" if="flash" />
    
    <assets path="assets/sound/se1.ogg" id="se1" unless="flash" />
    <assets path="assets/sound/se2.ogg" id="se2" unless="flash" />
    <assets path="assets/sound/bgm.ogg" id="bgm" unless="flash" />
    
    <!-- optimize output
    <haxeflag name="-dce full" /> -->
    
</project>
肝(?)は、以下の部分。
    <assets path="assets/sound/se1.mp3" id="se1" if="flash" />
    <assets path="assets/sound/se1.ogg" id="se1" unless="flash" />
サウンドファイルにidを割り当てつつ、flash と flash以外で、使うファイルを変える。

Main.hx
package ;

import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.Lib;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.text.TextField;
import openfl.Assets;

/**
 * Haxe + OpenFLでサウンドを鳴らすテスト
 * @author mieki256
 */

class Main extends Sprite 
{
    var inited:Bool;

    var bgm:Sound;
    var se1:Sound;
    var se2:Sound;
    
    var sekind:Int;
    
    /* ENTRY POINT */
    
    function resize(e) 
    {
        if (!inited) init();
        // else (resize or orientation change)
    }
    
    function init() 
    {
        if (inited) return;
        inited = true;
        
        if (false) {
            // application.xml 内で使うファイルを変えた場合
            
            // BGM
            bgm = Assets.getSound("bgm");
            
            // SE read
            se1 = Assets.getSound("se1");
            se2 = Assets.getSound("se2");
        } else {
            // ソース内で使うファイルを決めていく場合
            
            var ext:String = "ogg";
            
            #if flash
            // flash出力時はここを通る
            ext = "mp3";
            #elseif html5
            // html5出力時はここを通る
            ext = "ogg";
            // ここで canPlayType() を使って対応形式を判別できれば
            // 対応ブラウザを増やせるのだけど…
            #end
            
            // BGM
            bgm = Assets.getSound('sound/bgm.$ext');
            
            // SE
            se1 = Assets.getSound('sound/se1.$ext');
            se2 = Assets.getSound('sound/se2.$ext');
        }

        // BGM 再生開始
        var channel:SoundChannel = bgm.play(0, 9999);

        #if (flash || neko)
        // 音量変更。html5出力時は利用できないみたい
        var trans = channel.soundTransform;
        trans.volume = 0.5;
        channel.soundTransform = trans;
        #end

        // 文字表示
        var tf:TextField = new TextField();
        tf.selectable = false;
        tf.text = "Click me!";
        tf.textColor = 0x333333;
        tf.width = 640;
        Lib.current.stage.addChild(tf);
        
        sekind = 0;
        
        // マウス左クリック時のイベントを登録
        Lib.current.stage.addEventListener(MouseEvent.CLICK, onMouseDown);
    }

    /**
     * マウス左クリック時の処理
     * @param e
     */
    function onMouseDown(e:MouseEvent):Void
    {
        // SEを鳴らす
        if (sekind == 0) {
            se1.play();
        } else {
            se2.play();
        }
        sekind = (sekind + 1) % 2;
    }

    /* SETUP */

    public function new() 
    {
        super();    
        addEventListener(Event.ADDED_TO_STAGE, added);
    }

    function added(e) 
    {
        removeEventListener(Event.ADDED_TO_STAGE, added);
        stage.addEventListener(Event.RESIZE, resize);
        #if ios
        haxe.Timer.delay(init, 100); // iOS 6
        #else
        init();
        #end
    }
    
    public static function main() 
    {
        // static entry point
        Lib.current.stage.align = flash.display.StageAlign.TOP_LEFT;
        Lib.current.stage.scaleMode = flash.display.StageScaleMode.NO_SCALE;
        Lib.current.addChild(new Main());
    }
}
肝は、
 se1 = Assets.getSound("se1");
 se1.play();
だろうか…。xml内で、各サウンドファイルにidを割り当ててあれば、ide文字列を指定するだけで読み込める・再生できるはず。

flash、neko で出力したら鳴ってくれた。

html5 で出力した場合は問題有り。
canPlayType() を使えれば、ブラウザで対応しているサウンドフォーマットを判別して、拡張子を変更して、対応ブラウザを増やすこともできそうなのだけど。Haxe3 でそれをやる方法が分からず。

まあ、全てのブラウザ上で音を鳴らしたいなら、Flash で出力すればいいだけの話なんだけど…。

#2 [haxe] Flash上におけるmp3のループ再生

Haxe3 + OpenFL で Flash を出力した際、mp3をループ再生したらちゃんとループして聞こえたので首を捻ったり。数年前に試した際には、曲の始まりだか終わりだかでプチプチ切れてたような記憶があるのだけど…。

mp3 には、ギャップと呼ばれる無音部分がえてして入ってしまう。元々、映像とくっつけて使うことを前提にして作られた音声フォーマットなので、曲の長さがフレーム単位?なのだそうで。波形の長さがその単位と一致しない場合は無音が入る。だから、曲と曲が繋がって聴こえるCDアルバムをmp3に変換して連続再生したり、ループ再生したりすると、無音の部分も入ってしまって、プチプチ切れた感じで聴こえたりする。

Flash は基本的に mp3 しか再生できないけれど。 *1 Adobe Flash CS* で書き出した場合は、そのあたりを上手い具合に処理してくれる。wavを素材データとしてツッコむと、mp3に変換する際、ちゃんと繋がって聴こえるように謎調整してくれるようで。内部で何をやっているのか ―― ギャップ情報を別途持たせて無音部分をスキップして再生しているのか、あるいは波形の一部を生成・削除してるのか、そこまでは分かりませんけど。

しかし、フリーでFlashを作れる関連ソフト・ツールは、そこまでやってくれない。…数年前までは、そのはずで。仕方ないから、当時はサウンド部分だけ Flash CS* で書き出した記憶があり。

でも、今回、Haxe3 + OpenFL でやってみたら、ちゃんと繋がって聴こえたので、これはどうしたことだろうと。…以下の可能性があり得るかな、と。
  1. Flash Player が改善されて、ギャップ情報を持ってる mp3 に対しては、イイ感じに処理をしてくれるようになった?
  2. mp3変換に使ってる LAME のバージョンが上がって、Flash Player が利用可能なギャップ情報も mp3 に埋め込んでくれるようになった?
  3. Haxe から出力された Flash は、そのあたりをイイ感じに処理してくれる?
  4. たまたま偶然、フレーム単位で一致するmp3ができちゃった?
  5. 自分の耳が腐っていて、ノイズを聞き取れてないだけ?
何にせよ、ちゃんとループ再生ができてるようで、ありがたいなと。…自分の耳が腐ってなければ、ですけど。

ちなみに、html5 で出力すると ―― ブラウザ上で ogg をループ再生すると、ループ部分でガッチリ無音が入りました。Firefox が一番酷い。Google Chrome と Opera は、無音部分がちょっと短い感じ。まあ、どのブラウザでもしっかり無音が入るので、どのみち綺麗にループしてるようには全然聞こえませんけど。HTML5陣営は、このあたり、いつになったら修正するのだろう…。まあ、各ブラウザの対応フォーマットが、未だに mp3 と ogg に分かれてる時点で、音に関しては Flash を使い続けるしかないのかな、とも思うのですけど。PC用はそれでもいいけど、スマホはどうなるんだろう…。
*1: 自力で頑張ればPCM相当も扱えるらしいけど…。

#3 [zatta] カタカナの起源は新羅説

NHKのニュースを流してたら、カタカナの起源は新羅にあるという説が紹介されてたのだけど。気になって検索してみたら、2009年頃にもそういう話が出ていたようで。…なんで今頃になって報道されてるのだろう?

さらにググってたら、 _片仮名 - Wikipedia でも異説として紹介されてたことを知った。2002年頃から出ていた説、なのですな…。

個人的には、なんだかちょっと頼りない説だなあ、と思えたり。

仮にその説が本当なら、その新羅時代のアレコレに、カタカナと似た字形が残ってそうなものだけど…。角筆の跡とやらだけでは、説として弱くないかと…。また、Wikipedia にも記述があるけど、角筆の跡とやらは年代特定が難しいから、日本に届いてからガリガリやってた可能性はないのだろうか。奈良時代の紙だからガリガリしてたのも奈良時代、ってちょっと安直すぎないか…。まあ、そのガリガリ字形が新羅に残ってるアレコレと同じ、というところまで調べた上での説なのかなとも思うけど。日本でガリガリされたなら、日本のカタカナの原型がガリガリされてるはずだよな…。

しかし、新羅に起源があるなら、カタカナ相当はまず新羅で普及してそうな気もするのだけど。どうしてハングルが普及するまで、あの半島に、字形を省略したソレが普及しなかったのか、という疑問も。…でも、日本でカタカナが普及した時期・層や、言語の違いを考えると、当時普及しないのも当たり前、なのかな。よくわからんなあ…。

その後も検索してたら、そもそも角筆の跡とやらが怪しい気もしてきた。 _【国内】最古級の新羅写経に角筆の文字〜新羅語が片仮名に影響か | 今日の韓流通信 Act.? によると、
角筆は、木や竹などの先をとがらせた筆記具。墨を付けずに紙をへこませて書く。判読が難しく、1961年に小林氏が世界で初めて古文書にその痕跡を発見。

【国内】最古級の新羅写経に角筆の文字〜新羅語が片仮名に影響か | 今日の韓流通信 Act.? より

とあるけれど。実は野口英世と同じ状態だったりしないのだろうか…。当人にしかソレが見えない、みたいな…。他の研究者も追試可能・再現可能な話なのかな…。

もちろん、大陸から漢字が伝わってきたように、他の文字も他国から伝わってきた可能性だってあり得るだろうなとは思うけど。でも、件の説は、ちょっと怪しい気がする…。石碑に残ってるとか、紙に筆で書かれてるならともかく…。

#4 [anime] 宮崎駿引退説

なんだかNHKでガンガン報道されてるんだけど…。何度も引退宣言して、しかし作り続けてきた監督さんなのだから、本気で受け取らないほうがいいのでは…。

実は鈴木Pの作戦だったりするのかな。最後の作品ですよー、と宣伝すれば動員数が増えるかも、みたいな。

まあ、何かの病気を患っていて、ということなら、今度は本当っぽいのかもという話になりそうだけど。

以上、1 日分です。

過去ログ表示

Prev - 2013/09 - Next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project