如何在Iphone中创建钢琴UI?

时间:2009-08-19 04:35:50

标签: iphone piano

我是创建这种基于钢琴的UI应用程序的新手。 我正在开发一个我必须使用钢琴的应用程序。 如何在Iphone中创建钢琴UI? 如何使用Interface builder创建它?还是有其他方法来制作钢琴吗?

我迫切需要创建这样的UI,如果任何团体有任何解决方案或任何有用的代码或任何链接,将不胜感激。

谢谢, 尼拉吉

5 个答案:

答案 0 :(得分:9)

版本1 更容易编码,而不是那么优雅。

在xcode中启动基于视图的项目,并使用界面构建器编辑MyProjectViewController.xib,将形状和颜色的一系列按钮组合在一起,类似于屏幕键盘。

修改MyProjectViewController.h.m以添加一系列带有此类签名的方法:

- (IBAction) playMiddleC: (id) sender;
- (IBAction) playMiddleD: (id) sender;
- (IBAction) playMiddleE: (id) sender;

现在您可以返回界面构建器,右键单击并将每个按钮拖动到File的Owner对象(类型为MyProjectViewController)。执行此操作时,会弹出一个菜单,询问将按钮附加到哪个方法 - 为该键选择适当的方法。

现在为您要播放的每个键添加声音文件。例如,假设您有一个名为midC.caf的文件(例如,以线性PCM格式编码,作为the valid sound file formats之一)。将该文件复制到项目目录中,右键单击Resources文件夹中的(在xcode中),然后选择Add>将其添加到项目中。现有文件..然后选择你的声音文件。

接下来,您需要将AudioToolbox库添加为依赖项。通过右键单击Frameworks文件夹并选择Add>来执行此操作。现有的Frameworks ..然后浏览AudioToolbox库并选择它。

同时,回到MyProjectViewController.m,添加如下代码:

#import <AudioToolbox/AudioServices.h>

// (Later...)

- (IBAction) playMiddleC: (id) sender {
  NSString* path = [[NSBundle mainBundle]
                    pathForResource:@"midC" ofType:@"caf"];
  NSURL* url = [NSURL URLWithString:path];
  SystemSoundID midC;
  AudioServicesCreateSystemSoundID((CFURLRef)url, &midC);
  AudioServicesPlaySystemSound(midC);
}

点击命令 - 输入编译并运行,并制作一些音乐!

版本2 稍微优雅一点。

以编程方式构建一个键盘UI,其中一个数组用于白键,另一个用于黑色(因为它们的坐标略有不同)。我建议使用自定义UIButton类型的图像,用于每种按键类型的按下和非按压版本(黑色,C / F,B / E和A / D / G,它们是中间白键 - 我是这里的关键缩进)。

这将允许您在数组中存储指向这些按钮的指针,并且只有一个方法可以播放任何键的声音,还可以将声音ID存储在相应的数组中。

你可能认为你想以编程方式创建声音,因为它们本质上是数学上的。但是你会使用的AudioQueue服务比上面的代码要处理的工作要多得多,所以我实际上建议只使用声音字节,即使在“优雅”版本中也是如此。无论如何,它甚至可能听起来更好。

顺便说一句,你的问题听起来好像你认为这是一个快速简单的入门应用,但我不太确定。学习开发iPhone应用程序很有趣,但需要花费一些时间和精力才能做好。如果您对入门应用程序的想法感兴趣,我建议您一次查找能够运用一项新编程技能的内容,例如学习使用无处不在的UITableView,或者使用快速应用程序例如,图片并将其附加到电子邮件中(这很容易,因为iPhone SDK非常支持拍照和电子邮件撰写)。

玩得开心!

答案 1 :(得分:2)

感谢您的回复...

我差不多完成了开发钢琴UI的工作。

我使用编程方法创建黑键和白键。

CGFloat buttonWhitePosX = 2.0; //white button start position
for(int i=0;i<8;i++){ //8 keys in one octave
    CGFloat buttonWhitePosY = 105;
    CGFloat buttonWhiteWidth = 57;
    CGFloat buttonWhiteHeight = 190;

    UIButton *buttonWhite = [[UIButton alloc] initWithFrame:CGRectMake(buttonWhitePosX, buttonWhitePosY, buttonWhiteWidth, buttonWhiteHeight)];
    buttonWhitePosX = buttonWhitePosX + WHITE_BUTTON_SPACE + buttonWhiteWidth;
    [buttonWhite setBackgroundImage:whiteImage forState:UIControlStateNormal];
    [buttonWhite addTarget:self action:@selector(pressButtonWhiteTouchDown:) forControlEvents:UIControlEventTouchDown];

    buttonWhite.tag = i;
    [buttonWhite setBackgroundImage:whiteImageHighlighed forState:UIControlEventTouchDragInside];
    [self.view addSubview:buttonWhite];
    [buttonWhite release];

}

使用不同坐标的黑键的方法相同。

此外,我可以按下按键使用AVPlayer播放声音。(在选择器上触摸下来)

到目前为止一切都那么好但是当用户滑过琴键时,钢琴应该播放受人尊敬的声音。

要实现这一点,请尝试使用

1)为UIButton使用了UIControl事件。 DragEnter,拖动退出,向内拖动。 但它不会给我一个完全按下的按钮,如 拖动出口位置在绘制按钮之外

2)使用touchesBegan,touchesEnded,touchesMoved主视图(放置黑白键)。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [[event allTouches] anyObject];
    CGPoint touchLocation = [touch locationInView:touch.view];
    currentView = [self.view hitTest:touchLocation withEvent:nil]; //get top view
    if(currentView != self.view){ //check current view is main view, do nothing
        if(currentView == prevView){ //check current view is prev view, keep highlight image
            currentView.backgroundColor = [UIColor colorWithPatternImage:whiteImageHighlighed];
        }else{ //view changed, change image and play sound
            prevView.backgroundColor = [UIColor colorWithPatternImage:whiteImage];
            currentView.backgroundColor = [UIColor colorWithPatternImage:whiteImageHighlighed];
            [self pressButtonWhiteDown1:currentView.tag];
            prevView = currentView;
        }
    }
}

在这种方法中,当用户在白键上滑动并遇到黑键的X位置(在主视图中黑键位于白键顶部)时,它会给出错误的视图:

alt text http://img215.yfrog.com/img215/1720/pianohelp.png

是否有任何其他方法或其他方面我做错了。请指导我。

是否可以从触摸点获得精确的视图?

感谢。

答案 2 :(得分:1)

一种方法是拍摄钢琴键盘的图片并以图像为起点。

另一种方法是在默认位置和按键位置绘制Photoshop或其他应用程序中的键,并将其作为基础。

在App Store上搜索并查看钢琴键盘实现的不同方式。有一些,有些看起来比其他更现实。

很好地表现钢琴键盘并不容易,特别是如果你试图获得键的光滑外观并通过动画创建逼真的动作,但它是可行的。至少,你应该研究Quartz 2D和可能的一些CAAnimation。

答案 3 :(得分:0)

我做了一些非常相似的事情。我使用带有圆角的普通按钮,使每个按钮都播放WAV声音。它工作得很好!

答案 4 :(得分:0)

您可以从此处获取钢琴键声音:http://www.sonicspot.com/news/free-musical-instrument-samples.html。文件非常大,您可以使用Audacity剪切它们并导出到.wav