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

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
)
)
- 2 回答
- 0 關注
- 162 瀏覽
添加回答
舉報