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 关注
- 116 浏览
添加回答
举报