網路城邦
上一篇 回創作列表 下一篇   字體:
耀哥的物理實驗室,2014下學期第九周(4/18)
2014/05/01 23:47:46瀏覽288|回應0|推薦0

嚕嚕嚕嚕嚕~

今天是這學期的第九堂物裡課

.

話說今天閃耀耀的耀哥給我們看了一個東西

https://dl.dropboxusercontent.com/u/62508554/physics/courseWeb/sound/files/mysound.zip

這個是今天的範例

.

EJS有一個非成神奇的特性

還是該說是屬性呢...

他可以使用一些之前已經寫好的打包的Java函式

.

要怎麼使用呢?

首先是點開右上方雖然不起眼但其時閃亮亮的按鈕

.

接著選擇Run options

就可以看到外掛的函式庫了

.

他的檔名叫做mySG.jar

.

而在設定初始值裡,似乎也有他的蹤跡呢...

.

有玩過Minecraft的人應該都知道.jar檔是可以用解壓縮軟體去看到裡面的檔案構造

雖然說看得到啦,但mySG裡面的class檔案不管是用記事本開還是用eclipse,不是開不起來就是亂碼

.

https://dl.dropboxusercontent.com/u/62508554/physics/courseWeb/sound/files/mysound.zip

所以如果要開,還是要用原始檔,不能夠用已經封裝好的

.

範本是從耀哥的網站上抓下來的

至於要如何打開這個勇者呢?選擇File裡面的Inport

.

然後選擇這個

.

剛剛下載的壓縮檔可以不用解壓縮沒關係,在這裡選擇檔案的位置

.

然後把他開起來

選擇mySG>>src>>mySG>>SG.java

Package mySG 裡面有一個叫SG的 Class

.

因為內容實在是太多了,無法一一截圖

就把整個內容複製過來

猜猜看剛剛在EJS裡"new mySG.SG(frequence,amplitude) "

究竟會使用到這東程式碼的哪一段呢

==============我是佔版面用的================

public class SG

{

    public void setBaseFrequency(double d)

    {

        baseF = d;

        if(baseF < 100D)

            baseF = 100D;

        else

        if(baseF > 2000D)

            baseF = 2000D;

        period = (int)(UNIT / baseF);

        record = new byte[period];

        Y = new double[period];

        omega = 6.2831853071795862D / (double)period;

        setit();

    }

    public void setAmplitude(double d)

    {

        amplitude = d;

        setit();

    }

    private void setit()

    {

        if(soundStream != null)

        {

            stop();

            playstatus = true;

        }

        calc();

        if(playstatus)

            play();

    }

    public void setCosCoeff(double ad[])

    {

        if(ad.length < maxK)

            maxi = ad.length;

        else

            maxi = maxK;

        for(int i = 0; i < maxi; i++)

            cosCoeff[i] = ad[i];

    }

    public void setSinCoeff(double ad[])

    {

        if(ad.length < maxK)

            maxi = ad.length;

        else

            maxi = maxK;

        for(int i = 0; i < maxi; i++)

            sinCoeff[i] = ad[i];

    }

    public void setFourier(double ad[], double ad1[])

    {

        setCosCoeff(ad1);

        setSinCoeff(ad);

        calFourier();

    }

    public void setCosCoeff(int i, double d)

    {

        if(i < maxK)

            cosCoeff[i] = d;

    }

    public void setSinCoeff(int i, double d)

    {

        if(i < maxK)

            sinCoeff[i] = d;

    }

    public void calFourier()

    {

        if(soundStream != null)

        {

            stop();

            playstatus = true;

        }

        for(int i = 0; i < period; i++)

        {

            y = cosCoeff[0];

            for(int j = 1; j < maxi; j++)

                y += cosCoeff[j] * Math.cos((double)(i * j) * omega) + sinCoeff[j] * Math.sin((double)(i * j) * omega);

            Y[i] = amplitude * y;

        }

        setWave(Y);

        if(playstatus)

            play();

    }

    public void play()

    {

        try

        {

            if(soundStream == null)

                soundStream = new ContinuousAudioDataStream(new AudioData(record));

            AudioPlayer.player.start(soundStream);

            playstatus = true;

        }

        catch(SecurityException securityexception) { }

    }

    public void pause()

    {

        if(soundStream != null)

        {

            try

            {

                AudioPlayer.player.stop(soundStream);

                playstatus = false;

            }

            catch(SecurityException securityexception) { }

        }

    }

    public void stop()

    {

        if(soundStream != null)

        {

            try

            {

                AudioPlayer.player.stop(soundStream);

                soundStream = null;

            }

            catch(SecurityException securityexception) { }

        }

        playstatus = false;

    }

    private void calc()

    {

        A = amplitude * amplitudeCST;

        for(int i = 0; i < period; i++)

        {

            y = A * Math.sin((double)i * omega);

            record[i] = int2ulaw((int)y);

            Y[i] = y;

        }

    }

    public void setbaseLevel(double d)

    {

        amplitudeCST = d;

    }

    public void setWave(double ad[])

    {

        setWave(ad, 1.0D);

    }

    public void setWave(double ad[], double d)

    {

        if(period != ad.length)

        {

            period = ad.length;

            record = new byte[period];

            Y = new double[period];

        }

        for(int i = 0; i < period; i++)

        {

            Y[i] = ad[i] * d * amplitudeCST;

            record[i] = int2ulaw((int)Y[i]);

        }

    }

    public void changeLevel(double d)

    {

        for(int i = 0; i < period; i++)

        {

            Y[i] = Y[i] * d;

            record[i] = int2ulaw((int)Y[i]);

        }

    }

    public static byte int2ulaw(int i)

    {

        char c;

        if(i < 0)

        {

            i = -i;

            c = '\177';

        } else

        {

            c = '\377';

        }

        if(i < 32)

            i = 0xf0 | 15 - i / 2;

        else

        if(i < 96)

            i = 0xe0 | 15 - (i - 32) / 4;

        else

        if(i < 224)

            i = 0xd0 | 15 - (i - 96) / 8;

        else

        if(i < 480)

            i = 0xc0 | 15 - (i - 224) / 16;

        else

        if(i < 992)

            i = 0xb0 | 15 - (i - 480) / 32;

        else

        if(i < 2016)

            i = 0xa0 | 15 - (i - 992) / 64;

        else

        if(i < 4064)

            i = 0x90 | 15 - (i - 2016) / 128;

        else

        if(i < 8160)

            i = 0x80 | 15 - (i - 4064) / 256;

        else

            i = 128;

        return (byte)(c & i);

    }

    public SG()

    {

        baseF = 440D;

        soundStream = null;

        playstatus = false;

        amplitude = 10D;

        amplitudeCST = 1000D;

        maxK = 20;

        cosCoeff = new double[maxK];

        sinCoeff = new double[maxK];

        amplitude = 1.0D;

        baseF = 440D;

        setBaseFrequency(baseF);

    }

    public SG(double d)

    {

        baseF = 440D;

        soundStream = null;

        playstatus = false;

        amplitude = 10D;

        amplitudeCST = 1000D;

        maxK = 20;

        cosCoeff = new double[maxK];

        sinCoeff = new double[maxK];

        amplitude = 1.0D;

        setBaseFrequency(d);

    }

    public SG(double d, double d1)

    {

        baseF = 440D;

        soundStream = null;

        playstatus = false;

        amplitude = 10D;

        amplitudeCST = 1000D;

        maxK = 20;

        cosCoeff = new double[maxK];

        sinCoeff = new double[maxK];

        amplitude = d1;

        setBaseFrequency(d);

    }

    private static double UNIT = 8000D;

    private int period;

    private double baseF;

    private double omega;

    private byte record[];

    private double Y[];

    private InputStream soundStream;

    private boolean playstatus;

    private double amplitude;

    private double y;

    private double amplitudeCST;

    private double A;

    private int maxK;

    private int maxi;

    private double cosCoeff[];

    private double sinCoeff[];

}

==============佔版面用的工作以經結束了================

.

大家猜對了嗎?

其實剛剛的 new mySG.SG(frequence,amplitude)

是指說 新建一個 mySG裡面的SG函式

其實和下禮拜會教到的C++的一些Class的架構大同小異呢

沒想到耀哥居然有預知的能力,真的是太強大了呀!!!

.

.

( 興趣嗜好電腦3C )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=andy840119&aid=12974444