亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

PHP - 將 16 位數字模式映射到二進制塊

PHP - 將 16 位數字模式映射到二進制塊

PHP
一只甜甜圈 2023-11-05 15:54:35
我正在開發一個用于鼓聲音的步進音序器程序。它采用 16 位二進制模式示例:"1010010100101001",然后將二進制模式分解為如下所示的塊:10, 100, 10, 100, 10, 100, 1。然后,它根據有多少個塊為每個塊分配一個時間值。數字。原因是有些鼓樣本聲音發出的聲音比 1 節拍的長度長,所以分塊解決了這部分。(例如,如果節拍為 60bpm 1 位 = 1 秒)“10”= 2 秒,“100”= 3 秒,“1”= 秒。(允許我在模式中將聲音修剪到適當的長度,并使用 ffmpeg 將其連接成最終的 wav)另外 1 = 鼓擊 / 0 = 無聲擊......這種方法非常適合我的需要?,F在我可以制作完美的節拍循環......并且我想在其之上添加速度模式層,以允許幽靈音符/為我的鼓模式添加人的感覺/動態。我決定對速度模式使用 0、1、2、3、4 值系統。“0”= 0% 體積,“1”= 25% 體積,“2”= 50% 體積,“3”= "0"= 0% 體積,"1"= 25% 體積,"2"= 50% 體積,"3"= 75% 體積,"4"= %100 體積。(音量為 0,這樣我就可以添加打開踩镲/鐃鈸碰撞硬停止,而二進制模式中的 0 則不會這樣做)因此,除了"1111111111111111"模式外,您還會看到一個速度模式層,例如"4242424242424242"(該速度模式交替使用 100% 擊打和 50% 擊打,使用踩镲聽起來不錯/就像真正的鼓手)我使用 PHP 將 16 位二進制模式分解為一個塊數組。"1001110011110010"將是['100','1','1','100','1','1','1','100','10']現在通過循環,我需要將 0、1、2、3、4 位數字的另一個 16 位數字層模式映射到每個塊的第一位數字。示例1:Velocity Pattern: '4242424242424242'Binary Pattern: '1001110011110010'Array = ['100','1','1','100','1','1','1','100','10']'100' = 4 (1st digit in 4242424242424242 pattern)'1' = 2 (4th digit in 4242424242424242 pattern)'1' = 4 (5th digit in 4242424242424242 pattern)'100' = 2 (6th digit in the 4242424242424242 pattern)'1' = 4 (9th digit in the 4242424242424242 pattern)'1' = 2 (10th digit in the 4242424242424242 pattern)'1' = 4 (11th digit in the 4242424242424242 pattern)'100' = 2 (12th digit in the 4242424242424242 pattern)'10' = 4 (15th digit in the 4242424242424242 pattern)示例2:Velocity Pattern: '4242424242424242'Binary Pattern: '1111111111111111'Array = ['1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1']
查看完整描述

2 回答

?
阿波羅的戰車

TA貢獻1862條經驗 獲得超6個贊

從您給出的示例來看,您似乎需要速度數組中的相應值以及節拍數組中 1 之間的持續時間。


此代碼首先通過將 1 拆分為數組,然后過濾掉 0 來提取 1。所以


$beat_pattern = '1001110011110010';

$velocity_pattern = '4242424242424242';


$beat = array_filter(str_split($beat_pattern));

會屈服......$beat


Array

(

    [0] => 1

    [3] => 1

    [4] => 1

    [5] => 1

    [8] => 1

    [9] => 1

    [10] => 1

    [11] => 1

    [14] => 1

)

然后它依次獲取每個條目,通過查看下一個鍵并減去兩個鍵來計算長度,還使用索引來獲得相應的速度。


要考慮以 0 開頭的情況,您可以循環到 1 的第一個實例并輸出同一元素的速度模式......


$beat_pattern = '1001110011110010';

$velocity_pattern = '4242424242424242';


$beat = array_filter(str_split($beat_pattern));

$beatKeys = array_keys($beat);


// For the leading 0's

for( $i = 0; $i < $beatKeys[0]; $i++ )  {

    echo "1-". $velocity_pattern[$i] . PHP_EOL;

}


for ( $i = 0; $i < count($beatKeys); $i++ ) {

    echo ($beatKeys[$i+1] ?? strlen($beat_pattern)) - $beatKeys[$i] . "-".

            $velocity_pattern[$beatKeys[$i]] . PHP_EOL;

}

給出(長度-速度)...


3-4

1-2

1-4

3-2

1-4

1-2

1-4

3-2

2-4


查看完整回答
反對 回復 2023-11-05
?
料青山看我應如是

TA貢獻1772條經驗 獲得超8個贊

假設您有兩個輸入字符串:


$binary   = '0001000110101001';

$velocity = '4231423142314231';

如果使用正則表達式分析模式,則可以在一次操作中獲取所有組成部分,包括模式開始時的停頓(基本上是 0% 的音量節拍)。


$index = 0;

preg_match_all('/^0+|10*/', $binary, $parts);

foreach ($parts[0] as $part) {

    $duration = strlen($part);                   // How many beats

    $volume = $part[0] ? $velocity[$index] : 0;  // The corresponding volume number

    $index += $duration;

}

為了進一步發展這一點,在我看來,為模式生成適當的數據數組是可行的,如果你愿意,你可以打包這個功能:


function drumPattern($binary, $velocity) {

    $output = [];

    $index = 0;

    preg_match_all('/^0+|10*/', $binary, $parts);

    foreach ($parts[0] as $part) {

        $duration = strlen($part);

        $output[] = [

            'duration' => $duration,

            'volume' => $part[0] ? $velocity[$index] : 0

        ];

        $index += $duration;

    }

    return $output;

}


drumPattern($binary, $velocity);

生成以下輸出


Array

(

    [0] => Array

        (

            [duration] => 3

            [volume] => 0

        )


    [1] => Array

        (

            [duration] => 4

            [volume] => 1

        )


    [2] => Array

        (

            [duration] => 1

            [volume] => 1

        )


    [3] => Array

        (

            [duration] => 2

            [volume] => 4

        )


    [4] => Array

        (

            [duration] => 2

            [volume] => 3

        )


    [5] => Array

        (

            [duration] => 3

            [volume] => 4

        )


    [6] => Array

        (

            [duration] => 1

            [volume] => 1

        )


)


查看完整回答
反對 回復 2023-11-05
  • 2 回答
  • 0 關注
  • 162 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號