Account Options

  1. Sign in
The old Google Groups will be going away soon, but your browser is incompatible with the new version.
Google Groups Home
« Groups Home
v97i018: TM [1.2] - Bars and Pipes Transport Monitor, Part 01/01
There are currently too many topics in this group that display first. To make this topic appear first, remove this option from another topic.
There was an error processing your request. Please try again.
flag
  1 message - Collapse all  -  Translate all to Translated (View all originals)
The group you are posting to is a Usenet group. Messages posted to this group will make your email address visible to anyone on the Internet.
Your reply message has not been sent.
Your post was successful
 
From:
To:
Cc:
Followup To:
Add Cc | Add Followup-to | Edit Subject
Subject:
Validation:
For verification purposes please type the characters you see in the picture below or the numbers you hear by clicking the accessibility icon. Listen and type the numbers you hear
 
Richard Hagen  
View profile  
 More options Nov 18 1997, 3:00 am
Newsgroups: comp.sources.amiga
Followup-To: comp.sys.amiga.misc
From: Richard Hagen <R.Ha...@mailbox.uq.edu.au>
Date: 1997/11/18
Subject: v97i018: TM [1.2] - Bars and Pipes Transport Monitor, Part 01/01

Submitted-by: Richard Hagen <R.Ha...@mailbox.uq.edu.au>
Posting-number: Volume 97, Issue 18
Archive-name: music/TM-1.2/part01
URL: http://www.it.uq.edu.au/~richard/music/bars-and-pipes/index.html#prog...

[ Executable (tm.ptool) included.     ...zim ]

TM: A Bars and Pipes Transport Monitor

Place it in a track. Open TM's window, then watch the commands
stream by as you play with the transport!

#!/bin/sh
# This is music/TM-1.2, a shell archive (produced by shar 3.49)
# To extract the files from this archive, save it to a file, remove
# everything above the "!/bin/sh" line above, and type "sh file_name".
#
# made 11/18/1997 18:32 UTC by z...@ibx.com
#
# existing files will NOT be overwritten unless -c is specified
#
# This shar contains:
# length  mode       name
# ------ ---------- ------------------------------------------
#   1233 -rw------- dmakefile
#   2170 -rw------- myheader.h
#   8469 -rw------- tm.c
#   2356 -rw------- tm.ptool
#   1386 -rw------- tm.readme
#
if test -r _shar_seq_.tmp; then
        echo 'Must unpack archives in sequence!'
        echo Please unpack part `cat _shar_seq_.tmp` next
        exit 1
fi
# ============= dmakefile ==============
if test -f 'dmakefile' -a X"$1" != X"-c"; then
        echo 'x - skipping dmakefile (File already exists)'
        rm -f _shar_wnt_.tmp
else

> _shar_wnt_.tmp

echo 'x - extracting dmakefile (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'dmakefile' &&
#
# The name of the tool.
#
TOOL = tm
X
#
# The source files that you need to build the tool.
#
MYSRCS = tm.c
X
MYHDRS = myheader.h
X
#
# You might want to tinker with the compiler flags and libraries.
#
# -3.0  - Compile for a 3.0 system (optional)
# -mc   - Small code model
# -md   - Small data model
#
CFLAGS = -3.0 -mc -md
X
#
# Required libraries
#
# amiga30s.lib  - The small code version of the Amiga library
# cs.lib        - The small code version of the C library
#
LIBS =  amiga30s.lib cs.lib
X
#
# You shouldn't have to touch anything below here.
#
# (FYI: (It's important that toolstart.c gets listed first... toolstart.o
#  has to be the first thing mentioned when the tool is linked
#  together.)
#
PTOOL = $(TOOL).ptool
README = $(TOOL).readme
ARCHIVE = $(TOOL).lha
X
SRCS = toolstart.c $(MYSRCS)
OBJS = $(SRCS:*.c:*.o)
X
all: $(PTOOL)
X
$(PTOOL):       $(OBJS)
X       dlink $(OBJS) $(LIBS) -o $(PTOOL)
X
$(OBJS):        $(SRCS)
X       dcc $(CFLAGS) -c %(right) -o %(left)
X
# I use emacs, so I tend to have a lot of backup files ending in ``!''
# lying around.
clean:
X       delete $(OBJS) *!
X
clobber:        clean
X       delete $(PTOOL) $(ARCHIVE)
X
distribution:   $(ARCHIVE)
X
$(ARCHIVE):     clobber $(PTOOL) clean
X       lha a $(ARCHIVE) dmakefile $(PTOOL) $(MYHDRS) $(MYSRCS) $(README)
X
X
X
SHAR_EOF
chmod 0600 dmakefile ||
echo 'restore of dmakefile failed'
Wc_c="`wc -c < 'dmakefile'`"
test 1233 -eq "$Wc_c" ||
        echo 'dmakefile: original size 1233, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= myheader.h ==============
if test -f 'myheader.h' -a X"$1" != X"-c"; then
        echo 'x - skipping myheader.h (File already exists)'
        rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp

echo 'x - extracting myheader.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'myheader.h' &&
/*
X   myheader.h - Useful #defines and typedefs for tool/accessory programs.
*/
X
#ifndef MYHEADER_H
#define MYHEADER_H
X
/* Length of tool/accessory id. */
#define ID_LEN 4
X
/* Make an id out of four characters. */
#define MAKE_ID(a, b, c, d)     ((ULONG) ((((a << 8) + b << 8) + c << 8) + d))
X
/* Make an id out of a string. */
#define MAKE_IDS(s)             (MAKE_ID(s[0], s[1], s[2], s[3]))
X
/* Split an id into four characters. */
#define SPLIT_ID(id, a, b, c, d)        \
do {                                    \
X  a = (UBYTE) ((id >> 24) & 0xff);   \
X  b = (UBYTE) ((id >> 16) & 0xff);   \
X  c = (UBYTE) ((id >> 8) & 0xff);    \
X  d = (UBYTE) (id & 0xff);         \
} while (0)

X
/* Split an id into a string. */
#define SPLIT_IDS(id, s)                \
do {                                    \
X  SPLIT_ID(id, s[0], s[1], s[2], s[3]);        \
} while (0)

X
/* Maximum MIDI note # */
#define MIDI_NOTE_MAX (127)
X
/* Number of MIDI notes. */
#define MIDI_NOTE_NUM (MIDI_NOTE_MAX + 1)
X
/* Maximum program change number. */
#define PC_CHANGE_MAX 127
X
/* Number of program changes. */
#define PC_CHANGE_NUM (PC_CHANGE_MAX + 1)
X  
/* Flags for use in the BRB file requester. */
#define FILES_DELETE    1               /* Delete button */
#define FILES_OPEN      2               /* Open button */
#define FILES_SAVE      4               /* Save button */
#define FILES_TEST      8               /* ??? */
#define FILES_TYPE      16              /* Type string gadget */
#define FILES_PATH      32              /* Path string gadget */
X
/* Initial placement of tool/accessory windows. */
#define INITIAL_LEFT    50
#define INITIAL_TOP     50
X
/* Unprototyping cast. */
typedef __geta4 long (*no_prototype)();
X
/* Void cast. */
typedef __geta4 void (*void_prototype)();
X
/* Event *cast. */
typedef __geta4 struct Event *(*event_prototype)();
X
/* For non-stdio debugging messages. */
#define DEBUG(message)                                          \
do {                                                            \
X  struct EasyStruct es = {                                     \
X    sizeof(struct EasyStruct),                                 \
X    0,                                                         \
X    "Debugging information",                                 \
X    "Message: %s",                                           \
X    "OK"                                                     \
X    };                                                         \
X  (void) EasyRequest(functions->window, &es, 0, message);       \
} while (0)

X
#define NOTE_LENGTH(x)  (768 >> (x))
X
#define MBC_STRING_LENGTH 12
X
#define CLOCKSPERMEASURE 768L
X
#define STREQ(x, y) (strcmp((x), (y)) == 0)
#define STREQN(x, y, n) (strncmp((x), (y), (n)) == 0)
X
#endif  /* MYHEADER_H */
SHAR_EOF
chmod 0600 myheader.h ||
echo 'restore of myheader.h failed'
Wc_c="`wc -c < 'myheader.h'`"
test 2170 -eq "$Wc_c" ||
        echo 'myheader.h: original size 2170, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= tm.c ==============
if test -f 'tm.c' -a X"$1" != X"-c"; then
        echo 'x - skipping tm.c (File already exists)'
        rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp

echo 'x - extracting tm.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'tm.c' &&
/*
X  TM: A Bars and Pipes Transport Monitor tool.
X
X  Copyright (C) 1997 Richard Hagen
X
X  This code is released into the Public Domain, and may be freely
X  distributed in its original form.
X  
X  It is supplied ``as is'', and comes with no warranty.
X  This program code was released because it might be useful as a
X  starting point for other programmers. However, if any damage arises
X  from its use, the original author will not be held liable.
X  
X  You are free to use and modify this code to your heart's content,
X  provided you acknowledge me as the original author in any code
X  that you might distribute which is based largely on this code.
X  
X  I acknowledge that the design of this accessory is influenced
X  strongly by the example code supplied with the Rules for Tools
X  package. However, I have made substantial contributions of my
X  own.
X  
X  Richard Hagen
X  R.Ha...@mailbox.uq.edu.au
X  
X  History:
X       1.2 (22 September 1997)
X       Made it a normal tool.
X
X       1.1 (15 September 1997)
X       Improved efficiency of the code.
X
X       1.0 (13 September 1997)
X        Initial release.
*/
X
#include <libraries/dos.h>
#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <exec/memory.h>
#include <string.h>
#include <intuition/intuition.h>
#include <intuition/sghooks.h>
X
#include "bars.h"
#include "myheader.h"
X
#define TM_NAME "Transport Monitor 1.2"
X
#define TM_ID MAKE_IDS("TMON")
X
#define TM_TYPE (TOOL_NORMAL | TOOL_NOTPAD)
X
__chip static UWORD tm[] = {
X  /*------ plane # 0: --------*/
X  0x0, 0x0,
X  0x3fff, 0xfc00,
X  0x2000, 0x0400,
X  0x2000, 0x0400,
X  0x2000, 0x0400,
X  0x2000, 0x0400,
X  0x2000, 0x0400,
X  0x2000, 0x0400,
X  0x2000, 0x0400,
X  0x2000, 0x0400,
X  0x3fff, 0xfc00,
X  0x0, 0x0,
X
X  /*------ plane # 1: --------*/
X  0x0, 0x0,
X  0x0, 0x0,
X  0x1fff, 0xfc00,
X  0x101b, 0xec00,
X  0xdef9, 0xcf00,
X  0xdefa, 0xaf00,
X  0xdefb, 0x6f00,
X  0xdefb, 0xef00,
X  0x1efb, 0xec00,
X  0x1fff, 0xfc00,
X  0x1fff, 0xfc00,
X  0x0, 0x0,
X
X  /*------ plane # 2: --------*/
X  0x0, 0x0,
X  0x0, 0x0,
X  0x0, 0x0,
X  0x0fe4, 0x1000,
X  0x0106, 0x3000,
X  0x0105, 0x5000,
X  0x0104, 0x9000,
X  0x0104, 0x1000,
X  0x0104, 0x1000,
X  0x0, 0x0,
X  0x0, 0x0,
X  0x0, 0x0,
X
};

X
static struct Image tm_image = {
X  0,0,
X  24 , 12 , 3 ,
X  &tm[0],
X  0x1f,0x00,
X  NULL
};      

X
/* Length of a transport commmand name string. */
#define TC_NAME_LENGTH 13
X
/* Strings for the names of the transport commands. */
static const char *tc_names[8] = {
X  "            ",    /* There is no transport command 0 */
X  "TC_START    ",
X  "TC_STOP     ",
X  "TC_POSITION ",
X  "TC_RECORDON ",
X  "TC_RECORDOFF",
X  "TC_PLAY     ",
X  "TC_TICK     "
X  };
X    
/* For storing output information. */
struct Line {
X  char command[TC_NAME_LENGTH];                /* String for transport command. */
X  char start[MBC_STRING_LENGTH];       /* String for the start time. */
X  char end[MBC_STRING_LENGTH];         /* String for the end time. */
};

X
#define LINE_LENGTH TC_NAME_LENGTH + MBC_STRING_LENGTH + MBC_STRING_LENGTH
#define NUM_LINES 20
X
#define WINDOW_WIDTH (LINE_LENGTH * 8) + 10
#define WINDOW_HEIGHT (NUM_LINES * 10) + 15
X
struct TMTool {
X  struct Tool tool;
X
X  int line;
X  char lines[NUM_LINES][LINE_LENGTH];          /* The lines of output. */
};

X
extern struct Functions *functions;
X
static void
X  tm_tool_init(struct TMTool *tool)
{
X  tool->tool.touched = TOUCH_INIT;
X
X  tool->line = 0;
X
X  for (int i = 0;
X       i < NUM_LINES;
X       i++)
X    {
X      for (int j = 0;
X          j < LINE_LENGTH - 1;
X          j++)
X       {
X         tool->lines[i][j] = ' ';
X       }
X      tool->lines[i][LINE_LENGTH] = '\0';
X    }
}

X
static struct ToolMaster master;
X
static void
display_lines(struct TMTool *tool)
{
X  struct RastPort *rp = tool->tool.window->RPort;
X  
X  SetAPen(rp, 1);
X  SetBPen(rp, 0);
X  SetDrMd(rp, JAM2);
X  
X  int line = tool->line;
X
X  for (int i = 0;
X       i < NUM_LINES;
X       i++)
X    {
X      Move(rp, 7, WINDOW_HEIGHT - 5 - i * 10);
X      
X      Text(rp, tool->lines[line], LINE_LENGTH - 1);
X      line = (line == 0) ? NUM_LINES - 1 : line - 1;
X    }
}

X
/* Update and display commands if necessary. */
static void
X  transporttool(struct TMTool *tool,
X               const long command,     /* Transport command. */
X               const long start,       /* Start time for command. */
X               const long end) /* End time for command. */
{
X  char start_string[MBC_STRING_LENGTH];
X  char end_string[MBC_STRING_LENGTH];
X
X  (*functions->timetostring)(&(tool->tool.track->clip), start, start_string);
X  (*functions->timetostring)(&(tool->tool.track->clip), end, end_string);
X
X  tool->line = (tool->line + 1) % NUM_LINES;
X  sprintf(tool->lines[tool->line], "%s %s %s",
X         tc_names[command],
X         start_string, end_string);
X
X  /* Display the info if the window is open. */
X  if (tool->tool.window)
X    {
X      display_lines(tool);
X    }
}

X
/* Called whenever something happens in the transport. */
__geta4                 /* Callback. */
void transportcode(long command,        /* Transport command. */
X                  long start,          /* Start time for command. */
X                  long end)            /* End time for command. */
{
X  /* Find all the TMTools and get them to do their thing. */
X  for (struct Track *track = functions->tracklist;  
X       track;
X       track = track->next)
X    {
X      for (struct Tool *tool = track->toollist;
X          tool;
X          tool = tool->next)
X       {
X         if (tool->toolid == TM_ID)
X           {
X             transporttool((struct TMTool *)tool, command, start, end);
X           }
X       }
X    }
}

X
/* Process notes. */
__geta4                 /* Callback. */
struct Event *
X  processeventcode(struct Event *event)
{
X  event->tool = event->tool->next;    /* Doesn't do anything! */
X  return(event);
}

X
struct NewWindow TMNewWindowStructure1 = {
X  20, 20,
X  305, WINDOW_HEIGHT,
X  0,6,
X  GADGETDOWN+GADGETUP+CLOSEWINDOW,
X  WINDOWDRAG+WINDOWDEPTH+WINDOWCLOSE+ACTIVATE+NOCAREREFRESH,
X  NULL,
X  NULL,
X  "Transport Monitor",
X  NULL,
X  NULL,
X  5,5,
X  -1,-1,
X  CUSTOMSCREEN
};

X
/* Interface driver called by Bars and Pipes. */
__geta4         /* Callback. */
void edittoolcode(struct TMTool *tool)
{
X  struct IntuiMessage *message;
X  struct Window *window;
X  long class, code;
X  struct Gadget *gadget;
X  struct NewWindow *newwindow;
X
X  if (!tool->tool.touched)
X    {
X      tm_tool_init(tool);
X    }
X  
X  TMNewWindowStructure1.Screen = functions->screen;
X  
X  if (tool->tool.touched & TOUCH_EDIT)
X    {
X      TMNewWindowStructure1.LeftEdge = tool->tool.left;
X      TMNewWindowStructure1.TopEdge = tool->tool.top;
X    }
X  
X  newwindow = (struct NewWindow *)
X    (*functions->DupeNewWindow)(&TMNewWindowStructure1);
X  if (!newwindow)
X    {
X      return;
X    }
X  newwindow->Title = 0;
X  newwindow->Flags |= BORDERLESS;
X  newwindow->Flags &= ~0xF;
X  newwindow->BlockPen = 0;
X  newwindow->DetailPen = 0;
X
X  window = (struct Window *) (*functions->FlashyOpenWindow)(newwindow);
X  if (window == NULL)
X    {
X      return;
X    }
X  
X  tool->tool.window = window;
X
X  /* Make the various gadgets look pretty. */
X  (*functions->EmbossWindowOn)(window,WINDOWCLOSE|WINDOWDEPTH|WINDOWDRAG,
X                              TM_NAME, (short)-1, (short)-1, 0, 0);
X
X  display_lines(tool);
X
X  /* Process messages until a CLOSEWINDOW. */
X  for (;;)
X    {
X      message = (struct IntuiMessage *) (*functions->GetIntuiMessage)(window);
X      class = message->Class;
X      code = message->Code;
X      gadget = (struct Gadget *) message->IAddress;
X      class = (*functions->SystemGadgets)(window,class,gadget,code);
X
X      ReplyMsg((struct Message *)message);
X      
X      if (class == CLOSEWINDOW)
X       {
X         break;        /* ... out of the for(;;) loop. */
X       }
X      else if (class == GADGETDOWN)
X       {
X         /* Nothing. */
X       }
X      else if (class == GADGETUP)
X       {
X         /* Nothing. */
X       }
X    }
X  tool->tool.window = 0;
X  tool->tool.left = window->LeftEdge;
X  tool->tool.top = window->TopEdge;
X  tool->tool.width = window->Width;
X  tool->tool.height = window->Height;
X  tool->tool.touched = TOUCH_INIT | TOUCH_EDIT;
X
X  (*functions->EmbossWindowOff)(window);
X  (*functions->FlashyCloseWindow)(window);
X  (*functions->DeleteNewWindow)(newwindow);
}

X
/* Make sure we remove the transport routine. */
__geta4         /* Callback. */
void removetool()
{
X  (*functions->removetransport)(transportcode);
}

X
struct ToolMaster *
X  inittoolmaster()
{
X  memset((char *)&master,0,sizeof(struct ToolMaster));
X  master.toolid = TM_ID;
X  master.image = &tm_image;
X  strcpy(master.name, TM_NAME);
X  master.edittool = (void_prototype) edittoolcode;
X  master.processevent = (event_prototype) processeventcode;
X  master.tooltype = TM_TYPE;
X  master.removetool = removetool;
X  master.toolsize = sizeof(struct TMTool);
X  (*functions->installtransport)(transportcode);
X  return(&master);
}

SHAR_EOF
chmod 0600 tm.c ||
echo 'restore of tm.c failed'
Wc_c="`wc -c < 'tm.c'`"
test 8469 -eq "$Wc_c" ||
        echo 'tm.c: original size 8469, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= tm.ptool ==============
if test -f 'tm.ptool' -a X"$1" != X"-c"; then
        echo 'x - skipping tm.ptool (File already exists)'
        rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp

echo 'x - extracting tm.ptool (Binary)'
sed 's/^X//' << 'SHAR_EOF' > _shar_tmp_.tmp &&
begin 600 tm.ptool
<encoded_portion_removed>
end
SHAR_EOF
echo 'uudecoding file tm.ptool' &&
uudecode < _shar_tmp_.tmp && rm -f _shar_tmp_.tmp &&
chmod 0600 tm.ptool ||
echo 'restore of tm.ptool failed'
Wc_c="`wc -c < 'tm.ptool'`"
test 2356 -eq "$Wc_c" ||
        echo 'tm.ptool: original size 2356, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= tm.readme ==============
if test -f 'tm.readme' -a X"$1" != X"-c"; then
        echo 'x - skipping tm.readme (File already exists)'
        rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp

echo 'x - extracting tm.readme (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'tm.readme' &&
Short:        Bars & Pipes Transport Monitor Tool
Author:       Richard Hagen (R.Ha...@mailbox.uq.edu.au)
Uploader:     Richard Hagen (R.Ha...@mailbox.uq.edu.au)
Version:      1.2 (22 September 1997)
Type:         mus/midi
Requires:     Bars and Pipes Professional
Distribution: Freely distributable by anyone, anywhere.
URL:          http://www.it.uq.edu.au/~richard/music/bars-and-pipes/index.html
X
TM: A Bars and Pipes Transport Monitor
X
Version: 1.2 (22 September 1997)
X
Author: Richard Hagen
X       R.Ha...@mailbox.uq.edu.au
X
Distribution: Freeware. See the copyright notice in tm.c.
X
Requirements for running:
X       Bars and Pipes Professional
X
Requirements for recompiling:
X       DICE (or some other C compiler)
X       bars.h and toolstart.c from the Rules for Tools package.
X      
Usage:
X       TM is a normal tool. It can't be used as a padtool.
X
X       Place it in a track. Open TM's window, then watch
X       the commands stream by as you play with the transport!
X
Useful for:
X       Finding out what sort of commands are being issued by the
X       Bars and Pipes transport. Which I guess means that it's
X       only useful for people who write their own tools.
X
History:
X       1.2 (22 September 1997)
X       Made it a normal tool.
X
X       1.1 (15 September 1997)
X       Improved efficiency of the code.
X
X       1.0 (13 September 1997)
X        Initial release.
X
If you like this tool, please drop me a line.
X
richard
R.Ha...@mailbox.uq.edu.au
22 September 1997
X
X
SHAR_EOF
chmod 0600 tm.readme ||
echo 'restore of tm.readme failed'
Wc_c="`wc -c < 'tm.readme'`"
test 1386 -eq "$Wc_c" ||
        echo 'tm.readme: original size 1386, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
exit 0
--
Bill Zimmer - z...@ibx.com

 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
End of messages
« Back to Discussions « Newer topic     Older topic »