Python pygame Art-net受信

## Windows10 Art-net モニターが pygameで手軽に作れるようになりました。
https://youtu.be/EPbBy4B4m1s

## RaspberryPi4  Python Art-net 受信 モニター試験 反応早く使えます。 
https://youtu.be/86Y16JYmh98

![python-Raspberry-mon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378482/71c64d98-c85e-706c-a07f-bfb6858c5ede.png)

### 簡易試験用受信モニタープログラム ( mon16x128.py )
```python
#!/usr/bin/env python
#udp_rx_test.py 2021 1/28ok t.kurume
from socket import *
import pygame as pg
from pygame.compat import geterror
import numpy as np

packet = bytearray()
cou = bytearray()

cd = np.zeros((65,128,3),dtype = pg.Color)
clev = np.arange(0,255,30)

WAIT_BASE=0

dmx = np.zeros((4,512),dtype = np.byte )
packe = np.zeros((2048),dtype = np.byte )

if not pg.font:
    print("Warning, fonts disabled")
if not pg.mixer:
    print("Warning, sound disabled")

#main_dir = os.path.split(os.path.abspath(__file__))[0]
#data_dir = os.path.join(main_dir, "data")

pg.init()
screen = pg.display.set_mode((1300,176))#128/64

def wait(i):
    for k in range(i):
        ccc=0
        for j in range(WAIT_BASE):
            ccc=ccc+1
def sub():
    u=0
    for y in range(20,180,10):  #16 72
        n=0
        for x in range(10,1290,10):      #83:20
            if(cd[u][n][0]>=0)&(cd[u][n][0]>=0)&(cd[u][n][0]>=0):
                pg.draw.circle(screen,(cd[u][n][0],cd[u][n][1],cd[u][n][2]), (x, y),4)
                n=n+1
        if u<15:
            u=u+1
            n=0
        else:
            u=0
            n=0

def col_p(rr,gg,bb):
    for u in range(0,16): 
        for n in range(0,80): 
            cd[u][n][0]= rr
            cd[u][n][1]= gg
            cd[u][n][2]= bb
    
def test1(dl):
        col_p(255,255,255)
        sub()
        pg.display.flip()
        wait(dl)
        col_p(0,0,0)
        sub()
        pg.display.flip()
        wait(dl)
   
## UDP受信クラス
class udprecv():
    def __init__(self):
        # ホスト名を取得、表示
        host = gethostbyname(gethostname())
        #print(host)
        # ipアドレスを取得、表示
        SrcIP  = gethostbyname(gethostbyname(host))
        SrcPort = 6454                                 # 受信元ポート番号
        self.SrcAddr = (SrcIP, SrcPort)                # アドレスをtupleに格納
        self.BUFSIZE = 1024                            # バッファサイズ指定
        self.udpServSock = socket(AF_INET, SOCK_DGRAM) # ソケット作成
        self.udpServSock.bind(self.SrcAddr)            # 受信元アドレスでバインド

    def recv(self):
        packe,addr=self.udpServSock.recvfrom(self.BUFSIZE)
        for u in range(0,16): 
                if (packe[0]==ord('A'))  & (packe[1]==ord('r')):
                    #if (u<16) & ((packe[12]%2)== 0) | (u>15) & ((packe[12]%2)== 1):
                    if (u<16) & ((packe[12]%2)== 0) :
                        if packe[14]==u :
                            for n in range(0,128): 
                                cd[u][n][0]= packe[n*3+18]
                                cd[u][n][1]= packe[n*3+19]
                                cd[u][n][2]= packe[n*3+20]
                            if u==15 :
                                sub()
                                pg.display.flip()
def main():
    # Initialize Everything
    pg.display.set_caption("Art-Net LED(128x16) ")
    # Create The Backgound
    background = pg.Surface(screen.get_size())
    background = background.convert()
    background.fill((50, 50, 50))
    # Put Text On The Background, Centered
    if pg.font:
        font = pg.font.Font(None,10)
        for i in range(0,128): 
            text = font.render(str(i), 1, (0,200,200))
            background.blit(text, (8+i*10,5))
        font = pg.font.Font(None,14)
        for i in range(0,64): 
            text = font.render(str(i), 1, (0,200,200))
            background.blit(text, (1290,15+i*10))

    # Display The Background
    screen.blit(background, (0, 0))
    # Prepare Game Objects
    clock = pg.time.Clock()
    # Main Loop
    going = True
    dim = 0
    pg.display.flip()
    udp = udprecv()     # クラス呼び出し
    while going:
        # Handle Input Events
        for event in pg.event.get():
            if event.type == pg.QUIT:
                going = False
        udp.recv()          # 関数実行        #clock.tick(60)
    pg.quit()
if __name__ == "__main__":
    main()
```