将一系列元胞自动机数据翻转为乐谱(如WolframTones)

时间:2012-03-27 09:54:24

标签: java arrays procedural-generation cellular-automata procedural-music

好的,所以使用Cellular Automata的一些基本原理,我设法运行一个程序,生成一组根据规则计算的数据。每个单元格都是布尔值。

目前我将其存储为boolean [] []数据 - 其中第一个索引是行,第二个索引是单元格。

现在我已经达到了将音乐转换为乐谱(存储为数组)的程度。在the page上,它显示了如何从CA数据转换的图表 -

Source

获取数据

Target

我无法理解如何使用我的存储方案以预定方式完成此操作。如果有人能提供帮助那就太好了,我可以在必要时提供更多信息。

1 个答案:

答案 0 :(得分:1)

映射看起来很直接:

target[x, y] = source[OFFSET - y, x]

其中OFFSET是要复制的最后行的索引(33,如果我算得正确的话)。

您的实现可以使用两个嵌套循环来复制数组。


修改

这就是你的转换器的样子:

public class Converter
{
    public static boolean[][] convert(boolean[][] source, int offset, int width)
    {
        final boolean[][] target = new boolean[width][source.length];

        for(int targetRow=0 ; targetRow<width ; targetRow++)
        {
            for(int targetCol=0 ; targetCol<source.length ; targetCol++)
            {
                target[targetRow][targetCol] = source[targetCol][offset + width-1 - targetRow];
            }
        }

        return target;
    }
}

这是下面的测试代码(原始数组和变换后的数组)的输出,使用偏移量2(前两行省略)和宽度7(七列)转化):

     █     
    ███    
   ██  █   
  ██ ████  
 ██  █   █ 
██ ████ ███

   █ █
  ██  
 █ █ █
██ ███
 ██  █
  ██ █
   ██ 

测试代码是转换源数组的String定义并输出数组内容:

public class ConverterTest
{
    private final static int OFFSET = 2;
    private final static int WIDTH = 7;

    private static final String[] sourceString = {
        "     █     ",
        "    ███    ",
        "   ██  █   ",
        "  ██ ████  ",
        " ██  █   █ ",
        "██ ████ ███",
    };


    public static void main(String[] args)
    {
        final boolean[][] source = getSourceArray();
        printArray(source);
        final boolean[][] target = Converter.convert(source, OFFSET, WIDTH);
        printArray(target);
    }


    private static boolean[][] getSourceArray()
    {
        final boolean[][] sourceArray = new boolean[sourceString.length][sourceString[0].length()];

        for(int row=0 ; row<sourceString.length ; row++)
        {
            for(int col=0 ; col<sourceString[0].length() ; col++)
            {
                sourceArray[row][col] = (sourceString[row].charAt(col) != ' ');
            }
        }

        return sourceArray;
    }


    private static void printArray(boolean[][] arr)
    {
        for(int row=0 ; row<arr.length ; row++)
        {
            for(int col=0 ; col<arr[0].length ; col++)
            {
                System.out.print(arr[row][col] ? '█' : ' ');
            }
            System.out.println();
        }
        System.out.println();
    }
}