3

我是创建这种基于钢琴的 UI 应用程序的新手。我正在开发一个必须使用钢琴的应用程序。如何在 Iphone 中创建钢琴 UI?如何使用界面生成器创建它?或者有没有其他方法可以创建钢琴?

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

谢谢,尼拉吉

4

5 回答 5

9

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

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

编辑MyProjectViewController.h.m添加一堆带有这样签名的方法:

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

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

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

接下来,您需要添加 AudioToolbox 库作为依赖项。为此,请右键单击 Frameworks 文件夹,然后选择 Add > Existing 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);
}

按 Command-Enter 编译并运行,并制作一些音乐!

版本 2稍微优雅一些​​。

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

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

您可能会认为您想以编程方式创建声音,因为它们本质上有点数学化。但是AudioQueue,您将用来执行此操作的服务比上述代码要处理的工作要多得多,因此我实际上建议仅使用声音字节,即使在“优雅”版本中也是如此。无论如何,这样听起来可能会更好。

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

玩得开心!

于 2009-08-19T07:14:51.063 回答
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 位置时,它会给出错误的视图(因为黑键在主视图中位于白键的顶部):

替代文字 http://img215.yfrog.com/img215/1720/pianohelp.png

有没有其他方法或我/我做错了什么。请指导我。

是否可以从接触点获得准确的视图?

谢谢。

于 2009-08-31T06:19:27.670 回答
1

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

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

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

对钢琴键盘进行良好的表现并不容易,尤其是如果您尝试获得键的光泽外观并通过动画创建逼真的动作,但这是可行的。至少,你应该学习Quartz 2D和可能的一些 CAAnimation。

于 2009-08-19T07:48:26.797 回答
0

您可以从这里获得钢琴键的声音:http: //www.sonicspot.com/news/free-musical-instrument-samples.html。文件很大,你可以用 Audacity 剪切它们并导出为 .wav

于 2011-01-18T16:16:46.770 回答
0

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

于 2009-11-26T15:46:22.270 回答