summaryrefslogtreecommitdiffstats
path: root/arts/midi/midisend.h
blob: cd7320551d0f10ef55ebab377e940ac8bfeabeec (plain)
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
/*

Copyright (C) 1999 Emmeran Seehuber
                   [email protected]

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

*/
#ifndef MIDISEND_H
#define MIDISEND_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>

#include "artsmidi.h"
#include <vector>
#include <iostream>
#include <string>

extern "C" 
{
#include "midimsg.h"
}

/*
  This class does the mapping of the
  channels and pitches
*/
class CMidiMap {
public:
  /*
    Reads in the mapfile pszFileName.
    Returns TRUE, if successful.
  */
  bool readMap(const char* pszFileName);
  /*
    Maps the given message according to 
    the actual read configuration.
  */
  void mapMsg(Byte* msg);

private:
  /*
    Parses a configuration line.
  */
  void parseLine(char* pszLine, const char* pszConfigFile, int nConfigLine );

  /*
    Gets the next word out of the line. throws
    the exception CEOutOfLine, if there is no 
    more word in the line.

    A word consists of all but \0, spacecharacter, ';' and
    ','
    
    pszLine is the pointer to the start of the
    line. This function modifies the pointer.
    pszWord is the pointer to the found word.
  */
  bool getNextWord(char*& pszLine, char*& pszWord);
private:

  /*
    For each channel one instance of this structure
    exists in the channelMaps. It holds the mapping information
    for nChannel.
  */
  struct ChannelMaps {
    int nChannel;

    struct ChannelRemap {
      int nPitch;
      int nChannel;
    };

    struct PitchRemap {
      int nPitch;
      int nToPitch;
    };

    typedef std::map<int,ChannelRemap> ChannelRemapMap;
    ChannelRemapMap channelRemaps;
    typedef std::map<int,PitchRemap> PitchRemapMap;
    PitchRemapMap pitchRemaps;
  };
  typedef std::map<int,ChannelMaps> ChannelMapsMap;
  ChannelMapsMap channelMaps;
};


#endif