2012-01-01 VI Minimalist Extension to generate musical notes on windows. I compiled this under mingw using:
gcc -Id:/tools/tcl/8.6b2/include beep.c -shared -o beep.dll -Ld:/tools/tcl/8.6b2/lib/ -ltclstub86
Example Usage:
load beep.dll beep 440 1000 ;# Generate the A4 (middle note) for 1 second
2012-01-02 VI Changed parameter 1 to be an integer since that's what windows accepts.
/* beep.c Minimalist sound generation interface for windows. Beep is *NOT* in the background. Author: Venkat Iyer <[email protected]>. License: BSD 2-Clause. */ #define USE_TCL_STUBS #include <windows.h> #include "tcl.h" static int beepCmd (dummy, interp, objc, objv) ClientData dummy; Tcl_Interp *interp; int objc; Tcl_Obj *CONST objv[]; { int freq; int duration; if (objc != 3) { Tcl_WrongNumArgs(interp, 1, objv, "freq duration(ms)"); return TCL_ERROR; } if (Tcl_GetIntFromObj(interp, objv[1], &freq) != TCL_OK) return TCL_ERROR; if (Tcl_GetIntFromObj(interp, objv[2], &duration) != TCL_OK) return TCL_ERROR; Beep(freq,duration); return TCL_OK; } int Beep_Init (interp) Tcl_Interp *interp; { if (Tcl_InitStubs(interp, "8.4", 0) == NULL) { return TCL_ERROR; } if (Tcl_PkgRequire(interp, "Tcl", "8.4", 0) == NULL) { return TCL_ERROR; } if (Tcl_PkgProvide(interp, "beep", "0.7.5") == TCL_ERROR) { return TCL_ERROR; } Tcl_CreateObjCommand(interp, "beep", beepCmd, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); return TCL_OK; }
DKF: With critcl, you'd write it like this:
package provide beep 0.7.5 package require critcl critcl::ccode { #include <windows.h> } critcl::cproc beep {int freq int duration} void { Beep(freq, duration); }