7
votes

Obtenir des signaux d'un port MIDI en C #

J'ai acheté un clavier Midi pour mon anniversaire. J'ai trouvé un programme (Midipiano) qui obtient des signaux de la contribution MIDI et le traduit en musique, mais je préférerais écrire un moi-même.

Où puis-je trouver la documentation pour faire une telle tâche? Le protocole MIDI est bien documenté, mais pas les ports MIDI.

J'ai vérifié deux projets de CodeProject (Project MIDI et C # MIDI Toolkit), mais j'ai passé de nombreuses heures sans se rapprocher de mon objectif.

Une référence à un projet ira bien, mais s'il vous plaît, seulement C #.


0 commentaires

6 Réponses :


2
votes

Je ne pouvais pas trouver beaucoup non plus, mais comme Josh dit, Carl a certainement fait un peu de travail sur Midi, alors lui donner peut-être un email ... il peut même répondre, mais il est généralement un vb.net mec donc à moins que quelqu'un a porté ses affaires à C #?

Pour d'autres références qui semblaient prometteuses ...

Si vous recherchez une solution C # pure C # ... Jetez un coup d'œil à alvas.audio . Il a l'air un peu haut de gamme pour ce que vous demandez, mais peut vous aider.

Aussi peut-être Projet MIDI


1 commentaires

Merci Mark, et s'il vous plaît voir mon commentaire à Josh. Je vais demander à Carl après avoir couvrant son projet à WPF. Bien sûr, j'aurai beaucoup de questions alors.



7
votes

Vous devez envelopper toutes les fonctions nécessaires répertoriées à http : //msdn.microsoft.com/en-us/library/dd757277 (vs.85) .aspx

Ce n'est pas trop difficile si vous utilisez des messages courts, les choses sont un peu plus compliquées si Vous voulez faire des streaming Sysex ou de sortie.

Tout ce dont vous avez besoin pour un port d'entrée de base consiste à obtenir les identifiants d'entrée valides (INPUTCOUTE -1), transmettez un ID valide pour ouvrir, démarrer l'entrée, recevoir la saisie. Messages via un délégué ... Arrêtez l'entrée et enfin le fermer. C'est un exemple très rugueux de la manière dont cela pourrait être acheminé - vous devrez faire de la vérification et veiller à ce que le port ne soit pas collecté avant sa fermeture et que le rappel fermé est arrivé ou si vous gelez votre système!

bonne chance! xxx


1 commentaires

Davey dit: "Recevez les messages via un délégué ...", et c'est exactement mon problème actuel. Nativemethods.MidiinProC a-t-il résolu le problème? Si simple, un délégué prêt à l'emploi? Merci, Davey, je vais vérifier le week-end prochain.



1
votes

Utilisez la boîte à outils C # MIDI pour recevoir les informations MIDI de votre clavier (connectées à la carte audio MIDI de votre carte audio). Pour créer de l'audio (musique ou tons), vous devez générer un flux continue de données audio numériques. Vous pouvez commencer par la boîte à outils C # Synth (même auteur que la boîte à outils MIDI) pour écrire votre propre synthé.

Mais vous pouvez également télécharger un programme de séquenceur (Open Source) (Open Source) (Audacity par exemple) et utiliser la VST Instrument Plugins pour faire le travail pour vous. Il y a beaucoup de plugins gratuits disponibles sur le Web.


0 commentaires

2
votes

Je suis juste dans le développement du processus de communication C # MIDI. La boîte à outils MIDI de Sanford est bonne mais la mise en œuvre de Leslie a de nombreuses améliorations qui rend le code moins lisible. Mon code est aussi simple que possible. Si vous voulez que vous puissiez me rejoindre. Dans quelques jours, je publie un moniteur MIDI entièrement fonctionnel. Il suffit de regarder http://puremidi.codeplex.com/


1 commentaires

Merci pour votre réponse. Je suis maintenant impliqué dans d'autres projets WPF / ADO.NET / INTEROP, et, comme pour l'instant, cela va être un moment avant que je puisse retourner à la musique. Quand le temps vient, je serai en contact.



0
votes

Je l'ai résolu de manière rond-point en écrivant un script Python pour transmettre un paquet UDP chaque fois qu'une note marche / arrêt se produit sur le clavier MIDI.

MIDI sur TCP / IP / Udp à recevoir Inunity3D avec C # /. Net

De cette façon, la plate-forme spécifique MIDI Stuff est enveloppée et je peux écrire la plate-forme Agnostic C # Code pour ramasser le paquet UDP.


0 commentaires

0
votes

avec DrywetMidi Vous pouvez obtenir des événements à partir d'un port MIDI avec ce code:

namespace InputDeviceExample
{
    class Program
    {
        private static IInputDevice _inputDevice;

        static void Main(string[] args)
        {
            _inputDevice = InputDevice.GetByName("Some MIDI device");
            _inputDevice.EventReceived += OnEventReceived;
            _inputDevice.StartEventsListening();

            Console.WriteLine("Input device is listening for events. Press any key to exit...");
            Console.ReadKey();

            (_inputDevice as IDisposable)?.Dispose();
        }

        private static void OnEventReceived(object sender, MidiEventReceivedEventArgs e)
        {
            var midiDevice = (MidiDevice)sender;
            Console.WriteLine($"Event received from '{midiDevice.Name}' at {DateTime.Now}: {e.Event}");
        }
    }
}


0 commentaires