aardio 文档

aardio 范例: bass

import fonts.fontAwesome;
import win.ui;
/*DSG{{*/
mainForm = win.form(text="bass ";right=521;bottom=88;max=false)
mainForm.add(
btnPlay={cls="plus";text="播放";left=412;top=4;right=511;bottom=32;align="left";bgcolor=-5197169;font=LOGFONT(h=-16);iconStyle={align="left";font=LOGFONT(h=-16;name='FontAwesome');padding={left=14}};iconText='\uF04B';textPadding={left=35};z=5};
cmbDevices={cls="combobox";left=8;top=5;right=401;bottom=31;edge=1;items={};mode="dropdown";z=4};
fftPane={cls="plus";left=25;top=110;right=568;bottom=250;notify=1;z=2};
plusLrc={cls="plus";left=11;top=35;right=595;bottom=62;font=LOGFONT(h=-19);z=3};
progress={cls="plus";left=11;top=77;right=506;bottom=81;bgcolor=6447459;forecolor=9959653;notify=1;z=1}
)
/*}}*/

import bass.channel;

//获取音频设备
var devices = bass.getDeviceInfos();
mainForm.cmbDevices.items = table.map(devices,lambda(v,k) v.name )

//选择默认设备
mainForm.cmbDevices.selIndex  = table.find(devices,lambda(v) v.flags & 2/*_BASS_DEVICE_DEFAULT*/)

mainForm.btnPlay.oncommand = function(id,event){ 
    if(mainForm.audio && !mainForm.btnPlay.checked) return mainForm.audio.stop(); 
     bass.setDevice(mainForm.cmbDevices.selIndex)
    var audio,err = bass.channel.open("http://download.aardio.com/v10.files/demo/mp3/lrc.mp3") 
    if( err ) return mainForm.msgboxErr(err);

    //切换输出设备
    audio.setDevice(mainForm.cmbDevices.selIndex) 

    // 设置同步回调函数
    audio.syncCallback(function(data){
        mainForm.text = "正在播放:" + audio.getInfo().filename
    },0/*_BASS_SYNC_POS*/,0)

    // 析构回调
    audio.syncCallback(function(data){
        audio.free()
    },2/*_BASS_SYNC_END*/)

    // 获取音频时长
    mainForm.progress.setProgressRange(0,audio.duration()); 

    // 音频播放进度回调
    audio.posCallback(
        function(seconds){
            mainForm.fftPane.fftData = table.map( audio.getData(0x80000001/*_BASS_DATA_FFT512*/),math.abs );
            mainForm.fftPane.redrawTransparent();

            mainForm.progress.progressPos = seconds;
            mainForm.plusLrc.text = mainForm.lyric.findLrc(seconds*1000)
        },200
    )

    audio.play();
    mainForm.audio = audio;
}
mainForm.fftPane.orphanWindow(true);

var brush = gdip.solidBrush(0xFF8B0000);
var pen = gdip.pen( 0xFF540000, 1, 2/*_GdipUnitPixel*/ );
mainForm.fftPane.onDrawBackground = function(graphics,rc,bkColor,foreColor){
    // 画频谱函数参考武斌提供的豆瓣FM客户端源码
    var fftData = owner.fftData;
    if(!fftData) return;

    var fftNum = 66;
    var peacks = {};
    var fallOff = {};
    for(i=1;math.floor(fftNum/2)+1;1) {
        peacks[i] = 0;
    }

    var x,y,cx,cy = rc.xywh();
    var fftHeight = 120;
    var w = 8;

    var j = 1;
    for(i=1;fftNum;2) {
        if(!fftData[i]) return;
        fallOff[j] = 0;

        var di = math.floor((fftData[i]+fftData[i+1])/2*900);
        if(di > fftHeight) di = fftHeight;
        if(di >= peacks[j]) peacks[j] = di else peacks[j] = peacks[j] -3;
        if(di >= fallOff[j]) fallOff[j] = di else fallOff[j] = fallOff[j] - 5;

        if((fftHeight - peacks[j]) > fftHeight) peacks[j] = 0;
        if((fftHeight - fallOff[j]) > fftHeight) fallOff[j] = 0;
        if(peacks[j]<1) peacks[j] = 1;
        if(fallOff[j]<0) fallOff[j] = 0;

        graphics.fillRectangle(brush, j * (w + 1), fftHeight - fallOff[j], w, fallOff[j] );
        graphics.drawLine( pen, j * (w + 1), fftHeight - peacks[j], j * (w + 1) + w-1, fftHeight - peacks[j]);
        j++;
    }
}

var strLrc = /*
[ti:给我一首歌的时间]
[ar:周杰伦]
[al:魔杰座]
[00:02.00]周杰伦 - 给我一首歌的时间
[00:04.00]词:周杰伦 曲:周杰伦
[00:06.00]
[00:08.00]放飞心情
[00:10.00]
[00:18.20]雨淋湿了天空
[00:20.35]毁得很讲究
[00:22.30]你说你不懂
[00:23.86]为何在这时牵手
[00:26.54]我晒干了沉默
[00:28.47]悔得很冲动
[00:30.52]就算这是做错
[00:32.21]也只是怕错过
[00:34.24]
[00:34.94]在一起叫梦
[00:37.02]分开了叫痛
[00:39.01]是不是说
[00:40.22]没有做完的梦最痛
[00:43.11]迷路的后果
[00:45.06]我能承受
[00:46.31]这最后的出口
[00:48.62]在爱过了才有
[00:52.49]
[00:53.19]能不能给我一首歌的时间
[00:57.25]紧紧的把那拥抱变成永远
[01:01.33]在我的怀里你不用害怕失眠
[01:05.32]哦 如果你想忘记我也能失忆
[01:09.44]能不能给我一首歌的时间
[01:13.52]把故事听到最后才说再见
[01:17.52]你送我的眼泪
[01:19.38]让它留在雨天
[01:21.64]哦 越过你划的线
[01:23.97]我定了勇气的终点
[01:29.01]
[01:31.57]雨淋湿了天空
[01:33.60]毁得很讲究
[01:35.63]你说你不懂
[01:37.13]为何在这时牵手
[01:39.66]我晒干了沉默
[01:41.71]悔得很冲动
[01:43.75]就算这是做错
[01:45.31]也只是怕错过
[01:47.39]
[01:48.09]在一起叫梦
[01:50.13]分开了叫痛
[01:52.09]是不是说
[01:53.41]没有做完的梦最痛
[01:56.28]迷路的后果
[01:58.23]我能承受
[01:59.54]这最后的出口
[02:01.80]在爱过了才有
[02:05.77]
[02:06.47]能不能给我一首歌的时间
[02:10.47]紧紧的把那拥抱变成永远
[02:14.51]在我的怀里你不用害怕失眠
[02:18.57]哦 如果你想忘记我也能失忆
[02:22.64]能不能给我一首歌的时间
[02:26.74]把故事听到最后才说再见
[02:30.76]你送我的眼泪
[02:32.65]让它留在雨天
[02:34.92]哦 越过你划的线
[02:37.21]我定了勇气的终点
[02:42.41]
[02:43.11]你说我不该不该
[02:45.83]不该在这时候说了我爱你
[02:52.41]要怎么证明我没有说谎力气
[02:59.45]请告诉我暂停算不算放弃
[03:08.67]我只有一天的回忆
[03:14.85]
[03:15.55]能不能给我一首歌的时间
[03:19.61]紧紧的把那拥抱变成永远
[03:23.63]在我的怀里你不用害怕失眠
[03:27.75]哦 如果你想忘记我也能失忆
[03:31.81]能不能给我一首歌的时间
[03:35.91]把故事听到最后才说再见
[03:40.67]你送我的眼泪
[03:42.24]让它留在雨天
[03:44.56]哦 越过你划的线
[03:46.37]我定了勇气的终点
[03:49.01]
[03:49.71]你说我不该不该
[03:51.46]不该在这时候说了我爱你
[03:53.45]要怎么证明我没力气
[03:55.78]可是我只有一天的回忆
[03:57.12]
[03:57.82]你说我不该不该
[03:59.58]不该在这时候才说爱你
[04:01.64]要怎么证明我没力气
[04:03.98]我只有一天的回忆
[04:06.81]~~End~~
*/ 

import string.lrc;
mainForm.lyric = string.lrc( strLrc );

mainForm.btnPlay.skin({
    background={
        default=0x668FB2B0;
        disabled=0xFFCCCCCC;
        hover=0xFF928BB3
    };
    color={
        default=0xFF000000;
        disabled=0xFF6D6D6D
    };
    checked = {
        iconText = '\uF04D';
        text = "停止";
        background={
            default=0x668FB2B0;
            disabled=0xFFCCCCCC;
            hover=0xFF928BB3
        };
        color={
            default=0xFF000000;
            disabled=0xFF6D6D6D
        };
    }
})

mainForm.show();
return win.loopMessage();

/*
BASS错误代码说明:
------------------------------------
BASS_ERROR_MEM  1   Memory error
BASS_ERROR_FILEOPEN 2   Can't open the file
BASS_ERROR_DRIVER   3   Can't find a free/valid driver
BASS_ERROR_BUFLOST  4   The sample buffer was lost
BASS_ERROR_HANDLE   5   Invalid handle
BASS_ERROR_FORMAT   6   Unsupported sample format
BASS_ERROR_POSITION 7   Invalid playback position
BASS_ERROR_INIT 8   BASS_Init has not been successfully called
BASS_ERROR_START    9   BASS_Start has not been successfully called
BASS_ERROR_NOCD 12  No CD in drive
BASS_ERROR_CDTRACK  13  Invalid track number
BASS_ERROR_ALREADY  14  Already initialized/paused/whatever
BASS_ERROR_NOPAUSE  16  Not paused
BASS_ERROR_NOTAUDIO 17  Not an audio track
BASS_ERROR_NOCHAN   18  Can't get a free channel
BASS_ERROR_ILLTYPE  19  An illegal type was specified
BASS_ERROR_ILLPARAM 20  An illegal parameter was specified
BASS_ERROR_NO3D 21  No 3D support
BASS_ERROR_NOEAX    22  No EAX support
BASS_ERROR_DEVICE   23  Illegal device number
BASS_ERROR_NOPLAY   24  Not playing
BASS_ERROR_FREQ 25  Illegal sample rate
BASS_ERROR_NOTFILE  27  The stream is not a file stream
BASS_ERROR_NOHW 29  No hardware voices available
BASS_ERROR_EMPTY    31  The MOD music has no sequence data
BASS_ERROR_NONET    32  No internet connection could be opened
BASS_ERROR_CREATE   33  Couldn't create the file
BASS_ERROR_NOFX 34  Effects are not available
BASS_ERROR_PLAYING  35  The channel is playing
BASS_ERROR_NOTAVAIL 37  Requested data is not available
BASS_ERROR_DECODE   38  The channel is a 'decoding channel'
BASS_ERROR_DX   39  A sufficient DirectX version is not installed
BASS_ERROR_TIMEOUT  40  Connection timedout
BASS_ERROR_FILEFORM 41  Unsupported file format
BASS_ERROR_SPEAKER  42  Unavailable speaker
BASS_ERROR_VERSION  43  Invalid BASS version (used by add-ons)
BASS_ERROR_CODEC    44  Codec is not available/supported
BASS_ERROR_ENDED    45  The channel/file has ended
BASS_ERROR_BUSY 46  The device is busy (eg. in "exclusive" use by another process)
BASS_ERROR_UNKNOWN  -1  Some other mystery error
BASS_ERROR_WMA_LICENSE  1000    BassWma: the file is protected
BASS_ERROR_WMA_WM9  1001    BassWma: WM9 is required
BASS_ERROR_WMA_DENIED   1002    BassWma: access denied (user/pass is invalid)
BASS_ERROR_WMA_CODEC    1003    BassWma: no appropriate codec is installed
BASS_ERROR_WMA_INDIVIDUAL   1004    BassWma: individualization is needed
BASS_ERROR_ACM_CANCEL   2000    BassEnc: ACM codec selection cancelled
BASS_ERROR_CAST_DENIED  2100    BassEnc: Access denied (invalid password)
BASS_VST_ERROR_NOINPUTS 3000    BassVst: the given effect has no inputs and is probably a VST instrument and no effect
BASS_VST_ERROR_NOOUTPUTS    3001    BassVst: the given effect has no outputs
BASS_VST_ERROR_NOREALTIME   3002    BassVst: the given effect does not support realtime processing
BASS_ERROR_WASAPI   5000    BASSWASAPI: no WASAPI available
BASS_ERROR_MP4_NOSTREAM 6000    BASS_AAC: non-streamable due to MP4 atom order ('mdat' before 'moov')
*/

Markdown 格式