Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Objective-C

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.90
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
#1

Массивы (музыкальная программа) - Objective-C

16.04.2012, 11:39. Просмотров 3651. Ответов 44
Метки нет (Все метки)

Привет всем, сразу скажу что я новичок, но необходимо сделать приложение и я потихонку изучаю шаг за шагом что к чему, задача у меня сделать приложение в котором человек бы брынчал по клавишам фортепиано, они в свою очередь должны запоминаться соответственно (нота,октава), после чего программа берет полученную последовательность нот и собирает из нее последовательность согласно аккордам, после чего проигрывает полученную последовательность по одной ноте.

Но остановился я на моменте забивания нажатых клавиш в массив. мне нужно как то объявить массив снаружи, а потом внутри действия нажатия каждой клавиши в него всякое добавлять последовательно, я попробовал insertObject atIndex не получается выводит пустой массив, сначала думал что проблема в переводе массива в строку и выводе, но потом понял что массив просто пустой, после некоторого колдовства обнаружил что если массив объявлять внутри IBAction{} то все нормально, в общем как то так, заранее спасибо)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2012, 11:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Массивы (музыкальная программа) (Objective-C):

Музыкальная коллекция - PascalABC.NET
Музыкальная коллекция. Организуйте структуру для хранения информации о музыкальные произведения: исполнитель, альбом (сборник), время...

Музыкальная открытка на микроконтроллере - Микроконтроллеры
хочу сделать музыкальную открытку, подскажите пожалуйста, можно ли перепрограммировать уже готовую открытку, а если нет, тото как это можно...

Музыкальная картотека в динамическом массиве - C++
Написать программу, которая позволяет хранить музыкальную картотеку в динамическом массиве. Каждая запись должна содержать: Тип...

Нужна музыкальная база даных - MS Access
Поделитесь пожалуйста простенькой музыкальной базой

Музыкальная коллекция. taglib treeview QAbstractItemModel - C++ Qt
Добрый день! Нашел в сети такой вот редактор тегов - http://code.google.com/p/qtagger/ Десять раз прочитал документацию -...

Разработать консольное приложение с XML базой данных. Тема: музыкальная библиотека - C#
1 Разработать структуру файла XML для хранения информации об объектах предметной области. 2. Разработать DTD или Schema XML (по выбору...

44
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
17.04.2012, 20:57 #16
И что вы хотите сделать то? Я просто не понимаю где не так то что? Поставьте breakpointы в методы sound\1\2 и посмотрите что там у вас в массиве, после добавления объектов.
0
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
17.04.2012, 21:14  [ТС] #17
zulkis, суть в следующем при нажатии на клавиши соответствующие sound,sound2,sound3, воспроизводится звук и вместе с этим в массив забивается сначала номер клавиши 1,2,3 соответственно а затем номер октавы взятый с сегментКонтроллера, и для проверки я вывожу этот массив через label вместе с нажатием клавиши 3, так вот когда я перебросил инициализацию в инит массив выводится пустой, т.е была надпись Label при нажатии на 3ю клавишу она пропадает и все, когда же массив инициализировался в первой кнопке выводилась последовательность цифр, через запятую, но в случае повторного вызова первой кнопки массив перезаполнялся
0
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
17.04.2012, 21:22 #18
Уберите из методов строчки
Objective-C
1
[notesArray addObject:[NSNumber numberWithInt:n]];
У вас получачется в массиве и строчки и объекты типа NSNumber.
И если честно, я не уверен как себя поведет componentsJoinedByString: в этом случае.
Вместо этого можете добавлять так:
Objective-C
1
[notesArray addObject:[NSString stringWithFormat:@"%d", n]];
0
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
17.04.2012, 21:30  [ТС] #19
zulkis, убрал, заменил все так же, да с этим не было проблем вроде добавляло все как надо, а вот инициализированный в ините массив отказывается видеть((
0
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
17.04.2012, 21:35 #20
Objective-C
1
static NSMutableArray *notesArray = NULL; //изменить на nil
И это же у Вас контроллер, да еще и инициализация через xib?
измените весь init на:
Objective-C
1
2
3
4
5
6
7
8
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
          notesArray = [[NSMutableArray alloc] initWithCapacity:12];
    }
    return self;
}
0
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
17.04.2012, 22:00  [ТС] #21
zulkis, я не xib использую у меня storyboard когда создавал проект не обратил внимание, да и думал разницы нету

Добавлено через 2 минуты
zulkis, все поменял, та же картина(

Добавлено через 6 минут
брейкпоинт зафиксировал пустой массив
0
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
17.04.2012, 22:01 #22
Я со storyboard не работал, и разбираться сейчас не буду. Пойду спать.
Что там как вызывается при создании контроллера из сторибоарда не в курсе.
Проинициализируйте Ваш массив в viewdidload:
Objective-C
1
2
3
4
- (void)viewDidLoad {
  [super viewDidLoad];
  notesArray = [[NSMutableArray alloc] initWithCapacity:12];
}
Так должно все работать.
1
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
17.04.2012, 22:07  [ТС] #23
zulkis, спасибо огромное за столько полезных советов, реально я бы не справился сам, и кстати только что с viewDidLoad заработало!! Спасибо большое, спокойной ночи)
0
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
19.04.2012, 21:25  [ТС] #24
zulkis, прошу прощения за беспокойство, но возник вопрос, а точнее два, первый это есть ли метод для поиска строки в строке, ну типа найти "привет" в строке "привет как дела", и второй можно ли как то скинуть приложение на девайс, прошивка 5.0.1 джейл есть. икскод один из последних, метод с "Не подписывать приложение" через плист не работает
0
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
20.04.2012, 06:13 #25
Есть классные методы hasSuffix и hasPrefix (проверяют является ли подстрока концом и началом строки соответственно)
А для конкретного нахождния подстроки можете использовать rangeOfString, а затем сравнивать полученный NSRange.location с NSNotFound. И если строка будет найдена, то в location будет номер первого символа, а length будет соответственно длина.

Читаем:
Немного про NSRange
Ну и найдите в доке описание rangeOfString, stringWithRange, hasPrefix, hasSuffix.
1
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
20.04.2012, 10:33  [ТС] #26
zulkis, хмм, почитал я про range и все с ним связанное, и понял что не правильно сформулировал вопрос, ну т.е я искал что-то на подобие bool containts только для строк, потому что в массиве у меня каждая цифра это элемент, а мне необходимо найти например 60813151 в этом массиве, рэйнджы возвращают диапазон, а я хочу чтобы просто 1 или 0
0
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
20.04.2012, 12:26 #27
Сравните NSRange.location с NSNotFound
Типа:
Objective-C
1
2
3
4
NSRange range = [@"OLOLO" rangeOfString:@"LOL"];
        if (range.location != NSNotFound) {
            NSLog(@"LOL Found at %d", range.location);
        }
Или:
Objective-C
1
2
3
4
5
6
NSString *string = @"hello bla bla";
if ([string rangeOfString:@"bla"].location == NSNotFound) {
  NSLog(@"string does not contain bla");
} else {
  NSLog(@"string contains bla!");
}
1
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
20.04.2012, 22:19  [ТС] #28
zulkis, наверное последний вопрос, вы не знаете как заставить несколько звуков играться не вместе а друг за другом?
0
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
20.04.2012, 23:00 #29
Ну вы можете создать очередь, а затем запускать воспроизведение звука из этой очереди с возведением запуска таймера на временной отрезок данного звука. При следующем срабатывании таймера вы запускаете следующий звук и снова включаете таймер.
1
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
21.04.2012, 08:43  [ТС] #30
zulkis, поковырялся я в примерах с таймером понял только то что таймером можно вызывать какое то действие т.е IBAction а мне нужно просто выполнять операции внутри if и в этом случае непонятно что писать в селектор например

Objective-C
1
(NSTimer *)timerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
if ([result rangeOfString:@"63143454"].location != NSNotFound) 
    {
        CFBundleRef mainBundle1 = CFBundleGetMainBundle();
        CFURLRef soundFileURLRef1;   
        soundFileURLRef1= CFBundleCopyResourceURL(mainBundle1, (CFStringRef) @"11650__techsetsu__grandmither-s-piano-31", CFSTR ("wav"), NULL);
        CFBundleRef mainBundle2 = CFBundleGetMainBundle();
        CFURLRef soundFileURLRef2;   
        soundFileURLRef2= CFBundleCopyResourceURL(mainBundle2, (CFStringRef) @"11644__techsetsu__grandmither-s-piano-25", CFSTR ("wav"), NULL);
        CFBundleRef mainBundle3 = CFBundleGetMainBundle();
        CFURLRef soundFileURLRef3;   
        soundFileURLRef3= CFBundleCopyResourceURL(mainBundle3, (CFStringRef) @"11646__techsetsu__grandmither-s-piano-27", CFSTR ("wav"), NULL);
        CFBundleRef mainBundle4 = CFBundleGetMainBundle();
        CFURLRef soundFileURLRef4;   
        soundFileURLRef4= CFBundleCopyResourceURL(mainBundle4, (CFStringRef) @"11648__techsetsu__grandmither-s-piano-29", CFSTR ("wav"), NULL);
        UInt32 soundID1;
        AudioServicesCreateSystemSoundID(soundFileURLRef1, &soundID1);
        AudioServicesPlaySystemSound(soundID1);
        UInt32 soundID2;
        AudioServicesCreateSystemSoundID(soundFileURLRef2, &soundID2);
        AudioServicesPlaySystemSound(soundID2);
        UInt32 soundID3;
        AudioServicesCreateSystemSoundID(soundFileURLRef3, &soundID3);
        AudioServicesPlaySystemSound(soundID3);
        UInt32 soundID4;
        AudioServicesCreateSystemSoundID(soundFileURLRef4, &soundID4);
        AudioServicesPlaySystemSound(soundID4);
        
    }
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2012, 08:43
Привет! Вот еще темы с ответами:

Массив структур "Музыкальная школа": вывести информацию по ученикам, играющим на заданном инструменте - C++
Создать массив, элементами которого являются структуры – список учеников музыкальной школы (фамилия, инструмент, год обучения). Вывести...

Программа на массивы - Pascal
Ввести массив А из 7 целых чисел из файла, массив B из 9 псевдослучайных чисел от 1,0 до 2,0 и массив С размерности 5х2 из вещественных...

программа на массивы - Pascal
Даны сведения о массах 16 грузов - массив А . 1) Сформировать массив В из грузов с массой >4 т. Общая масса грузов В не должна...

программа на массивы - C++
Элементы массива B(1;M) расположить в порядке возрастания их значений Весьма благодарен заранее Добавлено через 14 секунд ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
21.04.2012, 08:43
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru