To save content items to your account,
please confirm that you agree to abide by our usage policies.
If this is the first time you use this feature, you will be asked to authorise Cambridge Core to connect with your account.
Find out more about saving content to .
To save content items to your Kindle, first ensure no-reply@cambridge.org
is added to your Approved Personal Document E-mail List under your Personal Document Settings
on the Manage Your Content and Devices page of your Amazon account. Then enter the ‘name’ part
of your Kindle email address below.
Find out more about saving to your Kindle.
Note you can select to save to either the @free.kindle.com or @kindle.com variations.
‘@free.kindle.com’ emails are free but can only be saved to your device when it is connected to wi-fi.
‘@kindle.com’ emails can be delivered even when you are not connected to wi-fi, but note that service fees apply.
Computer languages, like natural languages, evolve. For regulated languages, changes are consolidated into distinct versions at well-defined points in time. For Ada, the main versions have been Ada 83, Ada 95 and now Ada 2005. Whereas Ada 95 was a significantly different language from its ancestor, Ada 2005 is more an upgrade. It brings Ada up to date with respect to current practice in other languages, operating systems and theory – especially in the real-time domain.
Although Ada is a general purpose programming language, much of its development has been driven by the requirements of particular application areas. Specifically, the needs of high-integrity and safety-critical systems, real-time systems, embedded systems and large complex long-life systems. To support this wide range of applications, Ada has a large number of language features and primitives that can be grouped into the following:
strong typing with safe pointer operations,
object-oriented programming support via tagged types and interfaces,
hierarchical libraries and separate compilation,
exception handling,
annexes to give support to particular application domains,
low-level programming features that enable device drivers and interrupt handlers to be written,
an expressive concurrency model and
an extensive collection of entities that support real-time systems programming.
This book has concentrated on the last three items in this list to provide a comprehensive description of real-time and concurrent programming. These are two of the unquestionable strengths of the Ada language.
The models of synchronisation discussed in the previous four chapters have the common feature that they are based on avoidance synchronisation. Guards or barriers are used to prevent rendezvous and task-protected object interactions when the conditions are not appropriate for the communications event to start. Indeed, one of the key features of the tasking model is the consistent use of avoidance to control synchronisation. The use of guards and barriers represents a high-level abstract means of expressing and enforcing necessary synchronisations; and as such they can be compared favourably with the use of low-level primitives such as semaphores or monitor signals (see Chapter 3). This chapter starts by giving a more systematic assessment of avoidance synchronisation in order to motivate the requirement for ‘requeue’. It then describes the syntax and semantics of the requeue statement and gives examples of its use.
The need for requeue
Different language features are often compared in terms of their expressive power and ease of use (usability). Expressive power is the more objective criterion, and is concerned with the ability of language features to allow application requirements to be programmed directly. Ease of use is more subjective, and includes the ease with which the features under investigation interact with each other and with other language primitives.
In her evaluation of synchronisation primitives, Bloom (1979) used the following criteria to evaluate and compare the expressive power and usability of different language models.
The last few chapters have demonstrated the extensive set of facilities that Ada 2005 provides for the support of real-time programming. The expressive power of the full language is clearly more comprehensive than any other mainstream engineering language. There are, however, situations in which a restricted set of features are desirable. This chapter looks at ways in which certain restrictions can be identified in an Ada program. It then describes in detail the Ravenscar profile, which is a collection of restrictions aimed at applications that require very efficient implementations, or have high-integrity requirements, or both. This chapter also includes a discussion of the metrics identified in the Real-Time Systems Annex.
Restricted tasking and other language features
Where it is necessary to produce very efficient programs, it is useful to have runtime systems (kernels) that are tailored to the particular needs of the program actually executing. As this would be impossible to do in general, the Ada language defines a set of restrictions that a run-time system should recognise and ‘reward’ by giving more effective support. The following restrictions are identified by the pragma called Restrictions, and are checked and enforced before run-time. Note however, that there is no requirement on the run-time to tailor itself to the restrictions specified.
The major difficulties associated with concurrent programming arise from process interaction. Rarely are processes as independent of one another as they were in the simple example of the previous chapter. One of the main objectives of embedded systems design is to specify those activities that should be represented as processes (that is, active entities and servers), and those that are more accurately represented as protected entities (that is, resources). It is also critically important to indicate the nature of the interfaces between these concurrent objects. This chapter reviews several historically significant inter-process communication primitives: shared variables, semaphores, monitors and message passing. Before considering language primitives, however, it is necessary to discuss the inherent properties of inter-process communication. This discussion will be structured using the following headings:
Data communication;
Synchronisation;
Deadlocks and indefinite postponements;
System performance, correctness and reliability.
These are the themes that have influenced the design of the Ada tasking model.
As this model directly represents active and protected entities, there are two main forms of communication between active tasks:
direct – task-to-task communication;
indirect – communication via a protected resource.
Both these models are appropriate in Ada programs. In the following sections, however, we start by considering the problems of communicating indirectly by the use of only passive entities.
Data communication
The partitioning of a system into tasks invariably leads to the requirement that these tasks exchange data in order for the system to function correctly. For example, a device driver (a process with sole control over an external device) needs to receive requests from other processes and return data if appropriate.
It has been mentioned several times already in this book that real-time programming represents a major application area for Ada, and particularly for Ada tasking. The Real-Time Systems Annex specifies additional characteristics of the language that facilitate the programming of embedded and real-time systems. If an implementation supports the Real-Time Systems Annex then it must also support the Systems Programming Annex (see previous chapter). All issues discussed in the Real-Time Systems Annex affect the tasking facilities of the language. They can be grouped together into the following topics.
Time and clocks – introduced in Chapter 1.
Scheduling – how to allocate system resources, in particular the processor.
Resource control – how to monitor and manage the use of the processor by individual tasks or groups of tasks.
Optimisations and restrictions – specifically the Ravenscar profile.
All of these topics are discussed in this and the next two chapters; starting with the important issue of scheduling.
Scheduling
The functional correctness of a concurrent program should not depend on the exact order in which tasks are executed. It may be necessary to prove that the non-determinism of such programs cannot lead to deadlock or livelock (that is, progress is always taking place), but it is not necessary to program the order in which all actions must occur explicitly.
Designing, implementing and maintaining software for large systems is a non-trivial exercise and one which is fraught with difficulties. These difficulties relate to the management of the software production process itself, as well as to the size and complexity of the software components. Ada is a mature general-purpose programming language that has been designed to address the needs of large-scale system development, especially in the embedded systems domain. A major aspect of the language, and the one that is described comprehensively in this book, is its support for concurrent and real-time programming.
Ada has evolved over the last thirty years from an object-based concurrent programming language into a flexible concurrent and distributed object-oriented language that is well suited for high-reliability, long-lived applications. It has been particularly successful in high-integrity areas such as air traffic control, space systems, railway signalling, and both the civil and military avionics domains. Ada success is due to a number of factors including the following.
Hierarchical libraries and other facilities that support large-scale software development.
Strong compile-time type checking.
Safe object-oriented programming facilities.
Language-level support for concurrent programming.
A coherent approach to real-time systems development.
High-performance implementations.
Well-defined subsetting mechanisms, and in particular the SPARK subset for formal verification.
The development and standardisation of Ada have progressed through a number of definitions, the main ones being Ada 83 and Ada 95. Ada 2005 now builds on this success and introduces a relatively small number of language changes to provide:
Better support for multiple inheritance through the addition of Java-like interfaces.
Better support for OO style of programming by use of the Object.Operator notation.
The challenges of understanding musical meaning are considered in light of ways in which electroacoustic practice and acousmatic listening might embody yet further nuances in how music can function as a signifying system. ‘Classical’ semiotics is discussed, as well as more recent developments with post-structuralist approaches and musical semantics in other areas of music scholarship. The idea, inherited from the tradition of ‘absolute music’, that musical meaning lies exclusively in the inner operations of the musical materials and their structural organisation, is questioned. Concepts from ecologically inspired music psychology are drawn upon to highlight the importance of interpretation, as well as perception, in acousmatic listening. It is argued that if new theoretical terminologies are needed, an invaluable project would be to develop a taxonomy (and thus theoretical framework) of how sound can ‘stand for something’, i.e. function as a sign in semiotic terms. It is also argued that such terminology should not reinforce distinctions between intra- and extra-musical that feature in many theoretical constructs used in relation to this music. Consideration of the Peircean semiotic model in electroacoustic music (as well as the more widely used Saussurean one), tropology in the study of literature, and a much more widely comparative and culturally explicit approach to analysis are suggested as practical starting points. A more critical approach to the integral role of sound recording and reproduction in relation to concepts of representation is needed.
The views of categorisation presented in this paper along with my own are for the purpose of providing background for current taxonomic projects related to electroacoustic music (e.g. EARS: ElectroAcoustic Resource Site). The views might be summarised as top-down (ontology) as described in Peterson, bottom-up (folksonomy) as described in Shirkey and Weinberger, and a view from the middle ground (TagOntology) as described in Gruber. Semantic Wikipedia enters this discourse in relation to what one might call folk-ontology. It is crucial to conduct experimentation with minimal specifications and practical methodologies in order to facilitate the interoperability of dynamic, emergent knowledge bases within the Semantic Web context.
In 2005, the Princeton Laptop Orchestra (PLOrk), an ensemble of fifteen laptop-based meta-instruments, began its first season. In this article, the author explores the motivations for starting a laptop orchestra, both in musical and cultural terms, and some of the aesthetic, technical, and compositional issues that face those interested in working with such an ensemble.
Interactive electroacoustic music that alters or extends instrumental timbre, samples it, or generates sound based upon data generated in real time by the performer presents a new set of challenges for the performing musician. Unlike tape music, interactive music can continuously vary its response and, frequently, performers are unable are to predict how the computer will react. Many, if not most, scores include no visual representation of how the computer may affect the sound of the instrument.
Providing performers with a readily accessible visual representation of the sonic possibilities of interactive computer music will provide a conceptual framework within which performers can understand a piece of music. Interpretation of this type of notation by the performer will provide a perspective on how his or her acoustic instrument relates to the digital instrument. This can be especially useful when improvised or aleatoric methods are called for.
This paper outlines a system of interactive computer-music descriptive notation that links pictographic representations to the system of spectromorphologies suggested by Dennis Smalley. The morphological notation (MN) uses these morphologies and adds a z-plane to the well-established time-vs-pitch schema. Ideally, MN will not only represent the sound data of the moment, but also will be an intuitive picture of the musical possibilities of a composition's electronic component.
The last fifty years has witnessed an enormous development with regard to sound production, and has opened a new world of novel aural experiences. In order to be able to articulate and discuss these experiences there is a need for a corresponding novel set of terms and concepts. Such a terminology would also be relevant for analytical and interpretive approaches to electroacoustic music, avant-garde Western music, and ethno music. Pierre Schaeffer's typomorphology, developed in the 1960s, proposed a variety of novel terms, but they have not been of widespread use, since they unfortunately did not lend themselves very well for practical analysis. The present paper intends to develop Schaeffer's approach in the direction of a practical tool for conceptualising and notating sound quality. While carefully reducing the sometimes-bewildering number of terms found in Schaeffer's work, it introduces a set of graphic symbols apt for transcribing electroacoustic music in a concise score. The analysis of sound objects calls for a specific listeners' intention, called reductive listening.