在Python中改写C++位操作函数

2024-09-29 22:22:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将一些我在网上找到的C++代码转换成一个MIDI控制器——AKAI Fielt,用于特定的OLED显示器的重新排序。显示器使用了一种奇怪的配置,将位显示为像素,正如我在页面底部分享的博客中所记录的那样

目的是能够在屏幕上显示文本。消息以MIDI SysEx的形式发送,像素的每个字节使用7位,将MSB保留为0,这是MIDI数据字节的标准值。我已经取得了相当大的成功,因为我已经成功地获得了正确的像素集来打开,那里只是被弄坏了,所以它不可读。我相信错误在我试图翻译成Python的位操作函数中

这是原始代码

static void _FIRE_PlotPixel(unsigned X, unsigned Y, unsigned C) {
  unsigned RemapBit;
  //
  if (X < 128 && Y < 64) {
    //
    // Unwind 128x64 arrangement into a 1024x8 arrangement of pixels.
    //
    X += 128 * (Y/8);
    Y %= 8;
    //
    // Remap by tiling 7x8 block of translated pixels.
    //
    RemapBit = _aBitMutate[Y][X % 7];
    if (C > 0) {
      _aOLEDBitmap[4 + X/7*8 + RemapBit/7] |= 1u << (RemapBit % 7);
    } else {
      _aOLEDBitmap[4 + X/7*8 + RemapBit/7] &= ~(1u << (RemapBit % 7));
    }
  }
}

我首先必须创建一个大的0列表来设置值,这可能会导致问题。注意,我使用1178作为大小,我希望是1175,但这不够大,所以我的位图中可能有一些零散的字节,我不确定-尽管它确实包含1024字节,这对于128x6上的每像素1位是正确的

TestBitMap = [0x00 for i in range(1178)]

然后创建用于绘制像素的函数:

def PlotPixel(x, y, c):
    if x < 128 and y < 64:

        x += 128 * (y / 8)
        y %= 8

        RemapBit = BitMutate[int(y)][int(x % 7)]
        if c > 0:
            TestBitMap[4 + int(x / 7 * 8) + int(RemapBit / 7)] |= 1 << (int(RemapBit % 7))
        else:
            TestBitMap[4 + int(x / 7 * 8) + int(RemapBit / 7)] &= ~(1 << (int(RemapBit % 7)))

然后我这样称呼它,其中bits是我的标准位图,用每像素1位的PIL生成(这是可行的,当我从标准位图中提取位时,我能够正确地看到图像):

for x in range(128):
    for y in range(64):
        # Plot the pixels - essentially sets all bits to 0x00, ie black
        PlotPixel(x, y, 0)

for y in range(64):
    for x in range(128):
        if bits[(55 - y) * int(128 / 8) + int(x / 8)] & (0x80 >> (x % 8)):
            PlotPixel(x + 4, y + 4, 1)

return TestBitMap

正在使用此列表重新排列这些位,该列表由最初在博客中讨论此问题的人记录:

BitMutate = [[13, 19, 25, 31, 37, 43, 49],
             [0, 20, 26, 32, 38, 44, 50],
             [1, 7, 27, 33, 39, 45, 51],
             [2, 8, 14, 34, 40, 46, 52],
             [3, 9, 15, 21, 41, 47, 53],
             [4, 10, 16, 22, 28, 48, 54],
             [5, 11, 17, 23, 29, 35, 55],
             [6, 12, 18, 24, 30, 36, 42]]

以下是我一直用作研究的博客的链接: https://blog.segger.com/decoding-the-akai-fire-part-3/

我正在使用位图和它们提供的预期SysEx消息输出进行测试和比较,以查看我的版本如何响应

我知道Python可能不是解决这个问题的最佳语言,但这是我所熟悉的语言,因为它的最终用途,它是最合适的。我使用这个项目来学习更多关于C/C++的知识。我觉得我真的很接近,只是明显错过了一些重要的东西。任何帮助都将不胜感激:)


Tags: in列表forif字节range像素bits

热门问题