2010-03-02 79 views
0

这是从一个课堂作业从像素弹奏的音符:的Python(Jython的)的图片

这个程序是关于倾听的颜色。我们将把照片当作钢琴乐谱。 编写一个名为listenToPicture的函数,将一张图片作为参数。它首先显示图片。接下来,它将遍历每第四行中的每个第4个像素,并执行以下操作。它将计算像素的红色,绿色和蓝色等级的总和,将其除以9,然后将结果添加到24.该数字将是playNote播放的音符编号。 这意味着像素越暗,音符越低;像素越亮,音符越高。它将以全音量(127)播放该音符十分之一秒(100毫秒)。每次移动到新行时,它都会在控制台上输出行号(y值)。 您的主要功能将要求用户选择一个带有图片的文件。它将打印要播放的音符数(这是图像中的像素数除以16;为什么?)。然后它会调用listenToPicture函数。

好吧我编辑我到目前为止,唯一我没有想出(我相信)是如何打印主要功能的笔记数量。顺便说一句,感谢所有帮助过我的人。你们太棒了。有没有地方可以捐赠给这个网站?

def main(): 
    pic=makePicture(pickAFile()) 
    show (pic) 
    listenToPicture(pic) 

def listenToPicture(pic): 
    w=getWidth(pic) 
    h=getHeight(pic) 

    for y in range(0,h,4): 
     printNow(str(y)) 
     for x in range (0,w,4): 
      px=getPixel(pic,x,y)        
      r=getRed(px) 
      g=getGreen(px) 
      b=getBlue(px) 
      tot=((r+g+b)/9)+24 
      playNote(tot,100,127) 
+1

您可能需要添加一些关于getPixels的更多信息。就像它返回的一样。此外,它看起来并不像您意识到内置范围功能的用途。在你的循环中,如果图片的宽度是10,图片的高度是10,那么你不会从该范围调用中得到任何东西。范围第一个数字是从哪里开始的范围,第二个是结束它的地方,第三个是步长。 4将是正确的步长,但如果说你想枚举的宽度,你会做范围(0,W,4) – Robbie 2010-03-02 17:08:25

回答

1

罗比是正确的宽度/高度的循环。

您用来获取像素和播放注释的循环看起来好像是获取所有像素并在每次获取唯一的x和y时播放它们。你应该做的是让像素在(x,y),然后拉出rgb值并调用play note。你真的不应该需要第三个for循环。你不太远。尝试用简单的英文以逻辑步骤写出问题。在我开始编码之前,我发现这有助于大量工作。

祝你好运。

1

您之前询问过的产品是similar things。那么,因为你没有提供任何关于实际检索像素值的代码,所以我认为你仍然无法做到这一点。我知道这是超出你的问题的,但上次你对你的问题非常模糊,并表示你需要更多的帮助,而不仅仅是你提出的问题。如果任何这不是必要的,那么就忽略它。我只是想提供一些建议,你可以拿走它或者离开它。

如果您还没有弄清楚如何读取像素,我推荐使用PIL。它具有打开图像文件here的功能。然后,您可以通过使用同一页面上记录的getpixel的x和y值访问图像中的像素。

为了播放音符,我建议您查看PyAudio模块,并根据您写入开放音频流的不同频率(取决于像素的大小)制作自己的正弦曲线。这部分可能有更好的包,但这是我在Python音频中的小冒险中使用的。

对于音频的东西,我会尝试在固定频率下输出声音,然后尝试实际发出变化的频率。

编辑: 你的循环更好看,所以我现在拿出我的东西,你的循环。