Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-将16位数字模式映射到二进制块_Php_Regex_Loops - Fatal编程技术网

PHP-将16位数字模式映射到二进制块

PHP-将16位数字模式映射到二进制块,php,regex,loops,Php,Regex,Loops,我正在为鼓声编写一个分步音序程序。它以一个16位二进制模式为例:“1010010101001”,然后它将二进制模式分解成如下的块:10100,10100,10100,10100,1。然后,它根据数字的多少为每个块分配一个时间值。原因是,一些鼓样本的声音比1拍长,所以分块解决了这一部分。(例如,如果节拍为60bpm,则1位数=1秒)'10'=2秒,'100'=3秒,'1'=秒。(允许我在模式中将声音修剪到适当的长度,并使用ffmpeg将其压缩成最终的波形)还有1=鼓击/0=无声击。。。。。这种方法

我正在为鼓声编写一个分步音序程序。它以一个16位二进制模式为例:“1010010101001”,然后它将二进制模式分解成如下的块:10100,10100,10100,10100,1。然后,它根据数字的多少为每个块分配一个时间值。原因是,一些鼓样本的声音比1拍长,所以分块解决了这一部分。(例如,如果节拍为60bpm,则1位数=1秒)'10'=2秒,'100'=3秒,'1'=秒。(允许我在模式中将声音修剪到适当的长度,并使用ffmpeg将其压缩成最终的波形)还有1=鼓击/0=无声击。。。。。这种方法非常适合我的需要

现在我可以做完美的节拍循环了。。。。我想在上面添加一个速度模式层,允许鬼音符/给我的鼓模式添加人的感觉/动力。我决定对速度模式使用0,1,2,3,4值系统。”0'=0%卷,'1'=25%卷,'2'=50%卷,'3'=75%卷,'4'=100卷。(0音量,这样我就可以添加打开的hi-hat/钹碰撞硬停止,而二进制模式中的0不会这样做)这样,随着“1111111111111111”模式,你会看到一个速度模式层,比如“42424242”(该速度模式交替100%命中和50%命中,听起来很适合hi-hats/像一个真正的鼓手)

我使用PHP将16位二进制模式分解成一个块数组1001110011110010'将是

['100','1','1','100','1','1','1','100','10']
现在通过一个循环,我需要将另一个16位数字的层模式(0,1,2,3,4位)映射到每个块的第一位数字

示例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)
Velocity Pattern: '4242424242424242'
Binary Pattern: '1111111111111111'
Array = ['1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1']

'1' = 4 (n1 digit in 4242424242424242 pattern)
'1' = 2 (n2 digit in 4242424242424242 pattern)
'1' = 4 (n3 digit in 4242424242424242 pattern)
'1' = 2 (n4 digit in 4242424242424242 pattern)
'1' = 4 (n5 digit in 4242424242424242 pattern)
'1' = 2 (n6 digit in 4242424242424242 pattern)
'1' = 4 (n7 digit in 4242424242424242 pattern)
'1' = 2 (n8 digit in 4242424242424242 pattern)
'1' = 4 (n9 digit in 4242424242424242 pattern)
'1' = 2 (n10 digit in 4242424242424242 pattern)
'1' = 4 (n11 digit in 4242424242424242 pattern)
'1' = 2 (n12 digit in 4242424242424242 pattern)
'1' = 4 (n13 digit in 4242424242424242 pattern)
'1' = 2 (n14 digit in 4242424242424242 pattern)
'1' = 4 (n15 digit in 4242424242424242 pattern)
'1' = 2 (n16 digit in 4242424242424242 pattern)
Velocity Pattern: '4231423142314231'
Binary Pattern: '0001000100010001'
Array = ['0','0','0','1000','1000','1000','1']

'0' = 4 (1st digit in 4231423142314231 pattern)
'0' = 2 (2nd digit in 4231423142314231 pattern)
'0' = 3 (3rd digit in 4231423142314231 pattern)
'1000' = 1 (4th digit in 4231423142314231 pattern)
'1000' = 1 (8th digit in 4231423142314231 pattern)
'1000' = 1 (12th digit in 4231423142314231 pattern)
'1' = 1 (16th digit in 4231423142314231 pattern)
示例2:

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)
Velocity Pattern: '4242424242424242'
Binary Pattern: '1111111111111111'
Array = ['1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1']

'1' = 4 (n1 digit in 4242424242424242 pattern)
'1' = 2 (n2 digit in 4242424242424242 pattern)
'1' = 4 (n3 digit in 4242424242424242 pattern)
'1' = 2 (n4 digit in 4242424242424242 pattern)
'1' = 4 (n5 digit in 4242424242424242 pattern)
'1' = 2 (n6 digit in 4242424242424242 pattern)
'1' = 4 (n7 digit in 4242424242424242 pattern)
'1' = 2 (n8 digit in 4242424242424242 pattern)
'1' = 4 (n9 digit in 4242424242424242 pattern)
'1' = 2 (n10 digit in 4242424242424242 pattern)
'1' = 4 (n11 digit in 4242424242424242 pattern)
'1' = 2 (n12 digit in 4242424242424242 pattern)
'1' = 4 (n13 digit in 4242424242424242 pattern)
'1' = 2 (n14 digit in 4242424242424242 pattern)
'1' = 4 (n15 digit in 4242424242424242 pattern)
'1' = 2 (n16 digit in 4242424242424242 pattern)
Velocity Pattern: '4231423142314231'
Binary Pattern: '0001000100010001'
Array = ['0','0','0','1000','1000','1000','1']

'0' = 4 (1st digit in 4231423142314231 pattern)
'0' = 2 (2nd digit in 4231423142314231 pattern)
'0' = 3 (3rd digit in 4231423142314231 pattern)
'1000' = 1 (4th digit in 4231423142314231 pattern)
'1000' = 1 (8th digit in 4231423142314231 pattern)
'1000' = 1 (12th digit in 4231423142314231 pattern)
'1' = 1 (16th digit in 4231423142314231 pattern)
示例3:

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)
Velocity Pattern: '4242424242424242'
Binary Pattern: '1111111111111111'
Array = ['1','1','1','1','1','1','1','1','1','1','1','1','1','1','1','1']

'1' = 4 (n1 digit in 4242424242424242 pattern)
'1' = 2 (n2 digit in 4242424242424242 pattern)
'1' = 4 (n3 digit in 4242424242424242 pattern)
'1' = 2 (n4 digit in 4242424242424242 pattern)
'1' = 4 (n5 digit in 4242424242424242 pattern)
'1' = 2 (n6 digit in 4242424242424242 pattern)
'1' = 4 (n7 digit in 4242424242424242 pattern)
'1' = 2 (n8 digit in 4242424242424242 pattern)
'1' = 4 (n9 digit in 4242424242424242 pattern)
'1' = 2 (n10 digit in 4242424242424242 pattern)
'1' = 4 (n11 digit in 4242424242424242 pattern)
'1' = 2 (n12 digit in 4242424242424242 pattern)
'1' = 4 (n13 digit in 4242424242424242 pattern)
'1' = 2 (n14 digit in 4242424242424242 pattern)
'1' = 4 (n15 digit in 4242424242424242 pattern)
'1' = 2 (n16 digit in 4242424242424242 pattern)
Velocity Pattern: '4231423142314231'
Binary Pattern: '0001000100010001'
Array = ['0','0','0','1000','1000','1000','1']

'0' = 4 (1st digit in 4231423142314231 pattern)
'0' = 2 (2nd digit in 4231423142314231 pattern)
'0' = 3 (3rd digit in 4231423142314231 pattern)
'1000' = 1 (4th digit in 4231423142314231 pattern)
'1000' = 1 (8th digit in 4231423142314231 pattern)
'1000' = 1 (12th digit in 4231423142314231 pattern)
'1' = 1 (16th digit in 4231423142314231 pattern)
模式会有所不同,所以我需要一个即使模式以0开头也能工作的方法,等等

111111111的模式很简单,因为每个1都已经被自己分割成一个组

我尝试使用一个名为“$v_count”的计数器来映射模式中的位置,但它的工作方式与预期不同

$v_count = 0;
$beat_pattern = '1001110011110010';
$velocity_pattern = '4242424242424242';
    
preg_match_all('/10*|0/', $beat_pattern, $m);
$c_count = count($m, COUNT_RECURSIVE) - 1;
    
for ($z = 0; $z < $c_count; $z++) {
    $z2 = $z;
    ${"c" . $z} = $m[0][$z];
    ${"cl" . $z} = strlen($m[0][$z]);
        
    if (${"cl" . $z} == 1 & $m[0][$z] == "0") { 
        $v_count = $v_count + 1;
        echo 'the position of this chunk is: '.$v_count.' in the velocity_pattern<br>';            
    };  
          
    if (${"cl" . $z} == 1 & $m[0][$z] == "1") { 
        $v_count = $v_count + 1;
        echo 'the position of this chunk is: '.$v_count.' in the velocity_pattern<br>';    
    };
          
        
    if (${"cl" . $z} > 1) {
                       
        if ($z == 1)
        {      
            $v_count = 1;
        }
        if ($z > 1)
        {
            $v_count = $v_count + 1;
        }
        
        echo ' - the velocity position of this chunk is: '.$v_count.' in the pattern<br>';
                
        $v_count = $v_count + ${"cl" . $z} + 1;
    };
}
$v_count=0;
$beat_模式='1001110011110010';
$velocity_模式='4242';
preg_match_all(“/10*| 0/”,$beat_pattern,$m);
$c_count=count($m,count_RECURSIVE)-1;
对于($z=0;$z<$c_count;$z++){
$z2=$z;
${“c”。$z}=$m[0][$z];
${“cl”。$z}=strlen($m[0][$z]);
如果(${cl..$z}==1&$m[0][$z]==0”){
$v_count=$v_count+1;
echo“此块的位置为:”.$v_count.。在速度模式中
”; }; 如果(${cl..$z}==1&$m[0][$z]==1”){ $v_count=$v_count+1; echo“此块的位置为:”.$v_count.。在速度模式中
”; }; 如果(${“cl”。$z}>1){ 如果($z==1) { $v_计数=1; } 如果($z>1) { $v_count=$v_count+1; } echo'-此块的速度位置为:'.$v_count.'在模式中
'; $v_count=$v_count+${“cl”。$z}+1; }; }
根据您给出的示例,似乎需要速度数组中的相应值以及节拍数组中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;
}

从您给出的示例来看,似乎需要速度数组中的相应值以及拍数组中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;
}

假设有两个输入字符串:

$binary   = '0001000110101001';
$velocity = '4231423142314231';
如果使用正则表达式分析模式,可以在一次操作中获得所有组成部分,包括模式开始时的暂停(基本上是0%的音量拍)


为了进一步发展这一点,在我看来,为模式生成适当的数据数组是切实可行的,如果需要,您可以打包此功能:

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
        )

)

假设有两个输入字符串:

$binary   = '0001000110101001';
$velocity = '4231423142314231';
如果使用正则表达式分析模式,可以在一次操作中获得所有组成部分,包括模式开始时的暂停(基本上是0%的音量拍)


为了进一步发展这一点,在我看来,为模式生成适当的数据数组是切实可行的,如果需要,您可以打包此功能:

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
        )

)

那么,你有什么问题?什么不起作用?当我运行它时,它没有正确映射模式中的位置。我已经试着想清楚了,但是我的脑子一直在想为什么它不工作/我做错了什么。你没有提到如果0引导二进制模式会变成什么。谢谢,让我来修正一下,这应该是4242模式中的第一个数字(我需要考虑所有特殊/独特的情况,以及发生类似情况时的情况)作为一种过于简单的方法,看起来您只查看1,因此要提取这些(位置),您可以使用
array\u过滤器(