Форум программистов, компьютерный форум, киберфорум
Basic
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 12.06.2014
Сообщений: 4
1

Виртуальное пианино

27.05.2015, 20:31. Показов 2067. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Может кто-то показать, как пишется виртуальное пианино на Basic с помощью объектно-ориентированного подхода? Хотя бы одну октаву. Я в этом полный ноль, не могу понять, с чего начать даже. Если можете на другом языке показать, прошу. Буду очень благодарен, спасибо.

Добавлено через 10 минут
Если можете какую-то обучалку дать, тоже буду рад.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.05.2015, 20:31
Ответы с готовыми решениями:

Создать объект класса Пианино, используя класс Клавиша. Методы: настроить, играть на пианино, нажимать клавишу
Помогите пожалуйста!! Создать объект класса Пианино, используя класс Клавиша. Методы:настроить,...

Пианино в C++
Только начал постигать азы и решил заняться созданием своего пианино. Пока нуждаюсь в помощи выбора...

Пианино
здравствуйте, прошу о помощи с моим виртуальным пианином, не могу добавить инструменты в listbox...

Пианино
И так. Грянула весна, пришла пора писать курсовую работу. И так, тема: "Виртуальное пианино"....

3
6807 / 2837 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
27.05.2015, 21:59 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от Sertryget Посмотреть сообщение
на Basic с помощью объектно-ориентированного подхода?
Вот сейчас про какой Basic идет речь?
Если на Vb6 надо, то есть пример
Вложения
Тип файла: zip Piano.zip (157.7 Кб, 18 просмотров)
1
Модератор
9902 / 3806 / 879
Регистрация: 22.02.2013
Сообщений: 5,679
Записей в блоге: 78
27.05.2015, 22:07 3
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Visual Basic
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
Option Explicit
 
Private Type KeyCodeTabbleType
    vk      As Integer
    note    As Long
End Type
 
Private Declare Function midiOutShortMsg Lib "winmm.dll" ( _
                         ByVal hMidiOut As Long, _
                         ByVal dwMsg As Long) As Long
Private Declare Function midiOutClose Lib "winmm.dll" ( _
                         ByVal hMidiOut As Long) As Long
Private Declare Function midiOutOpen Lib "winmm.dll" ( _
                         ByRef lphMidiOut As Long, _
                         ByVal uDeviceID As Long, _
                         ByVal dwCallback As Long, _
                         ByVal dwInstance As Long, _
                         ByVal dwFlags As Long) As Long
 
Dim hMidi           As Long
Dim KeyTabble(31)   As KeyCodeTabbleType
 
Private Sub Form_Click()
    Static program  As Long
    
    program = program + 1
    midiOutShortMsg hMidi, &HC0& Or (program * &H100)
    
End Sub
 
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    Dim note    As Long
    
    note = GetNoteFromKeyCode(KeyCode)
    
    If note >= 0 Then
        note = (note + &H30) * &H100
        midiOutShortMsg hMidi, &H7F0090 Or note
    End If
    
End Sub
 
Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
    Dim note    As Long
    
    note = GetNoteFromKeyCode(KeyCode)
    
    If note >= 0 Then
        note = (note + &H30) * &H100
        midiOutShortMsg hMidi, &H7F0080 Or note
    End If
    
End Sub
 
Private Function GetNoteFromKeyCode(KeyCode As Integer) As Long
    Dim n As Long
    For n = 0 To UBound(KeyTabble)
        If KeyTabble(n).vk = KeyCode Then GetNoteFromKeyCode = KeyTabble(n).note: Exit Function
    Next n
    GetNoteFromKeyCode = -1
End Function
 
 
Private Sub Form_Load()
    If midiOutOpen(hMidi, 0, 0, 0, 0) Then
        MsgBox "Íåâîçìîæíî îòêðûòü MIDI óñòðîéñòâî"
    End If
    CreateKeyCodeTabble
End Sub
 
Private Sub Form_Unload(Cancel As Integer)
    midiOutClose hMidi
End Sub
 
Private Sub CreateKeyCodeTabble()
' 1 Oct
    KeyTabble(0).vk = &H5A: KeyTabble(0).note = 0 ' Z
    KeyTabble(1).vk = &H53: KeyTabble(1).note = 1 ' S
    KeyTabble(2).vk = &H58: KeyTabble(2).note = 2 ' X
    KeyTabble(3).vk = &H44: KeyTabble(3).note = 3 ' D
    KeyTabble(4).vk = &H43: KeyTabble(4).note = 4 ' C
    KeyTabble(5).vk = &H56: KeyTabble(5).note = 5 ' V
    KeyTabble(6).vk = &H47: KeyTabble(6).note = 6 ' G
    KeyTabble(7).vk = &H42: KeyTabble(7).note = 7 ' B
    KeyTabble(8).vk = &H48: KeyTabble(8).note = 8 ' H
    KeyTabble(9).vk = &H4E: KeyTabble(9).note = 9 ' N
    KeyTabble(10).vk = &H4A: KeyTabble(10).note = 10 ' J
    KeyTabble(11).vk = &H4D: KeyTabble(11).note = 11 ' M
' 2 Oct
    KeyTabble(12).vk = &H51: KeyTabble(12).note = 12 ' Q
    KeyTabble(13).vk = &H32: KeyTabble(13).note = 13 ' 2
    KeyTabble(14).vk = &H57: KeyTabble(14).note = 14 ' W
    KeyTabble(15).vk = &H33: KeyTabble(15).note = 15 ' 3
    KeyTabble(16).vk = &H45: KeyTabble(16).note = 16 ' E
    KeyTabble(17).vk = &H52: KeyTabble(17).note = 17 ' R
    KeyTabble(18).vk = &H35: KeyTabble(18).note = 18 ' 5
    KeyTabble(19).vk = &H54: KeyTabble(19).note = 19 ' T
    KeyTabble(20).vk = &H36: KeyTabble(20).note = 20 ' 6
    KeyTabble(21).vk = &H59: KeyTabble(21).note = 21 ' Y
    KeyTabble(22).vk = &H37: KeyTabble(22).note = 22 ' 7
    KeyTabble(23).vk = &H55: KeyTabble(23).note = 23 ' U
' 3 Oct
    KeyTabble(24).vk = &H49: KeyTabble(24).note = 24 ' I
    KeyTabble(25).vk = &H39: KeyTabble(25).note = 25 ' 9
    KeyTabble(26).vk = &H4F: KeyTabble(26).note = 26 ' O
    KeyTabble(27).vk = &H30: KeyTabble(27).note = 27 ' 0
    KeyTabble(28).vk = &H50: KeyTabble(28).note = 28 ' P
    KeyTabble(29).vk = &HDB: KeyTabble(29).note = 29 ' [
    KeyTabble(30).vk = &HBB: KeyTabble(30).note = 30 ' +
    KeyTabble(31).vk = &HDD: KeyTabble(31).note = 31 ' ]
End Sub
На VB6 просто вставь код в форму. Смена инструмента - клик на форме мышью. Для игры нажимай клавиши на клавиатуре.
2
Кормпилятор
5025 / 1697 / 409
Регистрация: 25.04.2010
Сообщений: 4,728
Записей в блоге: 2
31.05.2015, 04:09 4
как пишется виртуальное пианино на Basic
А предметнее?

Ввод - клавиатура? MIDI? Или мышеклик? Вывод - Аудио? Системное MIDI?
Диалект тоже вероятно не любой.

Если вывод - MIDI, то the trick уже пример привёл. Этих примеров с MIDI синтезом
полным полно в интернете, действительно штука несложная.
Если вывод - аудио, то тут уже всё не так просто.
Пути два: либо семплер, либо генерация звука. Если генерация, то это либо полное
моделирование всех физических частей и их взаимодействия, либо упрощённая модель
в виде простейших синтезов. В случае семплера нужен микшер минимум на 64 канала,
с возможностью менять питч звуков, изменяемым звукогашением в реальном времени и
очень желательно, чтобы ресемплинг производился с нелинейной интерполяцией, а
микшировалось в повышенной частоте(2x хватит, но лучше 4x). Свой микшер это сложно,
но терпимо, интерполяция и доп. абилки - очень сложно, т.к. там уже замешаны алгоритмы
синхронизации с таймерами. К тому же фортепиано будет фактически бесполезно, если
в систему нельзя будет включить фильтры и ревер.
При этом нужно будет учесть педаль сустейна, без которой игра на фортепиано - ничто,
для этого полезно бы иметь отдельные каналы звука с преднастроенным ревером(+панорама),
чтобы программно его подмешивать. На мастер выходе желательно бы иметь эквалайзер.
Можно также эмулировать дамперную педаль, для этого подойдёт EQ. А также гармоники
при гашении звука(тут и генерация и семплы, и то и другое в плюс).
Но все эти задачи блекнут и меркнут перед необходимостью уложить семплы в диапазон
памяти, доступный например на x86 системах(1.5-1.6 Гб), добиться нормального звучания,
а также оптимизировать работу инструмента для конечного пользователя.
Частично это достигается обработками, правильным распределением диапазонов редакции
питча, устранением одинаковых повторяющихся velocity, запасом динамического диапазона
сигнала(большая битность), возможностью менять кол-во уровней velocity и корректировать
кривую velocity(т.е. со ввода). А если в лоб, то алгоритмы lossless компрессии, а также
интеллектуальной дисковой буфферизации. Качественный ревер тоже может серьёзно
улучшить звучание. Соединяя все эти подзадачи воедино мы получаем адскую смесь.
И ООП вам тут не сильно поможет, это банальная алгоритмизация, а также очень ёмкие
знания в области мат. анализа и обработки сигналов.


Т.е. к чему всё это. Многие думают, вот мол сейчас нафигарю виртуальных инструментов
и зашибу бабла(сделал вывод по тому, что те, кто в теме таких вопросов с "почти нуля" на
форумах не задают, очевидна смена специализации и чаще делается это именно по данной
причине). Поэтому смысл невелик, коммерческий софт не переплюнете 100%, а точнее будет
сильно хуже. Ну или у вас должна быть своя студия с живым фортепиано, чтобы можно было
и импульсы с нутров корпуса поснимать и отследить резонансы по спектрам для воссоздания
их в коде. Да и просто на хороший, живой звук ориентироваться.

Если можете какую-то обучалку дать, тоже буду рад.
Её не существует. Потому как охватывает много областей:
1) Программирование (чтобы быть способным запрограммировать звуковые устройства и форматы)
2) Математический анализ (чтобы анализировать и обрабатывать звуковой сигнал)
3) Обработка сигналов (чтобы понимать как представлен сигнал в электронном виде)
4) Физика звука (чтобы представлять как работает инструмент и моделировать его работу)
5) Звукорежиссура (для понимания состава микширования сигналов и получения различных эффектов)
6) Психоакустика (например для изучения восприятия, уровня звукового давления и его компенсации)
7) Теория музыки (РТ строй, частоты, приёмы игры на инструменте, в т.ч. худож.)

Ещё для программы надо написать шкуру, что тащит за собой ещё и
8) Дизайн (макеты интерфейса)
9) Программирование пользовательских графических интерфейсов (GUI)
10) Юзабилити (концепт UI, качество интерфейса)

Все эти знания берутся из книг, статей, примеров и собственного опыта(который может
повторять суть информации из разных источников). Единого источника не видел, всё
разбито по областям. Область наукоёмкая кто бы чего не говорил.
3
31.05.2015, 04:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.05.2015, 04:09
Помогаю со студенческими работами здесь

Простое пианино
Здравствуйте! Так как в Яве я не особо силен и начал ее изучать недавно, то по заданной лабе...

Имитация пианино
Столкнулся с такой задачей. Нужно, чтобы при нажатии заданной клавиши на динамики поступал звуковой...

Midi-Пианино
Доброго времени суток. Мне нужно написать пианино в делфи, чтобы при нажатии на кнопки клавиатуры,...

Зацените пианино:)
void pianino (int freq){ switch(getch()){ case 'a':{system("cls"); Beep(500,freq); }...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru